15 分钟上手 MMYOLO 目标检测 - Windows10平台 - 2023-03最新版

操作步骤

  1. 进入安装好的conda虚拟环境

    1
    2
    3
    conda activate mmyolo
    D:
    cd D:\yolo
  2. 下载mmyolo代码,安装依赖,下载数据集

    1
    2
    3
    4
    git clone https://github.com/open-mmlab/mmyolo.git 202303-mmyolo
    mim install -r requirements/albu.txt
    cd 202303-mmyolo
    python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete

    下载后的数据集存放于202303-mmyolo目录下的【data/cat/images】

  3. 使用优化后的配置设定
    在configs/yolov5 文件夹下新建 yolov5_s-v61_fast_1xb12-40e_cat-202303.py,代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    # 基于该配置进行继承并重写部分配置
    _base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py'

    data_root = './data/cat/' # 数据集根路径
    class_name = ('cat', ) # 数据集类别名称
    num_classes = len(class_name) # 数据集类别数
    # metainfo 必须要传给后面的 dataloader 配置,否则无效
    # palette 是可视化时候对应类别的显示颜色
    # palette 长度必须大于或等于 classes 长度
    metainfo = dict(classes=class_name, palette=[(20, 220, 60)])

    # 基于 tools/analysis_tools/optimize_anchors.py 自适应计算的 anchor
    anchors = [
    [(68, 69), (154, 91), (143, 162)], # P3/8
    [(242, 160), (189, 287), (391, 207)], # P4/16
    [(353, 337), (539, 341), (443, 432)] # P5/32
    ]
    # 最大训练 40 epoch
    max_epochs = 40
    # bs 为 12
    train_batch_size_per_gpu = 12
    # dataloader 加载进程数
    train_num_workers = 4

    # 加载 COCO 预训练权重
    load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth' # noqa

    model = dict(
    # 固定整个 backbone 权重,不进行训练
    backbone=dict(frozen_stages=4),
    bbox_head=dict(
    head_module=dict(num_classes=num_classes),
    prior_generator=dict(base_sizes=anchors)
    ))

    train_dataloader = dict(
    batch_size=train_batch_size_per_gpu,
    num_workers=train_num_workers,
    dataset=dict(
    data_root=data_root,
    metainfo=metainfo,
    # 数据集标注文件 json 路径
    ann_file='annotations/trainval.json',
    # 数据集前缀
    data_prefix=dict(img='images/')))

    val_dataloader = dict(
    dataset=dict(
    metainfo=metainfo,
    data_root=data_root,
    ann_file='annotations/test.json',
    data_prefix=dict(img='images/')))

    test_dataloader = val_dataloader

    _base_.optim_wrapper.optimizer.batch_size_per_gpu = train_batch_size_per_gpu

    val_evaluator = dict(ann_file=data_root + 'annotations/test.json')
    test_evaluator = val_evaluator

    default_hooks = dict(
    # 每隔 10 个 epoch 保存一次权重,并且最多保存 2 个权重
    # 模型评估时候自动保存最佳模型
    checkpoint=dict(interval=10, max_keep_ckpts=2, save_best='auto'),
    # warmup_mim_iter 参数非常关键,因为 cat 数据集非常小,默认的最小 warmup_mim_iter 是 1000,导致训练过程学习率偏小
    param_scheduler=dict(max_epochs=max_epochs, warmup_mim_iter=10),
    # 日志打印间隔为 5
    logger=dict(type='LoggerHook', interval=5))
    # 评估间隔为 10
    train_cfg = dict(max_epochs=max_epochs, val_interval=10)
  4. 模型训练

    1
    2
    3
    python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat-202303.py
    中间可以 Ctrl + C 中断,需要恢复的话使用如下命令
    python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat-202303.py --resume

日志最后部分如下
03/21 22:26:43 - mmengine - INFO - Epoch(val) [40][25/28] eta: 0:00:00 time: 0.1056 data_time: 0.0502 memory: 117
03/21 22:26:43 - mmengine - INFO - Evaluating bbox…
Loading and preparing results…
DONE (t=0.01s)
creating index…
index created!
Running per image evaluation…
Evaluate annotation type bbox
DONE (t=0.16s).
Accumulating evaluation results…
DONE (t=0.02s).
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.002
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.083
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.083
03/21 22:26:44 - mmengine - INFO - bbox_mAP_copypaste: 0.000 0.002 0.000 -1.000 -1.000 0.000
03/21 22:26:45 - mmengine - INFO - Epoch(val) [40][28/28] coco/bbox_mAP: 0.0000 coco/bbox_mAP_50: 0.0020 coco/bbox_mAP_75: 0.0000 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.0000data_time: 0.0532 time: 0.1111

  1. 用训练完的参数进行测试

    1
    python tools/test.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat-202303.py work_dirs/yolov5_s-v61_fast_1xb12-40e_cat-202303/epoch_40.pth --show-dir show_results

    日志最后部分如下
    03/21 23:00:05 - mmengine - INFO - bbox_mAP_copypaste: 0.733 0.957 0.835 -1.000 -1.000 0.733
    03/21 23:00:05 - mmengine - INFO - Epoch(test) [28/28] coco/bbox_mAP: 0.7330 coco/bbox_mAP_50: 0.9570 coco/bbox_mAP_75: 0.8350 coco/bbox_mAP_s: -1.0000 coco/bbox_mAP_m: -1.0000 coco/bbox_mAP_l: 0.7330data_time: 2.8175 time: 3.1257
    wandb: Waiting for W&B process to finish… (success).
    wandb: View run light-snow-2 at: https://wandb.ai/zhangna-jp/202303-mmyolo-tools/runs/xh6coxf4
    wandb: Synced 6 W&B file(s), 0 media file(s), 351 artifact file(s) and 0 other file(s)
    wandb: Find logs at: .\work_dirs\yolov5_s-v61_fast_1xb12-40e_cat-202303\20230321_225807\vis_data\wandb\run-20230321_225820-xh6coxf4\logs

  2. 测试结果展示

参考文档:https://mmyolo.readthedocs.io/zh_CN/latest/get_started/15_minutes_object_detection.html