py-faster-rcnn + ZF 实现自己的数据训练与检测(一)

时间:2022-07-07 15:18:59

0.前言

最近两个星期,一直在看faster rcnn物体检测,在一段折腾之后,总算能够训练自己的数据并进行物体检测了。这篇博客就当作是对最近整个实验过程的记录吧。首先先从最开始如何配置py-faster-rcnn并训练PASCALVOC2007开始讲起,然后再对代码和数据集进行修改实现自己数据的训练与检测。我的实验平台是Ubuntu14.04 LTS 

1.配置py-faster-rcnn

(1)这里,首先不用说的,大家肯定都已经在自己的机器上配好了caffe的环境,那各种依赖项的安装就不必多说。在配置之前,需要安装一下几个python包:cython,python-opencv和easydict

 
 
<pre name="code" class="python">pip install cythonpip install easydictapt-get install python-opencv

 
 
 
 

(2)从github上clone项目文件,注意:一定要在clone时加入--recursive参数,不然会很麻烦,也不要直接下载

<pre name="code" class="python">git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

 
 

(3)Cython模块的编译

cd py-faster-rcnn/lib
make

(4)Caffe和Pycaffe的编译,在编译之前,主要将makefile.config文件配置好,具体如何配置在你自己安装caffe框架时肯定已经接触过。这里也提供一个链接:实验室欧大神的主页Caffe + Ubuntu 15.04 + CUDA 7.5 新手安装配置指南

cd py-faster-rcnn
make all -j8 && make pycaffe

(5)下载训练好的模型,运行demo.py看效果

cd py-faster-rcnn
./data/scripts/fetch_faster_rcnn_models.sh
./tools/demo.py --net ZF
下载模型时,直接在脚本文件中复制URL使用迅雷下载更快。因为自己的电脑配置不是很高,所以就只实验了ZF net的训练效果。demo.py默认加载的模型是VGG16,运行时可以自己修改代码,也可以加命令参数。

相信到了这一步,看到运行之后的结果是不是很开心呢,不过在我实验过程中,执行demo.py时总是出现bug:

<span style="font-size:18px;">Loaded network /home/ubuntu/py-faster-rcnn/data/faster_rcnn_models/ZF_faster_rcnn_final.caffemodel  
F1008 04:30:16.139123 5360 roi_pooling_layer.cu:91] Check failed: error == cudaSuccess (8 vs. 0) invalid device function </span>

抓耳挠腮查了好久资料终于找到问题所在:显卡的计算能力不匹配,如何修改请看这里cudaSuccess( 8 vs.0 )


2.训练PASCAL VOC 2007的数据

(1)下载pascal voc2007的训练集,测试集和VOCdevkit

<pre name="code" class="plain"><span style="font-size:18px;">http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar</span>

 
   
  

下载完成之后,将三个压缩包解压合并到一起。整体结构如下所示

$VOCdevkit/                           # development kit
$VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc.
# ... and several other directories ...
将VOCdevkit改名为VOCdevkit2007,然后放到data文件夹下,亦可以使用软连接的方式,这里不再说明。

(2)下载预训练好的ImageNet模型

cd py-faster-rcnn
./data/scripts/fetch_imagenet_models.sh

下载这个模型和之前的faster rcnn训练好的模型时,不一定非要执行脚本,直接在脚本中找到资源的URL用迅雷下载更快。然后解压到data文件夹即可。

(3)使用交替优化来训练数据

cd py-faster-rcnn
./experiments/scripts/faster_rcnn_alt_opt.sh [GPU_ID] [NET] [--set ...]
# GPU_ID is the GPU you want to train on
# NET in {ZF, VGG_CNN_M_1024, VGG16} is the network arch to use
# --set ... allows you to specify fast_rcnn.config options, e.g.
# --set EXP_DIR seed_rng1701 RNG_SEED 1701
#例如命令
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

默认的迭代次数是[80000, 40000, 80000, 40000]不过这对于我这种想看到实验能否正常运行的人来说,实在要的等的太久,就在./tools/train_faster_rcnn_alt_opt.py中将迭代次数改为100吧

在程序运行到第一阶段的第三部分“训练fast r-cnn”时,很可能会报错:out of memory !根据我的经验所得,修改./lib/fast_rcnn/config.py 中的图片大小,论文中作者使用的是将短边缩放为600 pixels,对于我的渣渣电脑而言是吃不消的,所以修改如下:

# Scales to use during training (can list multiple scales)
# Each scale is the pixel size of an image's shortest side
__C.TRAIN.SCALES = (450, )
# Max pixel size of the longest side of a scaled input image
__C.TRAIN.MAX_SIZE = 750


如果对作者论文中其他实验也感兴趣的话,可以尝试一下experiments文件夹中的其他训练脚本。最后,所有的输出结果都在output文件夹


接下将如何在本篇博客的基础上训练自己的数据集并进行检测

未完待续。。。