文章目录
1. 简介
M M D e t e c t i o n {\rm MMDetection} MMDetection是一个基于 P y T o r c h {\rm PyTorch} PyTorch的目标检测库,由商汤科技和香港中文大学维护。截止目前, M M D e t e c t i o n {\rm MMDetection} MMDetection已经发行第二个版本。相比于第一个版本,第二个版本将各模块整合,整个项目显得更加具有结构性。最近在阅读多篇 C V P R 2020 {\rm CVPR\ 2020} CVPR 2020论文时遇到源码都是基于 M M D e t e c t i o n {\rm MMDetection} MMDetection实现的,所以打算系统地学习一下整个开源的目标检测库。本文将主要介绍 M M D e t e c t i o n {\rm MMDetection} MMDetection第二版的安装流程以及简单地测试官方给出的模型库里的模型。最后,本机的环境是 C U D A 10.1 {\rm CUDA10.1} CUDA10.1、 P y T o r c h 1.5 {\rm PyTorch1.5} PyTorch1.5、 G C C 5.3.0 {\rm GCC5.3.0} GCC5.3.0、 P y t h o n 3.7.7 {\rm Python3.7.7} Python3.7.7, U b u n t u 16.04 {\rm Ubuntu16.04} Ubuntu16.04。
2. 安装相关环境
2.1 安装虚拟环境
本人是使用
A
n
a
c
o
n
d
a
{\rm Anaconda}
Anaconda管理虚拟环境,首先使用以下命令创建虚拟环境:conda create -n mmdetection python=3.7 -y
。然后激活环境:source activate mmdetection
。接着使用以下命令安装
P
y
T
o
r
c
h
{\rm PyTorch}
PyTorch:pip install torch==1.5.0+cu101 torchvision==0.6.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
。
2.2 安装mmcv
m
m
c
v
{\rm mmcv}
mmcv是在发布
M
M
D
e
t
e
c
t
i
o
n
{\rm MMDetection}
MMDetection时提供的用于计算机视觉研究的基础
P
y
t
h
o
n
{\rm Python}
Python库,官方提供了多种安装
m
m
c
v
{\rm mmcv}
mmcv的方式。本人采用的是以下方式,首先克隆库:git clone https://github.com/open-mmlab/mmcv.git
,然后:cd mmcv
。在执行后面指令前,首先安装Cython
和pytest-runner
,然后执行命令:MMCV_WITH_OPS=1 pip install -e .
。
2.3 安装MMDetection
首先克隆库:git clone https://github.com/open-mmlab/mmdetection.git
,然后安装依赖:pip install -r requirements/build.txt
、pip install -v -e .
,这里同时安装了pycocotools
。至此,所有安装过程已经完成了。
3. MMDetection结构介绍
下面是 M M D e t e c t i o n {\rm MMDetection} MMDetection的目录结构:
mmdetection
├── configs
├── demo
├── docker
├── docs
├── mmdet
├── requirements
├── tests
├── tools
└── 其他杂项
-
c
o
n
f
i
g
s
{\rm configs}
configs是存放配置文件的目录,里面的子目录为各模块的名称,子目录里面的文件为具体的
.py
形式的配置文件,模型的所有参数均有配置文件给出。 - d e m o {\rm demo} demo里存放了测试用例以及测试代码。
- d o c k e r {\rm docker} docker里存放了 d o c k e r {\rm docker} docker相关内容。
- d o c s {\rm docs} docs里存放了相关教程,包括配置、安装、预训练模型库等。
-
m
m
d
e
t
{\rm mmdet}
mmdet是整个项目的核心,其中包括
apis
文件夹存放了训练、验证、推理部分的函数;core
存放了 A n c h o r {\rm Anchor} Anchor和边界框相关以及后处理等操作;datasets
存放了各数据集的处理代码;models
存放了目标检测模型的骨干网络、颈、头,以及损失函数的定义等;ops
存放了各操作算子,如 D C N {\rm DCN} DCN、 N M S {\rm NMS} NMS以及 R o I {\rm RoI} RoI池化等;utils
存放了各种工具函数和工具类。 - r e q u i r e m e n t s {\rm requirements} requirements里存放了项目的环境依赖。
- t e s t s {\rm tests} tests里存放了针对模型各个模块的测试代码。
- t o o l s {\rm tools} tools里存放了数据集转化、模型转化以及训练、测试、推理代码等。
同时,自己新建目录 d a t a {\rm data} data,里面存放各数据集。本文及以后用到的数据集是 C O C O {\rm COCO} COCO和 V O C {\rm VOC} VOC。其目录分别如下:
├── data
│ ├── coco
│ │ ├── annotations
│ │ ├── train2017
│ │ ├── val2017
│ │ └── test2017
│ └── VOCdevkit
│ ├── VOC2007
│ └── VOC2012
4. 基于预训练模型的推理
4.1 测试数据集
数据集测试部分提供了单 G P U {\rm GPU} GPU测试和多 G P U {\rm GPU} GPU测试。命令分别如下:
# 单gpu测试
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] [--show]
# 多gpu测试
.tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}]
各参数的含义如下:
CONFIG_FILE
:配置文件路径,即上文提到了位于configs
文件夹内。CHECKPOINT_FILE
:预训练模型路径,CONFIG_FILE
的内容与CHECKPOINT_FILE
相对应。RESULT_FILE
:输出结果存放的 p i c k l e {\rm pickle} pickle形式的文件路径。如果不指定该参数,则不保存输出结果。EVAL_METRICS
:数据集的评价指标,各数据集有所不同。其中, C O C O {\rm COCO} COCO数据集包括proposl_fast
、proposal
、bbox
和segm
; V O C {\rm VOC} VOC数据集包括mAP
和recall
; C i t y s c a p e s {\rm Cityscapes} Cityscapes包括cityscapes
以及 C O C O {\rm COCO} COCO数据集的评价指标。--show
:如果指定该参数,检测结果将会以图像的形式展现在当前界面。注意该参数仅用于单 G P U {\rm GPU} GPU测试。--show-dir
:如果指定该参数,检测结果将存放在所指定的目录下。仅用于单 G P U {\rm GPU} GPU测试。--show-score-thr
:指定检测阈值,低于该阈值的结果不显示,默认为 0.3 0.3 0.3。
为进行具体的测试,首先去预训练模型库下载官方提供的预训练模型,下载后的模型存放在checkpoints/
下。后面用到的预模型有faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
、地址(
1
&
2
1 \& 2
1&2),mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth
、地址(
4
&
5
&
6
4 \& 5 \& 6
4&5&6),自己训练的模型(
3
3
3)。
1. 基于Faster RCNN和COCO数据集的测试,可视化结果并且按任意键显示下一张图片
python tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
--show
遍历 C O C O 2017 {\rm COCO2017} COCO2017中的测试集,一共 5000 5000 5000张测试图片。按下键盘任意键显示下一个检测结果,直到遍历完毕。
2. 基于Faster RCNN和COCO数据集的测试,可视化结果并保存
python tools/test.py configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \
--show-dir faster_rcnn_r50_fpn_1x_results
将检测结果存放到指定文件夹中。
3. 基于Faster RCNN和VOC数据集的测试,测试mAP
python tools/test.py configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py \
checkpoints/latest.pth --eval mAP
4. 基于Mask RCNN和COCO数据集的测试,使用2块GPU、测试指标为bbox和mask AP
./tools/dist_test.sh configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \
checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \
2 --out results.pkl --eval bbox segm
第一项指标bbox
表示目标检测中常用的对于检测框的评价指标。
第二项指标segm
表示针对结合检测框和掩膜的评价指标。
同时生成results.pkl
文件,以二进制方式存放测试结果相关信息(读取文件后没有看懂其中的内容,以后阅读代码时再解决)。
5. 基于Mask RCNN和COCO数据集的测试,使用2块GPU、测试指标为classwise bbox和mask AP
./tools/dist_test.sh configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \
checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \
2 --out results.pkl --eval bbox segm --options "classwise=True"
在上部分的基础上进一步生成每个类别的检测结果,如下:
同时生成results.pkl
文件,同上。
6. 基于Mask RCNN和COCO数据集的测试,使用2块GPU并产生官方的json文件
./tools/dist_test.sh configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \
checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \
2 --format-only --options "jsonfile_prefix=./mask_rcnn_test-dev_results"
程序正确运行结束后会生成mask_rcnn_test-dev_results.bbox.json
和mask_rcnn_test-dev_results.segm.json
两个文件。前一个文件存放所有目标检测的检测结果,其形式如下:
{
{'image_id': xxx, 'bbox': [xx, xx, xx, xx], 'score': xxx, 'category_id': xx},
...
}
后一个文件在前一个文件的基础上,多一个segmentation
字段,用于存放像素级分割的结果。
4.2 测试单幅图像
python demo/image_demo.py demo/demo.jpg configs/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
测试结果如下:
4.3 测试相机图像
测试相机图像的通用指令是:
python demo/webcam_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--device ${GPU_ID}] [--camera-id ${CAMERA-ID}] \
[--score-thr ${SCORE-THR}]
如:
python demo/webcam_demo.py configs/faster_rcnn_r50_fpn_1x_coco.py \
checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
4.4 基于高级APIs的图像测试
除了直接使用命令完成测试等工作, M M D e t e c t i o n {\rm MMDetection} MMDetection还将许多操作封装成若干高级 A P I s {\rm APIs} APIs供我们使用。通过这些高级 A P I s {\rm APIs} APIs,我们可以轻易完成测试流程。
from mmdet.apis import init_detector, inference_detector, show_result_pyplot
import mmcv
# 配置文件和预训练模型
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
# 根据配置文件构建模型并加载预训练模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# 测试单张图片并获得检测结果
image = 'demo/demo_1.jpg'
result = inference_detector(model, image)
# 显示检测结果
show_result_pyplot(model, image, result)
# 保存检测结果
model.show_result(image, result, out_file='demo_result.jpg')
4.5 异步推理
同步推理的过程是当前一张图片经模型处理完后再去处理下一张图片,而异步推理可以在模型处理输入图片的同时加载下一张待检测的图片。 M M D e t e c t i o n {\rm MMDetection} MMDetection中提供了异步推理的代码,但是代码还有 B U G {\rm BUG} BUG没有解决。
5. 训练模型
M
M
D
e
t
e
c
t
i
o
n
{\rm MMDetection}
MMDetection提供了分布式训练和非分布式训练,分别使用MMDistributedDataParallel
和MMDataParallel
实现。在训练过程中,所有的日志和模型均保存在工作目录,由参数work_dir
指定。默认条件下,每训练一个
e
p
o
c
h
{\rm epoch}
epoch就使用一次验证集。
1. 单卡训练
单卡训练的基本指令如下:
python tools/train.py ${CONFIG_FILE} [optional arguments]
2. 多卡训练
多卡训练的基本指令如下:
./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]
上述提到的optional arguments
主要包括以下参数:
--no-validate
:指定该参数时,训练模型时将不使用验证集(不推荐)。--word-dir ${WORD_DIR}
:前面提到,模型训练的相关信息会自动保存在当前目录下。如果指定该参数,将会覆盖默认指定的当前目录。--resume-from ${CHECKPOINT_FILE}
:从指定文件恢复训练。--options "Key=value"
:其他一些参数。
单卡训练和多卡训练是我们常用的训练方法,官方还提供了诸如多机训练、多任务训练等方式。使用如下命令基于
V
O
C
{\rm VOC}
VOC数据集使用
2
2
2块
G
P
U
{\rm GPU}
GPU训练了一个
F
a
s
t
e
r
{\rm Faster}
Faster-
R
C
N
N
{\rm RCNN}
RCNN模型,仅改动配置文件中total_epochs=2
,其他参数默认:
./tools/dist_train.sh configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py 2
最终在word_dirs
文件夹下得到.log
和.json
的日志文件,每个epoch
的权重模型,训练模型时的配置文件以及最终的权重模型。最终得到的模型的
m
A
P
{\rm mAP}
mAP为
0.726
{\rm 0.726}
0.726,各类别的
A
P
{\rm AP}
AP值如上图4-4.1-3
所示。
6. 其他工具
在
M
M
D
e
t
e
c
t
i
o
n
{\rm MMDetection}
MMDetection中的tools
文件夹下还提供了许多实用的工具,我们以上面自己训练的
F
a
s
t
e
r
{\rm Faster}
Faster-
R
C
N
N
{\rm RCNN}
RCNN模型为例说明。
6.1 日志分析
上面提到,在模型训练完成后会产生两个日志文件,分别是.log
和.json
形式,tools
文件夹下提供了许多分析日志的工具。首先使用命令pip install seaborn
安装相关依赖,然后基本指令如下:
python tools/analyze_logs.py plot_curve [--keys ${KEYS}] [--title ${TITLE}] [--legend ${LEGEND}] \
[--backend ${BACKEDN}] [--style ${STYLE}] [--out ${OUT_FILE}]
其中,上面指令的各参数含义如下:
KEYS
:表示指令所展示的具体内容,如损失值、 m A P {\rm mAP} mAP等。TITLE
:绘制出的图像的标题。LEGEND
:绘制出的图像的图例。BACKEND
:绘制出的图像的后端。STYLE
:绘制出的图像的风格。OUT_FILE
:绘制出的图像的保存路径。
1. 绘制分类损失值变化曲线
python tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_voc0712/20200805_103643.log.json \
--keys loss_cls --legend loss_cls
2. 绘制分类损失值和回归损失值变化曲线并保存结果
python tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_voc0712/20200805_103643.log.json \
--keys loss_cls loss_bbox --out losses.png
3. 比较不同模型的 m A P {\rm mAP} mAP值的变化
python tools/analyze_logs.py plot_curve log1.json log2.json --keys bbox_mAP --legend run1 run2
如上面的 F a s t e r {\rm Faster} Faster- R C N N {\rm RCNN} RCNN和同样条件下训练得到的 R e t i n a N e t {\rm RetinaNet} RetinaNet的对比:
python tools/analyze_logs.py plot_curve work_dirs/faster_rcnn_r50_fpn_1x_voc0712/20200805_103643.log.json \
work_dirs/retinanet_r50_fpn_1x_voc0712/20200805_150731.log.json --keys mAP --legend run1 run2
4. 统计训练时间
python tools/analyze_logs.py cal_train_time work_dirs/faster_rcnn_r50_fpn_1x_voc0712/20200805_103643.log.json \
--include-outliers
6.2 获得模型参数
使用以下基本命令可以查看模型各层和总的模型浮点运算次数和参数量等:
python tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}]
第一个参数是配置文件路径,第二个参数是输入图形的尺寸,如对于上面基于
V
O
C
{\rm VOC}
VOC数据集的模型的总的浮点数运算次数和参数:
6.3 其他
官方还提供了发布模型、测试模型鲁棒性、将模型转化成 O N N X {\rm ONNX} ONNX和可视化输出结果等,最近暂时用不到这方面的内容,详细内容可参考官方给出的教程。
7. 总结
本文主要是对官方给出的getting_started.md
文件的解读,并测试了相关指令,没有深入到
M
M
D
e
t
e
c
t
i
o
n
{\rm MMDetection}
MMDetection的组织架构等内容,后面会慢慢了解其精髓。本文的目的是熟悉
M
M
D
e
t
e
c
t
i
o
n
{\rm MMDetection}
MMDetection的基本使用,如何使用官方提供的高级
A
P
I
s
{\rm APIs}
APIs等。承接getting_started.md
最后的内容,下文将介绍在
M
M
D
e
t
e
c
t
i
o
n
{\rm MMDetection}
MMDetection中微调模型、添加新数据集、设计数据管道、添加新模块以及配置文件的解读。
参考
- https://github.com/open-mmlab/mmdetection.