R-FCN在linux下的配置(py-R-FCN)并训练自己的数据集

本文是R-FCN代码的python版源码配置,操作系统为Ubuntu16.04

R-FCN: Object Detection via Region-based Fully Convolutional Networks,与先前的基于区域的检测器(诸如Fast/Faster R-CNN)在每个区域子网络几百次的高成本计算相反,R-FCN的基于区域的检测器是利用深度完全卷积网络,几乎所有计算在整个图像上共享。 R-FCN可以采用强大的完全卷积图像网络结构,例如ResNets等。

Github:https://github.com/YuwenXiong/py-R-FCN

Paper: https://arxiv.org/abs/1605.06409

目录:

1,软件准备

2,硬件准备

3,R-FCN配置

4,配置中遇到的问题

5,训练自己的数据集

6,训练数据集遇到的问题

扫描二维码关注公众号,回复: 2396282 查看本文章

7, 参考资料


软件准备:

首先,需要安装Caffe和pycaffe,这里不做介绍,默认已经装了;

其次,需要Python安装包:cython,python-opencv,easydict;

先装python包管理器pip:

[html]  view plain  copy
  1. sudo apt-get install python-pip  
再装那三个包:
[html]  view plain  copy
  1. sudo pip install cython  
  2. sudo pip install python-opencv  
  3. sudo pip install easydict  

PS:由于R-FCN对Roi Layer有了修改,因此需用使用作者版本的Caffe而不是BLVC版本。该版本Caffe要求使用CUDA Toolkit 7.5与** cuDNN v3 or cuDNN v4**。

硬件准备:

如果选用ResNet50:4G显存;如果用ResNet101:6G显存

R-FCN配置过程:

1、克隆py-R-FCN工程:

[html]  view plain  copy
  1. git clone https://github.com/Orpine/py-R-FCN.git  

2、克隆Microsoft-version Caffe(@commit 1a2be8e), R-FCN某些层的定义是在这个版caffe才有

[html]  view plain  copy
  1. cd py-R-FCN  
  2. git clone https://github.com/Microsoft/caffe.git  
  3. cd caffe  
  4. git reset --hard 1a2be8e  

3、编译caffe,注意修改Mikefile文件,先拷贝Makefile.config.example到Makefile.config再改部分选项,然后make,如下:

[html]  view plain  copy
  1. cp Makefile.config.example Makefile.config  
  2. # In your Makefile.config, make sure to have this line uncommented  必须
  3. WITH_PYTHON_LAYER :1  
  4. # 推荐使用CUDNN加速,没有GPU或CUDA损坏的可以关闭  可选 
  5. USE_CUDNN :1  
  6. # 根据机器情况选择是否使用PKG_CONFIG,我的机器必须有这项
  7. USE_PKG_CONFIG = 1
  8. #开始make
  9. make -j8 && make pycaffe  
4、编译lib  
  1. cd ../lib 
  2. make 

5、下载预先在Pascal Voc 2007上训练好的基于ResNet的R-FCN模型,解压后放在$RFCN/data下面,如下形式:

$RFCN/data/rfcn_models/resnet50_rfcn_final.caffemodel
$RFCN/data/rfcn_models/resnet101_rfcn_final.caffemodel

作者上传到Onedrive,下载貌似要翻墙,我下载后传到百度云盘上了https://pan.baidu.com/s/1duMRYq3PdzA2EJUg2XCsqg,密码qr6b

6、跑demo.py

$RFCN/tools/demo_rfcn.py

如果运行没问题,R_FCN就配置好了,训练自己的数据看GitHub,写得很详细了。


配置中遇到的问题

Makefile.config配置的相关问题:

打开 USE_CUDNN = 1,这个选项默认情况下时关闭的,使用CUDA可以加速,我的机器CUDA有点问题,所以我没有打开;
打开 WITH_PYTHON_LAYER = 1,这个在默认情况下也是关闭的,R-FCN有作者自己实现的python层,需要支持Python接口,因此需要打开
和Fast RCNN一样,R-FCN需要hdf5的支持,这个根据自己的Linux里的库文件安装路径添加,不清楚的可以find一下,不过一般情况下,INCLUDE_DIRS 应该添加上 /usr/include/hdf5/serial LIBRARY_DIRS 添加上 /usr/lib/x86_x64-linux-gnu/hdf5/serial

另外把USE_PKG_CONFIG = 1 记得打开,要不然会找不到一些库文件,PKG是linux用来管理库文件

