本博客记录了用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的提示完成整个调试过程。下载链接中提供的源代码,并解压。
- 环境
Win10+CUDA10.0+python 3.6+pytorch1.0 - 准备数据集
在解压后的源码根目录下新建文件夹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 |
- 安装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 |
个人数据集训练
待更新······