本文是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,训练数据集遇到的问题
![](/qrcode.jpg)
7, 参考资料
软件准备:
首先,需要安装Caffe和pycaffe,这里不做介绍,默认已经装了;
其次,需要Python安装包:cython,python-opencv,easydict;
先装python包管理器pip:
- sudo apt-get install python-pip
- sudo pip install cython
- sudo pip install python-opencv
- 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工程:
- git clone https://github.com/Orpine/py-R-FCN.git
2、克隆Microsoft-version Caffe(@commit 1a2be8e), R-FCN某些层的定义是在这个版caffe才有
- cd py-R-FCN
- git clone https://github.com/Microsoft/caffe.git
- cd caffe
- git reset --hard 1a2be8e
3、编译caffe,注意修改Mikefile文件,先拷贝Makefile.config.example到Makefile.config再改部分选项,然后make,如下:
- cp Makefile.config.example Makefile.config
- # In your Makefile.config, make sure to have this line uncommented 必须
- WITH_PYTHON_LAYER := 1
- # 推荐使用CUDNN加速,没有GPU或CUDA损坏的可以关闭 可选
- USE_CUDNN := 1
- # 根据机器情况选择是否使用PKG_CONFIG,我的机器必须有这项
- USE_PKG_CONFIG = 1
- #开始make
- make -j8 && make pycaffe
- cd ../lib
- 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