操作步骤
进入安装好的conda虚拟环境
1
2
3conda activate mmyolo
D:
cd D:\yolo下载mmyolo代码,安装依赖,下载数据集
1
2
3
4git 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】
使用优化后的配置设定
在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)模型训练
1
2
3python 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
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测试结果展示
参考文档:https://mmyolo.readthedocs.io/zh_CN/latest/get_started/15_minutes_object_detection.html