介绍
Facebook AI Research 开源了 Faster R-CNN 和 Mask R-CNN 的 PyTorch 1.0 实现框架:MaskRCNN-Benchmark。他的性能相对更快,并且占用更少的 GPU 内存,它的亮点如下:
- PyTorch 1.0: 相当或者超越 Detectron 准确率的 RPN、Faster R-CNN 和 Mask R-CNN 的实现;
- 非常快: 训练速度是 Detectron 的两倍,是 mmdection 的 1.3 倍。
- 节省内存: 在训练过程中使用的 GPU 内存比 mmdetection 少大约 500MB;
- 使用多 GPU 训练和推理;
- 批量化推理:可以在每 GPU 每批量上使用多张图像进行推理;
- 支持 CPU inference: 可以在 CPU 上运行。
- 提供几乎所有参考 Mask R-CNN 和 Faster R-CNN 配置的预训练模型,具有 1x 的 schedule。
这篇文章主要是记录我使用 Mask R-CNN benchmark 框架训练自定义数据集的过程,总的来说还是比较容易上手的,当然也有一些问题出现。下面便是使用的情况。
安装
我的开发环境如下:
- 系统: Ubuntu 18.04LTS
- Python 环境: miniconda3
- conda: 4.7.12
- Python: 3.7.4
- GCC: 7.3.0
- CUDA: 10.0
- pip: 19.3.1
项目的要求如下:
- PyTorch 1.0 from a nightly release. It will not work with 1.0 nor 1.0.1. Installation instructions can be found in https://pytorch.org/get-started/locally/
- torchvision from master
- cocoapi
- yacs
- matplotlib
- GCC >= 4.9
- OpenCV
- CUDA >= 9.0
接下来跟着执行安装命令:
1 | # create the development environment |
1 | # install the core projects |
准备数据集
安装完成后,下一步是要准备训练数据和验证数据。
maskrcnn-benchmark默认是使用COCO数据集的,因此需要把自己的数据集改成COCO的Detection格式。该数据集的标准是使用JSON文件存储,具体内容可以参考COCO数据集的标注格式一文。
COCO数据集的Detection部分主要的JSON结构体类型如下所示: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{
"root":{
"images": [
"0": {
"id": int, //每张图片都有唯一的id标识
"file_name": str, //图片文件路径
"width": int,
"height": int
},
],
"categories": [
"0": {
"id": int,
"name": str,
"count": int //每种category的数量
},
],
"annotations": [
"0": {
"id": int, //每个annotation都有唯一的id标识
"image_id": int, //对应于图片的id
"segmentation": RLE or [polygon], //用多边形表示mask区域
"category_id": int, //对应的category id
"iscrowd": 0 or 1, //表示是否是一组对象,如果为1,则segmentation用RLE格式,如果为0,则用polygons格式
"area": float, //区域面积
"bbox": [x,y,width,height] //通过这四个坐标定位bounding box
},
]
}
}
参考上面的格式分别生成训练集和验证集的json标注文件,随后将数据集文件软链接到dataset文件夹目录下。目录格式可以参考下面:1
2
3
4
5
6
7├── datasets
│ └── coco #可以任意修改名称
│ ├── annotations
│ │ ├── instances_train2014.json #训练集标注文件
│ │ └── instances_val2014.json #验证集标注文件
│ ├── train2014 #存放训练集图片
│ └── val2014 #存放验证集图片
修改配置文件
在准备好数据文件之后,便可以通过修改配置文件来开始训练数据集,这里涉及的配置文件如下:
- 模型参数配置文件:
configs/e2e_mask_rcnn_R_101_FPN_1x.yaml
- 数据集路径配置文件:
maskrcnn_benchmark/config/path_catalog.py
数据路径文件
需要修改的地方如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
"""Centralized catalog of paths."""
import os
from copy import deepcopy
class DatasetCatalog(object):
DATA_DIR = "datasets"
DATASETS = {
"coco_2017_train": {
"img_dir": "coco/train2017",
"ann_file": "coco/annotations/instances_train2017.json"
},
"coco_2017_val": {
"img_dir": "coco/val2017",
"ann_file": "coco/annotations/instances_val2017.json"
},
···
}
然后在DETASETS里面按照同样的格式修改image文件夹和annotation文件的位置,需要与自己的数据集相互对应。修改好文件位置之后,则修改模型参数文件。
模型参数文件
模型参数文件里面的内容主要是网络结构、数据集配置和训练方式等,由于官方的模型是在8个GPU的环境下训练的,因此我们需要调小训练的batch_size
,防止显存溢出。同时调整学习率,使网络能够正常训练。我的配置文件如下所示:1
1
启动训练
进入maskrcnn-benchmark根目录下,激活虚拟环境,并执行训练脚本。1
2
3cd maskrcnn-benchmark
source activate detection
python tools/train_net.py --config-file configs/adas_e2e_mask_rcnn_R_101_FPN_1x.yaml
每隔一定的iteration会打印loss信息,用于判断训练的结果是否走偏,从而节省时间,这里我使用的是默认值20
。最后就是验证结果,该步骤会在训练完成后自动运行,我们看一下结果: