caffe学习:Faster-RCNN调试及训练自己的数据集

 

参考官方的安装教程的同时,注意一些细节,由于我的服务器上之前跑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.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/CV_adventurer/article/details/72805852?utm_source=blogxgwz5
https://blog.csdn.net/hongbin_xu/article/details/76100132
https://blog.csdn.net/u014380165/article/details/72704604?utm_source=blogxgwz9
https://blog.csdn.net/m0_37973394/article/details/78900158
https://blog.csdn.net/akadiao/article/details/79834086
https://blog.csdn.net/awq520tt1314/article/details/72629867
https://blog.csdn.net/lhanchao/article/details/70807912

文章主要参考网上资料和GitHub教程,并结合个人见解,如有侵权,请联系博主删除,原创文章转载请注明出处。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值