Faster R-CNN是当前目标检测领域内性能最好的算法之一,它将RPN(Region Proposal Network)网络和Fast R-CNN网络结合到了一起,实现了一个端到端的目标检测框架。作者Shaoqing Ren在github上公开了源代码,可以很方便地在自己的机器上进行测试。本文记录的是Ubuntu16.04下配置和测试Faster R-CNN的过程,其中包括Caffe的安装和编译过程,针对的是Matlab版和仅使用CPU的环境。
重点提醒:Faster R-CNN 的matlab接口,首先gcc,g++需要降级gcc到4.7(4.7才能编译MATLAB接口)或者看我的文章使用不降级的方法,Ubuntu 15.10以及Ubuntu 16.04 LTS 采用gcc 5.X编译器,GCC 4.9,4.7 和 GCC 5.x的C++ ABI(C++ 二进制兼容接口)不同,ABI::string 已经发生改变。因此,需要确保所链接的共享库具有兼容性!所以凡是export function中涉及到std::string, std::vector等的库,都必须用同一种编译器编译。 博主自己就是在make matcaffe之前步骤用的是5.3的g++,gcc,之后才想起降接口编译matcaffe,导致一系列,链接错误,未定义的函数,undefined reference to ‘xxx’ 错误。奔溃啊,找了很久才找到这个隐蔽错误。
我的是5.3,降到4.7.
sudo apt-get update
sudo apt-get install gcc-4.7
sudo apt-get install g++-4.7
改一下/usr/bin/
下的链接:
sudo ln -s /usr/bin/g++-4.7 /usr/bin/g++ -f
sudo ln -s /usr/bin/gcc-4.7 /usr/bin/gcc -f
下载linux版 matlab2014a
MATLAB链接: https://pan.baidu.com/s/1kVfu7w7 密码:bags
第一步:安装MATLAB
首先解压其中的rar压缩包,得到一个iso文件。
1:sudo mkdir ~/media/MATLAB ,用来挂载.iso文件,就跟windows里的虚拟光驱一样;
2:cd 到iso所在的路径;
3:sudo mount -o loop Matlab2014a.iso ~/media/MATLAB,把iso挂载到刚建的虚拟光驱中;
4:安装
$ cd ~/media/MATLAB
$ sudo ./install
等待安装,安装完成。
5:进行激活,到安装目录下运行
./activate_matlab
选择"install manually without using the internet"项进行安装
输入"破解文件的key文件的秘钥。
选择”license_R2015a.lic”文件进行激活
6:把crack的libmwservices.so复制到安装目录下的 /bin/glnxa64中:
$ sudo cp libmwservices.so ~/media/MATLAB/bin/glnxa64/libmwservices.so
7.使用
cd到安装目录下的bin文件夹,即./matlab运行程序,到此位置matlab已经可以使用,但是我们每次都需要进入安装目录的bin下启动,为了方便起见,可以在左边启动栏装一个matlab快速启动项.
安装后根据提示输入matlab的安装路径,确认即可,用户权限不填,表示所有人都可以用,gcc选否,然后可以在Dash中搜索到matlab。放到启动栏。
第二步 编译faster-rcnn中自带的caffe(不是通用版)的MATLAB借口
1.clone 源码:(推荐这种方式下载)
git clone --recursive https://github.com/ShaoqingRen/faster_rcnn
2. 在作者提供的百度云链接上下载训练好的模型,当然也可以"Run fetch_data/fetch_faster_rcnn_final_model.m
to download our trained models",不过速度会很慢.之后会用的。
3. 进入faster_rcnn/external/caffe,复制一份Makefile.config.example,重命名Makefile.config,
cd external/caffe
4. 修改Makefile.config文件,主要是加入matlab路径,注释cuda部分,不要gpc.见我前一篇博文,修改和那个一样。
修改完成后,执行如下命令:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
在make runtest时遇到错误。
Unknown V1LayerParameter Layer type: 40
![](http://www.th7.cn/d/file/p/2016/12/27/6b8060982f9882e5af98bc4a71142e57.jpg)
5.将Matlab的安装路径添加到PATH中
先打开.bashrc文件,
在该文件末尾加入如下语句为了能够在Matlab中正常使用,还需执行以下命令编译MATLAB接口。
- 1
- 1
之后在matlab/+caffe/private
目录下将会生成caffe_.mexa64文件,可以直接被Matlab调用。
在这里我要多说下,由于我之前通用caffe和faster-rcnn是用gcc,g++5.3编译的,并且python已经配好了,所以当看到说要降级到G++,gcc4.7才能编译matcaffe时,我也没有多想,就使用前面提到的方法进行降级,然后重新编译,结果make all时,一大堆错误,都是未定义之类的。Ubuntu 15.10以及Ubuntu 16.04 LTS 采用gcc 5.X编译器,GCC 4.9,4.7 和 GCC 5.x的C++ ABI(C++ 二进制兼容接口)不同,ABI::string 已经发生改变。因此,需要确保所链接的共享库具有兼容性!matlab所引用的库和caffe不同引起的(应该是gcc版本不同造成的),后来发现(真的找了很久)可以不用降级。因为降级的话,意味着之前gcc5.3编译的caffe和Python版都需重新编译,我的天啊!!所以使用下面的方法进行解决。感谢 http://blog.csdn.net/lee_j_r/article/details/52693724这文章。
暴力引用新版本GLIBCXX_3.4.21
通过命令“strings /usr/local/MATLAB/R2014a/sys/os/glnxa64/libstdc++.so.6 | grep GLIBCXX_” 可以看一下,是否已经成功包含了GLIBCXX_3.4.21,如果已经存在,基本上就成功了。虽然会有警告说gcc版本不一致,但最后还是编译成功了。
建议这种方法,4.7版本的gcc在make all 时都会出错,因为gcc-5.3编译caffe的。
6,测试MATLAB接口
在linux终端输入:make mattest
~/matlab_faster_rcnn/external/caffe$ make mattest
cd matlab; /matlabinstall/bin/matlab -nodisplay -r 'caffe.run_tests(), exit()'
要开始,请键入以下项之一: helpwin、helpdesk 或 demo。
有关产品信息,请访问 www.mathworks.com。
Invalid MEX-file
'/home/lsq/matlab_faster_rcnn/external/caffe/matlab/+caffe/private/caffe_.mexa64':
/home/lsq/matlab_faster_rcnn/external/caffe/matlab/+caffe/private/caffe_.mexa64:
undefined symbol:
_ZN2cv8imencodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_11_InputArrayERSt6vectorIhSaIhEERKSB_IiSaIiEE
出错 caffe.set_mode_cpu (line 5)
caffe_('set_mode_cpu');
出错 caffe.run_tests (line 6)
caffe.set_mode_cpu();
出现的错误与http://www.cnblogs.com/laiqun/p/6031925.html提到的完全一样,因此我采纳了文中的建议,执行了下面的命令,(感谢)
可以通过 ldd ./matlab/+caffe/private/caffe_.mexa64 查看其依赖了那些动态库,将其增加到你的 LD_PRELOAD中,见caffe官网 http://caffe.berkeleyvision.org/tutorial/interfaces.html#matlab,这个要视具体目录而定,我这边写了个脚本,如下:
1
2
3
4
|
export LD_LIBRARY_PATH= /usr/lib/x86_64-linux-gnu/ : /usr/local/cuda-8 .0 /lib64
LD_PRELOAD= /usr/lib/x86_64-linux-gnu/libopencv_highgui .so.2.4
: /usr/lib/x86_64-linux-gnu/libopencv_imgproc .so.2.4
: /usr/lib/x86_64-linux-gnu/libopencv_core .so.2.4
: /usr/lib/x86_64-linux-gnu/libstdc ++.so.6
: /usr/lib/x86_64-linux-gnu/libfreetype .so.6 matlab
|
注意:目录/usr/lib/x86_64-linux-gnu/是我的系统库目录。大家可以通过查询库所在位置来确定自己的系统库目录:
sudo find / -name libstdc++.so.6
第三步:测试caffe自身示例[2]
在正式测试前,需要下载训练好的caffemodel文件[3]。有两种方式,直接在浏览器里输入地址下载,也可以运行脚本文件下载。我选择直接用浏览器下载,下载地址如下:
http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
该模型文件243.9M,下载完成后将其拷贝到caffe根目录下的models/bvlc_reference_caffenet/
文件夹中。
接着启动Matlab,切换到caffe的根目录,将caffe_.mexa64的路径添加进来,便于加载。
- 1
- 1
- 1
- 2
- 1
- 2
- 1
- 2
- 3
- 1
- 2
- 3
第四步:配置faster-rcnn
Faster R-CNN的配置和运行十分简单,启动Matlab,切换到faster_rcnn目录下。运行faster_rcnn_build.m,在仅使用CPU的情况下,Compiling nms_gpu_mex时会出错[4]。但是其他能够编译成功,这里不用担心。
- 1
- 2
- 1
- 2
获取训练好的模型,可以通过执行文件下载:
- 1
- 1
个人建议直接通过作者github主页上的链接来下载模型,地址在主页最后一行给出,选择其一下载。
3.Final RPN+FastRCNN models: OneDrive, DropBox, BaiduYun
模型较大,下载完成后直接将其解压至faster_rcnn根目录下。
在experiments目录下有测试文件,因为只使用CPU,运行前需要将其设置为不使用GPU。
experiments/script_faster_rcnn_demo.m
文件中的第3、4行需要注释掉,第9行的opts.use_gpu改为false。以下是修改后的代码,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
此外,由于VGG16模型较大,运行过程中会崩溃,因此将模型改为ZF,修改后如下:
- 1
- 2
- 1
- 2
至此,修改完毕。执行该程序,能够正常运行说明测试成功。我的处理器是Intel® Core™ i7-2600 CPU @ 3.40GHz × 8 ,输出如下信息: