mmdetection环境配置以及自定义数据的训练与测试

1.简介

mmdetection是商汤科技(2018COCO目标检测挑战赛冠军)和香港中文大学开源的一个基于Pytorch实现的深度学习目标检测工具箱。
源码详情见GitHub
mmdetection支持多种主流目标检测方法和backbone:

? ResNet ResNeXt SENet VGG HRNet
RPN ? ? ? ? ?
Fast R-CNN ? ? ? ? ?
Faster R-CNN ? ? ? ? ?
Mask R-CNN ? ? ? ? ?
Cascade R-CNN ? ? ? ? ?
Cascade Mask R-CNN ? ? ? ? ?
SSD ? ? ? ? ?
RetinaNet ? ? ? ? ?
GHM ? ? ? ? ?
Mask Scoring R-CNN ? ? ? ? ?
Double-Head R-CNN ? ? ? ? ?
Grid R-CNN (Plus) ? ? ? ? ?
Hybrid Task Cascade ? ? ? ? ?
Libra R-CNN ? ? ? ? ?
Guided Anchoring ? ? ? ? ?
FCOS ? ? ? ? ?
RepPoints ? ? ? ? ?
Foveabox ? ? ? ? ?
FreeAnchor ? ? ? ? ?
NAS-FPN ? ? ? ? ?
ATSS ? ? ? ? ?

主要特征:
1)模块化设计检测框架分解成不同的组件,通过组合不同的模块可以很容易地构建一个定制的目标检测框架
2)支持多个现成的框架:如Faster RCNN等
3)高效率:所有基本的bbox和mask都支持GPU,相较于Detectron2、SimpleDet等训练速度更快
4)State of the art
在这里插入图片描述
mmdetection的模型主要由以下4个部分构成:
①backbone:通常是一个全卷积网络如ResNet用于提取feature map
②neck:连接backbone和head的部分,如FPN
③head:用于特定任务如bbox预测,maskyuce等的模块
④ROI extractor:从feature map提取特征,如ROI Align、RoIPooling等

2.环境安装

①基础配置要求:
Ⅰ Linux或macOS
Ⅱ Python 3.6+
Ⅲ Pytorch 1.3+(旧版仓库支持1.1+,旧版仓库可从此clone)
Ⅳ CUDA9 9.2+
Ⅴ GCC 4.9+
Ⅵ mmcv

②容器建立

1
2
conda create -n open-mmlab python=3.7 -y
conda activate open-mmlab

如果conda activate失败可以先退出bash容器再激活:

1
2
3
source activate
conda deactivate
conda activate open-mmlab

③安装mmdetection
1)装Pytorch:

1
conda install pytorch torchvision -c pytorch

如果下载慢可以先配置清华的镜像源添加链接描述,然后安装的时候不加-c pytorch
2)clone仓库

1
git clone https://github.com/open-mmlab/mmdetection.git

3)装mmdetection和必需配置

1
2
3
4
cd mmdetection
pip install -r requirements/build.txt
pip install "git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI"
pip install -v -e .  # or "python setup.py develop"

3.转化自定义的数据集

这里以COCO格式数据为例
1)将数据集标注转化为coco格式
??转化代码见此,提取码为297x
2)将生成的放在mmdetection目录下,目录路径如下:
在这里插入图片描述
推荐以软连接的方式创建data文件夹:

1
2
3
cd mmdetection
mkdir data
ln -s $COCO_ROOT data

4.修改cfg等配置

1)修改mmdetection/mmdet/datasets/coco.py,将CLASSES内类别修改为自己的类别,如

1
CLASSES = ('Car', 'Cat')

注意:如果只有一类的话,类别后面需加逗号,如:

1
CLASSES = ('person',)

2)修改mmdetection/mmdet/core/evaluation/class_names.py中coco_classes类别,如:

1
2
3
4
def coco_classes():
    return [
        'Cat', 'Car'
    ]

3)修改configs/faster_rcnn_r50_fpn_1x.py中
Ⅰ model字典中的num_classes:

1
num_classes=3,#类别数+1

Ⅱ data字典中的img_scale:

1
img_scale=(540,960), #输入图像尺寸的最大边与最小边(train、val、test这三处都要修改)

Ⅲ optimizer中的lr:

1
optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001)

学习率的设定:默认的学习率是在8块GPU,每块GPU训练2张图片时为0.02,根据Linear Scaling Rule,1块GPU,每块GPU训练2张图片时lr=0.025

5.训练数据

1)以faster_rcnn_r50_fpn_1x.py配置为例:

1
python tools/train.py configs/faster_rcnn_r50_fpn_1x.py --gpus 1 --validate --work_dir work_dirs

可选参数:
–validate:每k个epoch进行评估,默认k为1
–work-dir:保存训练结果的路径
–resume-from:如果中断时可以用此参数继续训练,如–resume-from work_dirs/lastest.pth
2)训练输出如下:
在这里插入图片描述
3)训练输出以及设置的一些解释:
①epoch [1][150/20000]:1表示正在跑第几个epoch,20000是表示总共40000/2个训练次数,40000为图片总数,2为每个GPU训练两张图片

1
2
3
4
5
6
lr_config = dict(
    policy='step',#优化策略
    warmup='linear',#初始的学习率增加的策略,linear为线性增加,
    warmup_iters=500,#在初始的500次迭代中学习率逐渐增加
    warmup_ratio=1.0 / 3,#设置的起始学习率
    step=[8, 11])#在第9 第10 和第11个epoch时降低学习率
1
optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001)#后面学习率稳定在0.025

③训练后的权重及log文件在之前设置的work_dirs里

1
checkpoint_config = dict(interval=1)#每一个epoch存储一次模型

6.验证模型泛化能力

1)

1
python3 tools/test.py configs/faster_rcnn_r50_fpn_1x.pyy  work_dirs/epoch_12.pth --out ./result.pkl

2)测试输出如下:
在这里插入图片描述
coco数据集格式化的检测评价矩阵定义如下:

在这里插入图片描述

7.构建模型

1)如果想更换一些新的组件,如添加PaFPN到模型中:
①新建PaFPN文件:mmdet/models/necks/pafpn.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from ..registry import NECKS

@NECKS.register
class PAFPN(nn.Module):

    def __init__(self,
                in_channels,
                out_channels,
                num_outs,
                start_level=0,
                end_level=-1,
                add_extra_convs=False):
        pass

    def forward(self, inputs):
        # implementation is ignored
        pass

②修改配置文件

1
2
3
4
5
6
neck=dict(
    #type='FPN'
    type='PAFPN',
    in_channels=[256, 512, 1024, 2048],
    out_channels=256,
    num_outs=5)

2)要编写新的检测管道,需要继承BaseDetector。它定义了以下抽象方法:
extract_feat():给定图像批量形状(n,c,h,w),提取特征图。
forward_train():训练模式的前进方法。
simple_test():无需增强的单一规模测试。
aug_test():使用增强测试(多尺度,翻转)

参考文献:https://blog.csdn.net/gaoyi135/article/details/90613895
https://www.pythonheidong.com/blog/article/53032/