前言
RFCN和faster rcnn算法模型原理非常类似,也有RPN,也是分两阶段来进行目标检测。主要不同点就是RFCN添加了Position Sensitive ROI Pooling层,这样使得ROI Pooling前已经带有位置信息,后面只需要做分类即可。基于这一改变,使得后面全连接层可以省略掉,模型size减少很多,计算量大为减少,从而效率提高了,而准确度还能和faster rcnn相当。
代码下载和编译
1)下载RFCN代码
git clone https://github.com/Orpine/py-R-FCN.git
2) 下载对应得caffe代码
cd py-R-FCN
git clone https://github.com/Microsoft/caffe.git
3)编译Cython
cd xx/py-R-FCN/lib
make
这个时候会遇到cuda located error,需要修改setup.py,具体参考我的博客:https://blog.csdn.net/ltshan139/article/details/99868686
4)编译caffe
cd xx/py-R-FCN/caffe
cp Makefile.config.example Makefile.config
sudo make clean
sudo make -j8
sudo make pycaffe -j8
在编译前需要对Makefile.config进行修改, 而且会遇到cudnn版本过低的问题,具体还是参考上面提到的博客
另外,在用opencv3.4编译caffe example时,可能会遇到一个opencv api没有定义的bug:
undefined reference to `cv::Mat::updateContinuityFlag()
其解决办法就是不要编译它即可,毕竟不影响功能使用:
sudo mv examples/cpp_classification/classification.cpp examples/cpp_classification/classification.cpp1
5)如果上面这几步都ok了,可以运行demo来验证下。
直接运行下面这个脚本就运行的是ResNet101模型:sudo ./tools/demo_rfcn.py
如果想运行ResNet50,则这么输入:sudo ./tools/demo_rfcn.py --net ResNet-50
训练自己的数据集
我们的重点是训练自己的数据集
1)数据集准备和faster rcnn类似,也是采用VOC格式,具体参考:https://blog.csdn.net/ltshan139/article/details/100087559
2)修改训练和测试相关配置文本文件,因为是采用ohem方式,所以只需要修改下面这些,主要是class num修改成自己数据集对应值,具体可以参考其他人的博客。
cd py-R-FCN/models/pascal_voc/ResNet-50/rfcn_end2end/
3) 修改迭代次数以及class names
vi ./experiments/scripts/rfcn_end2end_ohem.sh #修改迭代次数以及正确的train和test数据目录名称
vi py-R-FCN/lib/datasets/pascal_voc.py #修改class names
4)训练过程中,如果遇到'module' object has no attribute 'text_format',
请参考https://blog.csdn.net/ltshan139/article/details/100068916
5)最后,执行训练:
sudo ./experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc
6)模型训练出来后,可以单独使用下面命令来测试:
sudo ./tools/test_net.py --gpu 0 --def models/pascal_voc/ResNet-50/rfcn_end2end/test_agnostic.prototxt --net output/rfcn_end2end_ohem/voc_2007_trainval/resnet50_rfcn_ohem_iter_150000.caffemodel --imdb voc_2007_test --cfg experiments/cfgs/rfcn_end2end_ohem.yml