MMDetection是MMLab家族的一员,是由香港中文大学和商汤科技共同推出的,以一个统一的架构支撑了15个大方向的研究领域,实现了1300+的算法复现工作。MMDetection依赖Pytorch和MMCV(mmcv/mmcv-full),因此安装之前需要先安装这两个库,具体安装步骤可参考这篇博客:MMDetection框架入门教程(一):Anaconda3下的安装教程(mmdet+mmdet3d)。
conda create -n mmdet python=3.8
conda activate mmdet
nvidia-smi
确定服务器中CUDA的版本conda install pytorch==1.9.1 torchvision torchaudio cudatoolkit=10.2 -c pytorch
安装对应版本的torchtorch.cuda.is_available
验证torch是否安装成功mmdetection/
新建checkpoints
文件夹,下载faster-rcnn的预训练模型权重到该文件夹下mmdetection/
新建test_demo.py
文件,输入以下代码,然后运行# 测试mmdet、mmcv是否安装成功
from mmdet.apis import init_detector, inference_detector, show_result_pyplot
import torch
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = init_detector(config_file, checkpoint_file, device=device)
img = 'demo/demo.jpg'
result = inference_detector(model, img)
print(len(result))
show_result_pyplot(model=model, img=img, result=result, score_thr=0.9)
若安装成功,则运行结果如下图所示
本文所使用的数据集为三种水果数据集,下载链接为:https://download.csdn.net/download/weixin_43799388/84425688。在mmdetection/
新建data
文件夹,将数据集解压后放到这里。
数据集文档结构如下:
|——-Fruit
|---Annotations
|---001.xml
|---002.xml
... ...
|---340.xml
|---images
|---001.jpg
|---002.jpg
... ...
|---340.jpg
MMDetection一共支持三种形式应用新数据集:
官方建议使用前面两种方法,因为它们通常来说比第三种方法要简单。
该数据集的标注形式为xml格式,其中GT框的坐标信息是以左上角坐标(xmin, ymin)和右下角坐标(xmax, ymax)形式来标注的,这里我们采用MMDetection建议的第一种方法,将数据集重新组织为 COCO 格式,具体转换步骤可以参考我写的另一篇博客:VOC(xml)标注格式转换为YOLOv5(txt)和COCO2017(json)格式。
转换结果的文档结构如下所示,我们真正用到的是annotations、train和val这三个文件夹。
|——-Fruit
|---annotations
|---Fruit_train.json
|---Fruit_val.json
|---Annotations
|---001.xml
|---002.xml
... ...
|---340.xml
|---images
|---001.jpg
|---002.jpg
... ...
|---340.jpg
|---ImageSets
|---train.txt # 存放训练集图片名称
|---val.txt # 存放验证集图片名称
|---train
|---001.jpg
|---002.jpg
... ...
|---val
|---046.jpg
|---049.jpg
... ...
configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py
虽然我们已经将xml格式标注的数据集转换成了MMDetection使用的COCO数据集格式,但还需要修改一些配置参数(官方建议直接修改coco数据集定义文件):
configs/_base_/models/faster_rcnn_r50_fpn.py
roi_head
字典出,修改bbox_head
字典中的num_classes
为3mmdet/datasets/coco.py
CLASSES
那里的参数修改为:CLASSES = ('apple', 'banana', 'grape')
PALETTE
参数随意选三个留下即可,例如:PALETTE = [(220, 20, 60), (119, 11, 32), (191, 162, 208)]
,这个参数用来指定每个类别框的显示颜色mmdet/core/evaluation/class_names.py
coco_classes
函数,修改return
中的参数为:'apple', 'banana', 'grape'
mmdetection
目录下新建test_work_dirs
文件夹
此外,在configs/_base_/default_runtime.py
文件中可以修改训练时的其他参数,本次训练的default_runtime.py
代码如下:
# 保存checkpoints的间隔 默认每次都保存
checkpoint_config = dict(interval=4)
# yapf:disable 打印log的间隔(每个epoch中) 默认迭代50次打印一次(datasets的大小除以batchsize)
log_config = dict(
interval=5,
hooks=[
dict(type='TextLoggerHook'),
# dict(type='TensorboardLoggerHook')
])
# yapf:enable
custom_hooks = [dict(type='NumClassCheckHook')]
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None # 加载参数
# 断点续训 重新加载已训练好的checkpoints 包含epoch等信息 会覆盖load_form
resume_from = None
# 工作流
workflow = [('train', 1)]
# disable opencv multithreading to avoid system being overloaded
opencv_num_threads = 0
# set multi-process start method as `fork` to speed up the training
mp_start_method = 'fork'
python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py --gpus 1 --work-dir test_work_dirs
CUDA_VISIBLE_DEVICES=2,3
指定使用GPU-3和GPU-4,放到python命令之前,同时要设置--gpus 2
CUDA_VISIBLE_DEVICES=2,3 python tools/train.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py --gpus 2 --work-dir xiaolong_dir0
训练过程界面如下:
训练完之后test_work_dirs文件夹中会保存下训练过程中的log日志文件、每4个epoch的pth文件(因为在default_runtime.py
设置了checkpoint_config = dict(interval=4)
),这个文件将会用于后面的test测试。
python tools/test.py test_work_dirs/faster_rcnn_r50_fpn_1x_coco.py test_work_dirs/epoch_12.pth --eval bbox --out test_work_dirs/result12.pkl --show
传递参数说明:
config
:模型训练的配置文件checkpoint
:训练结果的权重文件--eval
:验证指标,一般使用bbox--out
:测试结果文件保存的路径及名称--show
:展示每一张验证集图片的测试结果测试结果如下:
python tools/analysis_tools/analyze_logs.py plot_curve test_work_dirs/20220312_094204.log.json --keys acc loss_cls loss_bbox
将训练结果20220312_094204.log.json
中的参数acc、loss_cls
和loss_bbox
进行可视化,结果如下(由于数据集太小,并且只有3个class,因此训练很快就收敛了):
DetVisGUI工具是一个用于可视化MMDetection测试结果的轻量级GUI,它可以动态显示不同阈值的检测结果,便于验证检测结果和GT框的差异。
在使用DetVisGUI工具之前,需要利用python tools/test.py
命令,保存测试的结果文件(pkl格式或者json格式)
之后从GitHub上下载DetVisGUI源码,放在mmdetection/DetVisGUI/
文件夹中,运行DetDetVisGUI的命令格式是:
python DetVisGUI/DetVisGUI.py ${CONFIG_FILE} [--det_file ${RESULT_FILE}] [--stage ${STAGE}] [--output ${SAVE_DIRECTORY}]
传递参数说明:
config
:模型训练的配置文件--det_file
:测试结果文件(pkl格式或json格式)--stage
:测试结果文件的三种stage(train/val/test),默认为val--output
:测试图片的保存路径,默认为output运行如下命令:
python DetVisGUI/DetVisGUI.py test_work_dirs/faster_rcnn_r50_fpn_1x_coco.py --det_file test_work_dirs/result12.pkl --output test_work_dirs/val_result
运行结果如下图所示,可以调节IOU阈值、置信度阈值、是否显示GT框及文本信息等,来对比测试结果。
点击左上角的Save All Results
按钮,即可将全部验证集图片的测试结果保存到指定路径中。
首先来科普一下FLOPs和FLOPS的区别:
在MMDetection中可以使用tools/analysis_tools/get_flops.py
命令来获取模型的复杂度:
python tools/analysis_tools/get_flops.py test_work_dirs/faster_rcnn_r50_fpn_1x_coco.py
运行结果如下所示,可以看到get_flops.py
函数会打印出模型每一层的FLOPs和参数量,以及总的FLOPs和参数量。
但要注意的是,这些数据仅供参考,不一定准确,输出结果的最后一行也提醒我们,不建议把这个输出结果放到论文中。
MMDetection框架入门教程(一):Anaconda3下的安装教程(mmdet+mmdet3d)
官方教程:MMDETECTION’S DOCUMENTATION!
VOC(xml)标注格式转换为YOLOv5(txt)和COCO2017(json)格式
【mmdetection】使用自定义的coco格式数据集进行训练及测试
mmdetection可视化工具-DetVisGUI