10月份,Facebook发布了Mask R-CNN的pytorch版本— —maskrcnn benchmark。之前一直使用Tensorflow的版本,但是由于电脑配置不高,且数据量大(10w级),训练的时间巨长,因此考虑尝试pytorch版。由于博主本身不是学计算机的,编程能力较差,只是引用该算法做自己专业上的数据处理,所以花了好几天才把程序跑通,速度确实远远快于tensorflow版。而且,虽然通过程序训练出了模型,但是博主不知道怎么将测试结果可视化,也不知道怎么做精度评价,先把前面的写出来,后面搞清楚了再补上,如果有哪位大佬愿意指点,那就再感激不过了。
一、配置
CPU:AMD Ryzen 5 2600
内存:32G
显卡:NVIDIA Quadro P4000(8G显存)
系统:Ubuntu 18.04 desktop
二、下载和介绍
maskrcnn benchmark下载地址及介绍文档
三、安装maskrcnn benchmark
其实官方的安装文档写的还是很清楚的,博主在安装过程中遇到的最多的问题就是各种不兼容。另外官方文档提供了两种安装方法,一种是逐步安装(Option 1: Step-by-step installation),另一种是通过Docker安装(Option 2: Docker Image (Requires CUDA, Linux only))。因为不会用Docker,所以博主使用的是第一种,使用第二种的方法的要注意,它只能在Linux下运行,且不能使用CPU模式。
安装要求如上,我们要考虑各模块版本的对应(博主的版本会在后面给出),其中包括:
1.CUDA和NVIDIA驱动
2.CUDA和GCC
3.maskrcnn benchmark要求GCC>=4.9
4.Ubuntu系统GCC和Python内核GCC
首先声明一下,博主也不是很懂这两个GCC哪个是上面CUDA和maskrcnn benchmark要求的,为了避免麻烦,博主将它们配置成了相同的版本。Ubuntu系统GCC的版本更改可以参考Ubuntu 18.04 将gcc版本降级为5.5版本,anaconda版本下Python的内核GCC更改可以参考如何改变anaconda的gcc版本?,纯Python下的内核GCC貌似无法更改,博主没有找到相应办法,因此只能选择GCC合适的Python版本。
5.博主的配置
NVIDIA驱动版:396.54
CUDA9.2
Ubuntu18.04系统GCC:7.3.0
纯Python2.7.15.rc1内核GCC版本:7.3.0
了解这些后,就可以开始安装了,参考maskrcnn benchmark安装文档,安装步骤如下:
1.更改Ubuntu系统GCC
更改方法前面已经说过了
2.安装NVIDIA驱动
参考How to install the NVIDIA drivers on Ubuntu 18.04 Bionic Beaver Linux
要注意的是add-apt-repository ppa:graphics-drivers/ppa这个下载地址包含谷歌的站点,如果没法翻墙的话,可以参考解决连不上dl.google.com的问题,博主是在IPV6下根据上面参考解决的,至于IPV4下能否解决就不清楚了。
3.安装CUDA和CUDNN
参考Ubuntu 18.04 + CUDA 9.2 + cuDNN 7.1.4 + Caffe2 + Tensorflow1.8-Anaconda 安装和爆详细Ubuntu18.04,CUDA9.0,OpenCV3.1,Tensorflow完全配置指南
4.构建Python虚拟环境
conda create --name maskrcnn_benchmark
source activate maskrcnn_benchmark
首先要说明,anaconda不是必需的,也可以用纯Python。这两句是为maskrcnn_benchmark构建一个独立的Python虚拟环境,就是说所有程序所需的包在这里面安装或卸载都不会影响其他Python环境,用conda构建和使用Python环境可以参考用conda创建python虚拟环境,但这个不是必需的,如果担心不小心搞坏原有的Python环境,可以使用这个。
5.安装几个很容易安装的包
conda install ipython 或者 pip install ipython
pip install ninja yacs cython matplotlib
6.安装pytorch
可以参考pytorch官网,原安装文档中使用的是conda方式,博主是用的是pip方式,注意看版本一定要是1.0,还有对应的系统、Python、CUDA版本别选错了。
conda install pytorch-nightly -c pytorch
cd ~/github
git clone https://github.com/pytorch/vision.git
cd vision
python setup.py install
7.安装pycocotools
也就是用于处理COCO格式数据的API,这个博主之前在WIN10下安装过,问题无数,但是在Linux下顺顺利利,一般应该不会有什么问题。
cd ~/github
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install
8.安装maskrcnn benchmark
前面的安装如果没问题的话,这个应该也是水到渠成。
cd ~/github
git clone https://github.com/facebookresearch/maskrcnn-benchmark.git
cd maskrcnn-benchmark
python setup.py build develop
9.备注
如果git下载慢或者不会用的话,也可以直接去github上下载pycocotools和maskrcnn benchmark的压缩包安装。注意maskrcnn benchmark的位置,安装后文件夹maskrcnn-benchmark-master就是程序的默认位置。
四、训练
1.下载预训练模型
resnet50下载地址:https://s3-us-west-2.amazonaws.com/detectron/ImageNetPretrained/MSRA/R-50.pkl
博主在maskrcnn-benchmark-master下新建了一个weights文件夹来存放,方便管理。
2.数据准备
在maskrcnn-benchmark-master中新建datasets/coco文件夹,并在coco中新建train2014、val2014、test2014、annotations四个文件夹,分别存放训练集原图、验证集原图、测试集原图和三个数据集的annotation。当然,如果不想将数据放在这里,也可以建立软链接,如下:
cd ~/github/maskrcnn-benchmark-master
mkdir -p datasets/coco
ln -s /path_to_coco_dataset/annotations datasets/coco/annotations
ln -s /path_to_coco_dataset/train2014 datasets/coco/train2014
ln -s /path_to_coco_dataset/test2014 datasets/coco/test2014
ln -s /path_to_coco_dataset/val2014 datasets/coco/val2014
ln -s /path_to_VOCdevkit_dir datasets/voc
数据集文件夹名称和路径都可以通过maskrcnn-benchmark-master/maskrcnn_benchmark/config/paths_catalog.py来修改,训练之前一定要检查数据路径是否正确。
3.参数配置
参数文件都放在maskrcnn-benchmark-master/configs中,可以参考scheduling rules from Detectron,以e2e_mask_rcnn_R_50_FPN_1x.yaml为例,下面是我修改的,添加了部分注释。
MODEL:
META_ARCHITECTURE: "GeneralizedRCNN"
WEIGHT: "maskrcnn-benchmark-master/weights/R-50.pkl" # 预训练模型路径
BACKBONE:
CONV_BODY: "R-50-FPN" # 网络结构
OUT_CHANNELS: 256
RPN:
USE_FPN: True # 是否使用FPN,也就是特征金字塔结构,选择True将在不同的特征图提取候选区域
ANCHOR_STRIDE: (4, 8, 16, 32, 64) # ANCHOR的步长
PRE_NMS_TOP_N_TRAIN: 2000 # 训练时,NMS之前的候选区数量
PRE_NMS_TOP_N_TEST: 1000 # 测试时,NMS之后的候选区数量
POST_NMS_TOP_N_TEST: 1000
FPN_POST_NMS_TOP_N_TEST: 1000
ROI_HEADS:
USE_FPN: True
ROI_BOX_HEAD:
POOLER_RESOLUTION: 7
POOLER_SCALES: (0.25, 0.125, 0.0625, 0.03125)
POOLER_SAMPLING_RATIO: 2
FEATURE_EXTRACTOR: "FPN2MLPFeatureExtractor"
PREDICTOR: "FPNPredictor"
ROI_MASK_HEAD:
POOLER_SCALES: (0.25, 0.125, 0.0625, 0.03125)
FEATURE_EXTRACTOR: "MaskRCNNFPNFeatureExtractor"
PREDICTOR: "MaskRCNNC4Predictor"
POOLER_RESOLUTION: 14
POOLER_SAMPLING_RATIO: 2
RESOLUTION: 28
SHARE_BOX_FEATURE_EXTRACTOR: False
MASK_ON: True # 是否使用语义分割功能
DATASETS: # 使用的数据,对应前面的paths_catalog.py
TRAIN: ("coco_2014_train", "coco_2014_val")
TEST: ("coco_2014_test",)
DATALOADER:
SIZE_DIVISIBILITY: 32
SOLVER:
IMS_PER_BATCH: 2 # GPU每次训练的图片数
BASE_LR: 0.0025 # 初始学习速率
WEIGHT_DECAY: 0.0001 # 学习速率衰减大小
STEPS: (30000, 40000) # 学习速率衰减策略(这个博主不太明白,就使用的默认的)
MAX_ITER: 60000 # 最大迭代次数
INPUT:
MIN_SIZE_TRAIN: 300 # 最大图片尺寸
MAX_SIZE_TRAIN: 300 # 最小图片尺寸
TEST:
IMS_PER_BATCH: 1
OUTPUT_DIR: "output" # 输出文件夹
4.进行训练
因为博主只有一块显卡,所以在maskrcnn-benchmark-master下直接运行下面代码即可:
python tools/train_net.py --config-file "configs/e2e_mask_rcnn_R_50_FPN_1x.yaml"
多GPU请参考maskrcnn benchmark下载地址及介绍文档:
5.结果
训练成功后,程序会自动检验验证集,输出如下:
其中log.txt记录了程序运行中的所有输出(print),model开头的都是定期保存的模型,但不知道不为什么后缀名不是pkl而是pth,inference中存储的是验证集的验证结果,如下:
博主猜测,segm.json和bbox.json存储的应该就是使用模型计算出的验证集的mask,但是博主的segm.json中的segmentation字段下都是空的,目前还不知道是什么原因,后面解决了再说吧,要是有大佬能指点下,就太感激了。
6.跑程序时遇到的问题
问题1:RuntimeError: The shape of the mask [230202] at index 0 does not match the shape of the indexed tensor [0] at index 0.
解决办法:这是由于json文件中有数据的segmentation为空,剔除这些数据就好了,可以使用pycocotools和json这两个Python包完成这个任务。
问题2:ValueError: No ground-truth boxes available for one of the images.
解决办法:这是由于json文件中有数据的bbox为空,解决办法:1是,像问题1一样,剔除这些数据;2是修改maskrcnn benchmark的安装目录下的/home/xu/.local/lib/python2.7/site-packages/maskrcnn_benchmark-0.1-py2.7-linux-x86_64.egg/maskrcnn_benchmark/engine/trainer.py,添加下面代码到红框位置,这段代码是跳过bbox为空的数据,由于我的batch_size为2,所以我的targets中有两个bbox,只要有一个为空就不行,根据你自己的batch_size来调整代码:
if len(targets[0]) < 1 or len(targets[1]) < 1:
print('num_boxes: ', len(targets[0]), len(targets[1]))
continue
over!!!祝你好运!!!