参考官方的安装教程的同时,注意一些细节,由于我的服务器上之前跑openpose,因为Anaconda包含与Caffe不兼容的Protobuf版本,所以一直不敢装anaconda。但是跑Faster-RCNN的时候又发现自己安装的python环境,那些第三方库又老是出现不兼容的问题,无奈我还是得投奔anaconda的怀抱,经过了解anaconda还可以装虚拟环境,真的很强大。废话不多说了,开始动工~
Faster-RCNN官方教程:https://github.com/rbgirshick/py-faster-rcnn#requirements-software
运行环境:Ubuntu14.04,Caffe,cudnn,cuda8.0
由于我的环境都是现成的,所以直接上手运行demo。
一、运行demo
1、命令行下载Faster R-CNN
# Make sure to clone with --recursive
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git [目录]
后面加一个目录,就可以克隆到你想放的目录下来;我就把文件下载到了py-faster-rcnn文件里。
2、拷贝并修改Makefile.config文件
cd $FRCN_ROOT/caffe-fast-rcnn
cp Makefile.config.example Makefile.config
注意FRCN_ROOT是你下载的文件总目录。
下面修改Makefile.config文件
# In your Makefile.config, make sure to have this line uncommented
WITH_PYTHON_LAYER := 1
# Unrelatedly, it's also recommended that you use CUDNN
USE_CUDNN := 1
因为使用Anaconda带的库进行make.将 Makefile.config 里面的设置修改为:
ANACONDA_HOME := $(HOME)/anaconda2
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
PYTHON_LIB := $(ANACONDA_HOME)/lib
3、建立Cython模块
cd $ FRCN_ROOT / lib
make
4、编译 Caffe 和 pycaffe
cd $FRCN_ROOT/caffe-fast-rcnn
make -j`nproc` && make pycaffe
5、下载预训练好的 Faster R-CNN detectors
cd $FRCN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh
下载太慢,可以用迅雷或者百度云下载,链接: https://pan.baidu.com/s/1U1bPGnYuTvskDXu62r41iw 提取码: fbhn
把文件移到$RCNN_ROOT/data下,并将其解压。
除了获取获取Faster R-CNN预训练好的模型外,还可以用下载训练好的imagenet_model进行演示,详情见https://blog.youkuaiyun.com/hongbin_xu/article/details/76100132
6、python环境及第三方库
这里推荐anaconda2或者3都行,我这里直接用anaconda2,演示的时候直接使用默认的root虚拟环境就好了。
这里安装的是Anaconda2-4.4.0-Linux-x86_64.sh,推荐清华镜像https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
官方提醒我们安装的包有Cython
,easydict,python-opencv。Cython安装包anaconda2中已经有了,主要安装后面两个。
easydict安装:
conda install -c https://conda.anaconda.org/auto easydict
python-opencv安装:
conda install --channel https://conda.anaconda.org/menpo opencv3
7、运行demo.py
cd $FRCN_ROOT
./tools/demo.py
demo展示的是使用在PASCAL VOC 2007上训练的VGG16网络来进行目标检测的结果。运行结果如下图所示:
8、遇到问题
8.1、faster-rcnn与cuda8.0不兼容的问题
1.将./include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现,即相应的cudnn.hpp.
2. 将./include/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_conv_layer.hpp。 都替换成最新版的caffe里的相应的同名文件。注意是layers文件中有的文件才替换,faster-rcnn里面只有16个cudnn开头的文件,你放进去18个就错了。
3.将./src/caffe/layer里的,所有以cudnn开头的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu。
都替换成最新版的caffe里的相应的同名文件。
8.2、make -j`nproc` && make pycaffe的时候出错
/usr/bin/ld: warning: libjpeg.so.9, needed by /home/w/anaconda2/lib/libopencv_imgcodecs.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libpng16.so.16, needed by /home/w/anaconda2/lib/libopencv_imgcodecs.so, not found (try using -rpath or -rpath-link)
发现是找不到libpng16.so.16与libjpeg.so.9文件.打开anaconda中的~/anaconda2/lib路径,发现anaconda下有libpng16.so.16与libjpeg.so.9,于是进行如下操作:
cd /usr/lib/x86_64-linux-gnu
sudo ln -s ~/anaconda2/lib/libpng16.so.16 /usr/lib/
sudo ln -s ~/anaconda2/lib/libjpeg.so.9 /usr/lib/
sudo ldconfig
为libpng16.so.16与libjpeg.so.9文件在/usr/lib/下建立一个同步的软链接即可。
8.3、运行demo.py的时候出现问题
from nms.cpu_nms import cpu_nms
ImportError: /media/jing/000A9C35000B43B9/py-faster-rcnn/tools/../lib/nms/cpu_nms.so: undefined symbol: PyFPE_jbuf
解决:$FRCN_ROOT/lib/fast_rcnn里找到nms_wrapper.py:注释一句话from nms.cpu_nms import cpu_nms,然后运行就正常了。
解决:$ FRCN_ROOT / lib / fast_rcnn里找到nms_wrapper。从nms.cpu_nms导入cpu_nms,然后运行就正常了。
二、训练PASCAL VOC 2007的数据集
1、下载训练、验证以及测试集和VOCdevkit
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
2、解压
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.ta
将VOCdevkit改名为VOCdevkit2007,然后放到data文件夹下。也可以使用软连接的方式,不用挪动数据集。
cd $FRCN_ROOT/data
ln -s $your_dataset_home/VOCdevkit VOCdevkit2007
3、下载预先训练过的ImageNet模型
下载预训练好的ImageNet模型:ZF和VGG16
cd $FRCN_ROOT
./data/scripts/fetch_imagenet_models.sh
4、训练数据
使用交替优化(alternating optimization)算法来训练和测试Faster R-CNN
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
参数表明使用第一块GPU(0);模型是ZF;训练数据是pascal_voc(voc2007)。
输出写在下面$FRCN_ROOT/output文件夹,训练过程如图:
5、遇到问题
5.1 问题1
File "trainval_net.py", line 27, in
from roi_data_layer.roidb import combined_roidb
File " /home/py-faster-rcnn.../lib/roi_data_layer/roidb.py", line 9, in
from datasets.factory import get_imdb
File " /home/py-faster-rcnn.../lib/datasets/factory.py", line 15, in
from datasets.coco import coco
File " /home/py-faster-rcnn.../lib/datasets/coco.py", line 23, in
from pycocotools.coco import COCO
File " /home/py-faster-rcnn.../lib/pycocotools/coco.py", line 58, in
import mask
File " /home/py-faster-rcnn.../lib/pycocotools/mask.py", line 3, in
import pycocotools._mask as _mask
ImportError: /home/py-faster-rcnn.../lib/pycocotools/_mask.so: undefined symbol: PyFPE_jbuf
保证在对$FRCN_ROOT文件进行上述所有的指令都是在同一个python环境下,中途加入换了python环境或者换了第三方库就要重新对/lib目录和/caffe目录进行编译。我用conda的指令安装了
pycocotools这个第三方库,然后还进行其他很多操作,最后发现都不起作用,最后发现直接删除$FRCN_ROOT/lib/目录下的
pycocotools文件夹,就可以顺利开始训练数据了~真是玄学~~~
5.2 问题2
TypeError: 'numpy.float64' object cannot be interpreted as an index 还是numpy版本的问题,直接换一个版本好了 sudo pip install -U numpy==1.11.0
还有一种修改方式,可以参考https://blog.youkuaiyun.com/CV_adventurer/article/details/72805852?utm_source=blogxgwz5#4-%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98 关于numpy版本还报错的话,参考https://blog.youkuaiyun.com/awq520tt1314/article/details/72629867
5.3 问题3
voc_2007_test gt roidb loaded from /home/iim/mxguo/py-faster-rcnn/data/cache/voc_2007_test_gt_roidb.pkl
Traceback (most recent call last):
File "./tools/test_net.py", line 90, in <module>
test_net(net, imdb, max_per_image=args.max_per_image, vis=args.vis)
File "/home/iim/mxguo/py-faster-rcnn/tools/../lib/fast_rcnn/test.py", line 242, in test_net
roidb = imdb.roidb
File "/home/iim/mxguo/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 67, in roidb
self._roidb = self.roidb_handler()
File "/home/iim/mxguo/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 132, in selective_search_roidb
ss_roidb = self._load_selective_search_roidb(gt_roidb)
File "/home/iim/mxguo/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 166, in _load_selective_search_roidb
'Selective search data not found at: {}'.format(filename)
AssertionError: Selective search data not found at: /home/iim/mxguo/py-faster-rcnn/data/selective_search_data/voc_2007_test.mat
对$ FRCN_ROOT/py-faster-rcnn/lib/fast_rcnn和$ FRCN_ROOT/py-faster-rcnn/lib/py-faster-rcnn/lib/fast_rcnn目录下的config.py进行修改
__C.TRAIN.PROPOSAL_METHOD = 'selective_search'
__C.TRAIN.HAS_RPN = False
__C.TEST.HAS_RPN = False
改为:
__C.TRAIN.PROPOSAL_METHOD = 'gt'
__C.TRAIN.HAS_RPN = True
__C.TEST.HAS_RPN = True
5.4 问题4
在测试过程中还会遇到问题,faster rcnn BB = BB[sorted_ind, :] IndexError: too many indices for array
出现这个错误的原因是你的测试集中有的类别没有出现,在这里只需要在py-faster-rcnn/lib/datasets/voc_eval.py中BB = BB[sorted_ind, :]前一句加上if len(BB) != 0:即可。
6 测试小技巧
为了节约时间可以将迭代次数变小点,比如使用它推荐的max_iters = [100, 100, 100, 100]进行测试,看过程中有没有什么错误。
在更改max_iters的时候,还需要更改一下py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt里对应的solver文件(有4个)也修改,stepsize小于上面修改的数值。有博主说用[80000,40000,80000,40000]进行测试,分别对应rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段的迭代次数。大概16小时。我用[40000,20000,40000,20000]大概训练了7个小时。
三、参考
https://github.com/rbgirshick/py-faster-rcnn#requirements-software
https://blog.youkuaiyun.com/CV_adventurer/article/details/72805852?utm_source=blogxgwz5
https://blog.youkuaiyun.com/hongbin_xu/article/details/76100132
https://blog.youkuaiyun.com/u014380165/article/details/72704604?utm_source=blogxgwz9
https://blog.youkuaiyun.com/m0_37973394/article/details/78900158
https://blog.youkuaiyun.com/akadiao/article/details/79834086
https://blog.youkuaiyun.com/awq520tt1314/article/details/72629867
https://blog.youkuaiyun.com/lhanchao/article/details/70807912
文章主要参考网上资料和GitHub教程,并结合个人见解,如有侵权,请联系博主删除,原创文章转载请注明出处。