这里运行的是Python版本的代码。
1.下载代码
git clone https://github.com/Orpine/py-R-FCN.git
2.克隆caffe
cd py-R-FCN
git clone https://github.com/Microsoft/caffe.git #Microsoft的源
3.编译Cython模块
cd ~/py-R-FCN/lib
make
4.编译caffe和pycaffe
这里Makefile.config要支持Python,修改~/py-R-FCN/caffe/Makefile.config
WITH_PYTHON_LAYER := 1cd ~/py-R-FCN/caffe
cp Makefile.config.example Makefile.config
make -j8 && make pycaffe
这里可能遇到的问题及解决:
1问题:.src/caffe/net.cpp:8:18: fatal error: hdf5.h: 没有那个文件或目录
解决:
Step 1
在Makefile.config文件的第85行,添加/usr/include/hdf5/serial/ 到 INCLUDE_DIRS,也就是把下面第一行代码改为第二行代码。
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
Step 2
在Makefile文件的第173行,把 hdf5_hl 和hdf5修改为hdf5_serial_hl 和 hdf5_serial,也就是把下面第一行代码改为第二行代码。
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
如果还没解决,则:
find /usr-iname"*hdf5.h*"
/usr/include/hdf5/serial/hdf5.h
export CPATH="/usr/include/hdf5/serial/"
然后 make clean
make -j8
2.问题:
ImportError:../lib/libstdc++.so.6: version `GLIBCXX_3.4.21'not found (required by/home/py-R-FCN/tools/../caffe/python/caffe/_caffe.so)
解决:
/py-R-FCN/tools$ find / -name"libstdc++.so*"
cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21/home/anaconda2/bin/../lib
cd /home/anaconda2/bin/../lib
ln -s libstdc++.so.6.0.21 libstdc++.so.6
strings/home/anaconda2/bin/../lib/libstdc++.so.6 | grep GLIBC
3.问题
ImportError: /home/xianglei/anaconda2/bin/../lib/libgomp.so.1: version `GOMP_4.0' not found (required by /usr/lib/x86_64-linux-gnu/libsoxr.so.0)
解决
~/py-R-FCN/tools$ cp /usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so /home/anaconda2/bin/../lib
cd /home/anaconda2/bin/../lib
rm -rf libgomp.so.1
ln -s /usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so libgomp.so.1
strings /home/anaconda2/bin/../lib/libgomp.so.1
4.问题
ImportError: No module named google.protobuf.internal
解决
pip install -i https://pypi.douban.com/simple protobuf
5.下载resnet caffemodel
从百度网盘下载rfcn_models ResNet-50 net [BaiduYun](http://pan.baidu.com/s/1kVm4ly3)
ResNet-101 net[BaiduYun](http://pan.baidu.com/s/1nvgu1pJ)
解压后将其中的文件ResNet-50-model.caffemodel和ResNet-101-model.caffemodel改名后放到:py-R-FCN/data下
即得到如下目录:
~/py-R-FCN/data/rfcn_models/resnet50_rfcn_final.caffemodel
~/py-R-FCN/data/rfcn_models/resnet101_rfcn_final.caffemodel
6.运行demo(别人训练好的R-FCN模型)
python ~/py-R-FCN/tools/demo_rfcn.py --net ResNet-50
python ~/py-R-FCN/tools/demo_rfcn.py --net ResNet-101
7.准备训练自己的模型和测试
准备数据,这里使用VOC2007和VOC2012,下载地址https://pjreddie.com/projects/pascal-voc-dataset-mirror/
下载后,修改命名得:~/py-R-FCN/data/VOCdevkit2007/
~/py-R-FCN/data/VOCdevkit2012/
论文中作者将VOC2007和VOC2012的训练集合并作为模型训练集,所以需要新建一个文件夹VOC0712,合并后的目录应该是这样的:
$VOCdevkit/VOC2007
$VOCdevkit/VOC2012
$VOCdevkit/VOC0712
- 1
- 2
- 3
这里git上还有一步是这么写的:
cd $RFCN_ROOT/data
ln -s $VOCdevkit VOCdevkit0712
- 1
- 2
这个命令是什么意思呢?其实就是你把下载好的数据放在:
$VOCdevkit
- 1
这个目录,这个目录一般而言是个公共目录,这样其他算法才能比较方便地使用这个数据集,但是该算法的默认数据集存放位置是:
$RFCN_ROOT/data
- 1
下面,那怎么办呢?那就在$RFCN_ROOT/data
目录下建立$VOCdevkit
的索引,运行这个命令后就可以看到在$RFCN_ROOT/data
目录下有数据集了,名字为VOCdevkit0712。因此这种做法就是为了避免重复拷贝数据占用空间。
8.下载ImageNet 与预训练的ResNet-50和ResNet-100
(在KaimingHe的github https://github.com/KaimingHe/deep-residual-networks )
mkdir ~/py-R-FCN/data/imagenet_models
将model放到该目录得:
~/py-R-FCN/data/imagenet_models/ResNet-50-model.caffemodel
~/py-R-FCN/data/imagenet_models/ResNet-101-model.caffemodel
9.可自己修改模型,类别,修改相应的~/py-r-fcn/py-R-FCN/models/pascal_voc/目录下对应的文件和~/py-r-fcn/lib/datasets/pascal_voc.py。笔者这里还是使用默认的。
10.修改迭代次数
vi ~/py-r-fcn/experiments/scripts/rfcn_end2end_ohem.sh
把pascal_voc的ITERS 调小
笔者这里还是使用默认的。
11.训练
cd ~/py-R-FCN/
./experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc
这个命令表示采用end2end的方式训练,剩下的参数表示GPU的id是0,模型采用ResNet-50,数据集采用pascal_voc,详情可以看rfcn_end2end.sh
这里需要等几小时。
此处可能遇到的问题:'module' object has no attribute 'text_format'
解决:pip install -i https://pypi.douban.com/simple protobuf==2.6.0或者用以下解决方案:
解决:因为R-FCN用到Fast RCNN相关内容,报错显示找不到text_format,所以在~/py-R-FCN/lib/fast_rcnn/train.py文件里面添加一行:
import google.protobuf.text_format
12.测试
将训练好的模型~/py-R-FCN/output/rfcn_end2end_ohem/voc_0712_trainval/resnet50_rfcn_ohem_iter_x.caffemodel,放到 ~/py-R-FCN/data/rfcn_models 下:
cp -r /home/xianglei/py-R-FCN/output/rfcn_end2end_ohem/voc_2007_trainval+voc_2012_trainval/
resnet50_rfcn_ohem_iter_80000.caffemodel
/home/xianglei/py-R-FCN/data/rfcn_models/
修改~/ py-R-FCN/tools/demo_rfcn.py的NETS,
NETS = {'ResNet-101': ('ResNet-101',
'resnet101_rfcn_final.caffemodel'),
'ResNet-50': ('ResNet-50',
'resnet50_rfcn_ohem_iter_10000.caffemodel')}
运行python ~/py-R-FCN/tools/demo_rfcn.py --net ResNet-50