使用mmyolo快速搭建yolo网络

CGC Lv4

说明:
此为根据实践搭建并从官方文档中整理而来,官方源码及文档如下
官方开源项目源码
官方使用文档

环境搭建

使用conda创建新环境并安装pytorch

1
2
3
4
5
6
conda create -n mmyolo python=3.8 -y
conda activate mmyolo
# 如果你有 GPU
conda install pytorch torchvision -c pytorch
# 如果你是 CPU
# conda install pytorch torchvision cpuonly -c pytorch

安装 MMYOLO 和依赖库

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/open-mmlab/mmyolo.git
cd mmyolo
pip install -U openmim
mim install -r requirements/mminstall.txt
# Install albumentations
mim install -r requirements/albu.txt
# Install MMYOLO
mim install -v -e .
# "-v" 指详细说明,或更多的输出
# "-e" 表示在可编辑模式下安装项目,因此对代码所做的任何本地修改都会生效,从而无需重新安装。

准备数据集

此处数据集为官方文档中演示所用的Cat 数据集,为包括144张图片的单类别数据集
在上一步中克隆的mmyolo源码中,使用如下命令即可自动下载目标数据集

1
python tools/misc/download_dataset.py --dataset-name cat --save-dir ./data/cat --unzip --delete

data/cat/annotations 中存放的是 COCO 格式的标注,data/cat/images 中存放的是所有图片

文件配置

官方源码中已经为我们提供了yolov5等的配置文件,位于configs中,我们只需要继承这些配置文件,并按照需求进行相应修改即可
官方所给的配置案例为

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_ = './configs/yolov5/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)

可以直接复制使用,也可以进行进一步修改

其中 _base_ = 'yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' 修改所继承的配置文件,从 configs 中选取

将如上继承后的文件另行保存至任意位置即可(需记下路径)

模型训练

训练

在命令行中使用指令运行如

1
python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py

tools/train.py 为训练脚本
configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py 为上一步中所说的配置文件,可直接使用官方所给,也可以使用自己所集成修改的,将此参数改为上一步中继承后的文件的路径即可

运行以上训练命令 work_dirs/yolov5_s-v61_fast_1xb12-40e_cat 文件夹会被自动生成,权重文件以及此次的训练配置文件将会保存在此文件夹中。

注意事项

在训练过程中会打印如下两个关键警告:

1
2
You are using YOLOv5Head with num_classes == 1. The loss_cls will be 0. This is a normal phenomenon.\
The model and loaded state dict do not match exactly

这两个警告都不会对性能有任何影响。第一个警告是说明由于当前训练的类别数是 1,根据 YOLOv5 算法的社区, 分类分支的 loss 始终是 0,这是正常现象。第二个警告是因为目前是采用微调模式进行训练,我们加载了 COCO 80 个类的预训练权重, 这会导致最后的 Head 模块卷积通道数不对应,从而导致这部分权重无法加载,这也是正常现象。

训练中断后恢复训练

如果训练中途停止,可以在训练命令最后加上 --resume ,程序会自动从 work_dirs 中加载最新的权重文件恢复训练。
例如

1
python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --resume

节约显存策略

如果显存不够,可以考虑开启混合精度训练--amp

1
python tools/train.py configs/yolov5/yolov5_s-v61_fast_1xb12-40e_cat.py --amp

训练可视化

官方文档中展示了多种可视化方案,在此处我们使用tensorboard
在先前我们已经配置好的配置文件中的最后加入

1
visualizer = dict(vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')])

重新运行训练命令后,Tensorboard 文件会生成在可视化文件夹 work_dirs/yolov5_s-v61_fast_1xb12-40e_cat.py/{timestamp}/vis_data 下, 运行下面的命令便可以在网页链接使用 Tensorboard 查看 loss、学习率和 coco/bbox_mAP 等可视化数据了:

1
tensorboard --logdir=work_dirs/yolov5_s-v61_fast_1xb12-40e_cat.py

其中最后一个.py文件参数为配置文件

模型测试及预测

模型测试

运行如下

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

两个文件参数分别为配置文件、权重文件

运行以上测试命令, 不仅可以得到模型训练部分所打印的 AP 性能,还可以将推理结果图片自动保存至 work_dirs/yolov5_s-v61_fast_1xb12-40e_cat/{timestamp}/show_results 文件夹中。

如果使用了 WandbVisBackend 或者 TensorboardVisBackend,则还可以在浏览器窗口可视化模型推理结果。

  • Title: 使用mmyolo快速搭建yolo网络
  • Author: CGC
  • Created at: 2023-03-26 14:43:05
  • Updated at: 2023-07-09 20:06:42
  • Link: https://redefine.ohevan.com/2023/03/26/使用mmyolo快速搭建yolo网络/
  • License: This work is licensed under CC BY-NC-SA 4.0.