Faster RCNN pytorch 1.0版调试(踩坑)过程记录

本博客记录了用pytorch实现的faster rcnn代码,完成VOC2007数据集,以及个人数据集的训练及测试过程。比较少做目标检测方向的实验,花了点时间调通代码,记录一下填坑过程。

前言

Faster RCNN是一个很成熟的two-stage目标检测算法,由Kaiming He等大神在2015年提出。该算法在2015年的ILSVRV和COCO竞赛中获得多项第一,在VOC2007+2012数据集和COCO数据集上有很客观的mAP,同时利用所提出的RPN网络大幅提升了测试阶段的速度。整个RCNN系列的目标检测框架发展历程主要包含RCNN、SPP、Fast RCNN、Faster RCNN.
paper:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
code(tensorflow):Tensorflow Faster RCNN for Object Detection
code(pytorch1.0):Pytorch implemention of Faster RCNN

调试

本篇博客主要参考上面的pytorch faster rcnn代码,按照README的提示完成整个调试过程。下载链接中提供的源代码,并解压。

  1. 环境
    Win10+CUDA10.0+python 3.6+pytorch1.0
  2. 准备数据集
    在解压后的源码根目录下新建文件夹data用于存放数据集及其下级目录data\pretrained_model用于存放detector的预训练权重。
    下载Pascal VOC2007数据集,解压后将两个文件夹下的VOCdevkit文件合并,放到data目录下,整个数据集的结构如下图。Annotations存放的是所有样本的xml标签,ImageSets存放的是训练集和验证集列表,JPEGImages存放所有样本。
    在这里插入图片描述
1
2
3
4
5
6
7
8
---data
    ---VOCdevkit2007
        ---VOC2007
            ---Annotations
            ---ImageSets
                ---trainval.txt
                ---test.txt
            ---JPEGImages
  1. 安装COCO API(pycocotools)
    在COCO工具包下载COCO工具包,解压后进入PythonAPI下运行make命令,重新编译,将编译得到的pycocotools文件夹复制到faster rcnn的lib/pycocotools下,覆盖原有的文件。原始文件中的python接口过于老旧,需重新编译,如果不执行这一步,运行“train.py”或者“demo.py"时会报ImportError: cannot import name '_mask的错误。
    在这里插入图片描述
    make命令使用,需要安装C++编译器WinGW,由于某种原因,在线安装会遇到download failed问题,离线安装Windows GNU WinGW编译器,在官网下载Win64离线安装包,解压到指定文件下,配置系统环境变量,将C:\mingw64\bin添加到Path中,同时将C:\mingw64\bin下的mingw32-make.exe重命名为make.exe.
    在编译过程中如果遇到cl: 命令行 error D8021 :无效的数值参数/Wno-cpp等Wno-cpp参数相关的错误,打开PythonAPI下的setup.py文件,做下图中的修改。
1
2
3
4
5
6
7
8
9
ext_modules = [
    Extension(
        'pycocotools._mask',
        sources=['../common/maskApi.c', 'pycocotools/_mask.pyx'],
        include_dirs = [np.get_include(), '../common'],
        #extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99'],注释掉,改为下行代码。
    extra_compile_args=[ '-std=c99'],
    )
]
  • 安装依赖项
    进入到faster rcnn源码根目录下,执行pip install -r requirements.txt命令,安装依赖项。在这里插入图片描述

5.编译cuda依赖项

1
2
cd root_dir/lib
python setup.py build develop

它会自动编译程序所需的几个模块包含NMS, ROI_Pooing, ROI_Align 和ROI_Crop,如果不编译,运行train或者demo时会产生,from model import _C ImportError: cannot import name ‘_C’ from 'model的错误。
编译时,遇到了下面图中的1个THCCeilDiv相关的cuda代码的问题在这里插入图片描述
参考博主win10编译faster rcnn的解决方案,将faster rcnn root_dir\lib\model\csrc\cuda下的ROIAlign_cuda.cu, ROIPool_cuda.cu文件打开,并将含THCCeilDiv的语句注释掉做下图修改,最后顺利完成编译工作。

1
2
//dim3 grid(std::min(THCCeilDiv(**, 512L), 4096L));
  dim3 grid(std::min(((int)** + 512 -1) / 512, 4096));

训练

  • 准备预训练权重文件,用于初始化RCNN detector的特征提取网络,也就是vgg16或resnet101.官方下载链接如下。如果不能下载就看这里:网盘下载 提取码:d3l4,把下载的权重文件放到data\pretrained_model下。
    vgg16:dropbox
    resnet101:dropbox

  • 运行train.py

1
2
3
4
5
CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
                    --dataset pascal_voc --net res101 \
                    --bs $BATCH_SIZE --nw $WORKER_NUMBER \
                    --lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \
                    --cuda

个人数据集训练
待更新······