MMDetection是商汤科技开源的用于深度学习目标检测的库,而SIIM-ACR Pneumothorax Segmentation(以下简称SIIM)是发布于Kaggle平台的一个分割气胸所在位置的计算机视觉类竞赛。以下我将以SIIM比赛为例,介绍如何使用MMDetection进行语义分割。
一、安装MMDetection
安装过程可能会有更新,以官方为准:
https://github.com/open-mmlab/mmdetection
安装准备
- 操作系统:Linux
- Python 3.5+
- PyTorch 1.0+ 或 PyTorch-nightly
- CUDA 9.0+
- NCCL 2+
- GCC 4.9+
安装步骤
创建conda虚拟环境并激活、安装Cython
1
2
3
4conda create -n open-mmlab python=3.7 -y
conda activate open-mmlab
conda install cython根据PyTorch官网中对应的版本在conda的虚拟环境中安装PyTorch stable/nightly和torchvision。注意需要去掉安装命令中的 -c 参数(如果有的话),不然下载过程会很慢。
克隆MMDetection并安装
1
2
3
4git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
python setup.py develop
# or "pip install -v -e ."
二、准备COCO格式数据标注
COCO的全称是Common Objects in COntext,是微软团队提供的一个可以用来进行图像识别的数据集。而我们在这次比赛中需要用到的是COCO数据集的标注格式,mmdetection将通过标注来对数据进行训练和测试。
COCO数据集现在有5种标注类型:Object Detection(目标检测)、Keypoint Detection(关键点检测)、 Stuff Segmentation(语义分割)、Panoptic Segmentation(全景分割)和image captions(看图说话),使用JSON文件存储。在SIIM比赛中使用的是语义分割。
基本的JSON结构体类型
1 | { |
- info类型,以下是一个info类型的实例:
1 | "info":{ |
- images是包含多个image实例的数组,以下是一个image类型的实例:
1 | { |
- licenses是包含多个license实例的数组,以下是一个license类型的实例:
1 | { |
info和licenses是不必要的,留空即可。
Stuff Segmentation 类型的标注
Stuff Segmentation 的标注格式和 Object Detection 的格式一样,如下:
1 | { |
可以看到segmentation的结构体比通用结构体多了两种类型:annotations和categories。
- annotations字段是包含多个annotation实例的一个数组,annotation类型本身又包含了一系列的字段,如下所示:
1 | annotation{ |
在Stuff Segmentation任务中,segmentation的编码为RLE格式,iscrowd为0;area字段为标注覆盖的面积;bbox是一个长度为4的数组,用于表示目标检测的边框,x和y表示边框左上角的坐标,width和height表示边框的宽和高。当编码为RLE格式时,segmentation的格式如下:
1 | segmentation : |
size是这张图片的宽高,counts字段的内容为RLE编码。此处举例使用的是uncompressed RLE,做语义分割任务时需编码为compact RLE。可使用pycocotools中的函数生成compact RLE,以下用SIIM中的一个RLE码举例:
1 | from pycocotools.mask import encode |
rle2mask是SIIM比赛官方提供的用于将RLE转化成mask的函数,内容如下:
1 | def rle2mask(rle, width, height): |
以下是COCO2017的语义分割标注文件中一个完整的annotation:
1 | { |
- categories 字段是一个包含多个category实例的数组,表示标注的物体类型,category结构体描述如下:
1 | { |
在SIIM的检测目标里只有一种类型,即气胸(Pneumothorax)。于是自定义一种category如下:
1 | "categories": [ |
以上是关于Stuff Segmentation 类型标注的所有内容,接下来就可以自己动手写一个脚本自动生成标注文件了。值得一提的是测试集的标注文件无需annotations字段。
准备好的COCO格式数据集按如下形式摆放。官方建议新建一个data文件夹,将数据集放在data文件夹下(建议使用软链接的方式)。生成的标注文件放在annotations文件夹下。
1 | mmdetection |
软连接方式,其中$COCO_ROOT需改为你的coco数据集根目录:
1 | cd mmdetection |
三、训练模型
修改模型配置文件
进入配置文件夹configs,编辑你想使用的模型对应的配置文件。以下以cascade_mask_rcnn_x101_64x4d_fpn_1x.py为例,解释其中几个比较关键的参数:
1 | # model settings |
修改coco数据配置文件
编辑mmdet/datasets/coco.py,修改CLASSES。例如SIIM比赛中只有一个Pneumothorax类,则改成如下形式:
1 | CLASSES = ('Pneumothorax',) |
训练模型
注意:配置文件中的默认学习率是8个gpu和2个img/gpu(batch size= 82 = 16)。根据线性缩放规则,如果您使用不同的GPU数目或img/gpu,您需要设置与batch size成比例的学习率。例如,如果4GPUs 2 img/gpu的lr=0.01,那么16GPUs * 4 img/gpu的lr=0.08。
单GPU训练
1 | python tools/train.py ${CONFIG_FILE} |
可选参数:
- —work_dir ${YOUR_WORK_DIR} :指定work_dir
多GPU训练
1 | ./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments] |
可选参数:
--validate [k]
:训练时每k epochs(默认为1)执行一次验证--work_dir ${YOUR_WORK_DIR}
:指定work_dir--resume_from ${CHECKPOINT_FILE}
:从指定的checkpoint文件开始训练
对于刚刚配置的环境,我们只需输入如下命令就可以训练啦:
1 | ./tools/dist_train.sh configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py 4 --validate |
训练log
1 | 2019-07-19 11:47:51,271 - INFO - Distributed training: True |
测试模型
1 | # single-gpu testing |
可选参数:
RESULT_FILE
: 用于存放测试结果的pickle格式的文件名,若没有指定这个参数,最终结果将不会输出到文件里。EVAL_METRICS
:需要评估的类型,可选选项有:proposal_fast
,proposal
,bbox
,segm
,keypoints
.--show
:若指定了该参数,检测结果将在新窗口中以图片形式显示出来。(只能用于单GPU测试。)
对于测试数据集,我们输入了如下命令:
1 | ./tools/dist_test.sh configs/cascade_mask_rcnn_x101_64x4d_fpn_1x.py work_dirs/cascade_mask_rcnn_x101_64x4d_fpn_1x/epoch_50.pth 4 --eval segm |
由于指定了 —eval 为 segm,最终的预测结果会输出到result.pkl.segm.json文件里。
参考文献:
- MMDetection官方文档:https://github.com/open-mmlab/mmdetection
- COCO官方:http://cocodataset.org/#format-data
- COCO数据集的标注格式:https://zhuanlan.zhihu.com/p/29393415
- mmdetection训练自己的数据:https://blog.csdn.net/qq_36302589/article/details/86149293
- mmdetection的configs中的各项参数具体解释:https://blog.csdn.net/hajlyx/article/details/85991400
- 以及各路大佬的答疑解惑