Ubuntu18.04下安装并使用maskrcnn benchmark训练自己的数据(COCO格式)

  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驱动
NVIDIA
  2.CUDA和GCC
CUDA9.0
CUDA9.2
  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
NVIDIA驱动
  要注意的是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

pytorch安装
   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来修改,训练之前一定要检查数据路径是否正确。
path_COCO
  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.结果
  训练成功后,程序会自动检验验证集,输出如下:
output
  其中log.txt记录了程序运行中的所有输出(print),model开头的都是定期保存的模型,但不知道不为什么后缀名不是pkl而是pth,inference中存储的是验证集的验证结果,如下:
test
  博主猜测,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   

bbox

over!!!祝你好运!!!

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 34
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值