ERROR:/usr/bin/ld: 找不到 -lippicv 

原因:缺少opencv库文件libippicv.a

解决方法:在终端下搜索libippicv文件

find /usr/local/ -name "libippicv*"

找到该文件在/usr/local/share/OpenCV/3rdparty/lib/libippicv.a,然后把找到的文件拷贝或软连接到/usr/local/lib

ln -s /usr/local/share/OpenCV/3rdparty/lib/libippicv.a /usr/local/lib

利用R-FCN训练自己的数据集:

1、拷贝数据集到$RFCN_ROOT/data下,比如我的数据集是RSOD飞机检测数据集,为了方便,我把它做成pascal voc(该数据比该代码方便一点,尤其是pascal_voc格数还比较通用,方便以后用在其他网络).注意,results文件需要自己创建,包含VOC2007,再包含Main,用来存结果。

$RFCN_ROOT
--data
----VOCdevkit2007
------VOC2007
--------JPEGImages
--------ImageSets
----------Main
--------Annotations
------results
--------VOC2007
----------Main

2、下载预训练模型

ResNet-50, ResNet-101, ResNet-152 预训练模型,我的百度云盘:https://pan.baidu.com/s/1g89UfSBpTcuaqkikM2Yy6g,密码2d5b,将caffemodel放在$RFCN_ROOT/data/imagenet_models

3、修改模型网络,就是根据自己类别数目该模型与类别数目相关的参数

打开$RFCN_ROOT/models/pascal_voc/ResNet-50/rfcn_end2end  (以end2end为例)

(1)test.prototxt 6处:查找: rfcn_cls (2处)、rfcn_bbox (2处)、cls_prob_reshape (1处)、bbox_pred_reshape(1处)

(2)train_ohem.prototxt 6处:查找: num_class (2处)、rfcn_cls (2处)、rfcn_bbox (2处)

(3)test_agnostic.prototxt /  train_agnostic.prototxt / train_agnostic_ohem.prototxt 各3处:查找: num_class (1处)、rfcn_cls(2处)

在相应文件中搜索各查找的关键词,把这些层与类别数相关的改成自己的数据类别数(与bbox相关的要乘以4)

4、修改数据集代码

(1)$RFCN/lib/datasets/pascal_voc.py

class pascal_voc(imdb):  
    def __init__(self, image_set, year, devkit_path=None):  
        imdb.__init__(self, 'voc_' + year + '_' + image_set)  
        self._year = year  
        self._image_set = image_set  
        self._devkit_path = self._get_default_path() if devkit_path is None \  
                            else devkit_path  
        self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)  
        self._classes = ('__background__', # always index 0  
                         '你的标签1','你的标签2',你的标签3','你的标签4'  
                      )  

(2)$RFCN\experiments\scripts\rfcn_end2end_ohem.sh:

case $DATASET in  
  pascal_voc)  
    TRAIN_IMDB="voc_0712_trainval"  #voc_0712_trainval是作者在github里描述的voc2007+voc2012,我的数据放在voc2007文件下,所以这里改成voc_2007_trainval
    TEST_IMDB="voc_0712_test"  #同上理由,改成voc_2007_test
    PT_DIR="pascal_voc"  
    ITERS=110000  #我的数据集较小,迭代次数改成ITERS=12000

5、开始训练

cd $RFCN_ROOT  
./experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc

其中,0表示GPU Id,ResNet-50是网络,pascal_voc是数据集。


训练数据集遇到的问题

根据经验,由于各个机器环境不一样,往往不是一次就能成功的,会有各种问题,建议跑训练前先把迭代次数设置为100或更小,方便调试,我将遇到的问题整理在另一篇文章里:http://blog.csdn.net/hongxingabc/article/details/79048531 (R-FCN代码是Faster R-CNN基础上改的,所以会有相同的问题)建议跑之前先看看这个,心里有点谱。

除了与Faster R-CNN共有的一些问题外,训练R-FCN的end2end_OHEM版本时遇到问题: loss_bbox=0,而训练单纯end2end版本则无此问题。解决方法参考https://github.com/YuwenXiong/py-R-FCN/issues/85,主要是numpy的问题。

参考资料:

http://blog.csdn.net/sinat_30071459/article/details/53202977

http://blog.csdn.net/u010678153/article/details/52639267

http://www.cnblogs.com/peiyuYang/p/8196037.html

猜你喜欢

转载自blog.csdn.net/hongxingabc/article/details/79478236