Ubuntu16.04+MATLAB2014a+faster-rcnn的CPU安装-3

100 篇文章 8 订阅
44 篇文章 0 订阅


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快速启动项.

sudo apt-get install matlab-support
 
 

安装后根据提示输入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.见我前一篇博文,修改和那个一样。

修改完成后,执行如下命令:

make clean
make all
make test
make runtest
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
采用并行的方式可以更快地完成编译过程,只需使用`make all -j8`命令。其中数字8表示并行线程的数目,建议将该线程数目修改为机器的内核数。

make runtest时遇到错误。

Unknown V1LayerParameter Layer type: 40


\src\caffe\util下的upgrade_proto.cpp中添加Reshape,ROIPooling和SmoothL1Loss共3层。在添加时注意缩进格式要正确,我在添加SMOOTH_L1_Loss层时,改成SMOOTH_L1_LOSS就编译成功了。此时运行make runtest 即可。见下图。

5.将Matlab的安装路径添加到PATH中

先打开.bashrc文件,

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. sudo vim ~/.bashrc   
在该文件末尾加入如下语句 
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. export PATH=$PATH:/usr/local/R2016b/bin  //自己的安装路径

为了能够在Matlab中正常使用,还需执行以下命令编译MATLAB接口。

make matcaffe
 
 
  • 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

[plain] view plain copy
  1. sudo cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 /usr/local/MATLAB/R2014a/sys/os/glnxa64/libstdc++.so.6.0.21  //这里换成自己MATLAB的安装路径
  2. cd /usr/local/MATLAB/R2014a/sys/os/glnxa64  
  3. sudo mv libstdc++.so.6 libstdc++.so.6.backup  
  4. sudo ln -s libstdc++.so.6.0.21 libstdc++.so.6  
  5. sudo ldconfig -v  

通过命令“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提到的完全一样,因此我采纳了文中的建议,执行了下面的命令,(感谢)

出现问题的原因:编译caffe时候的库与编译matlab相关的库版本不一样。错误原因是Matlab自带的库和Ubuntu的系统库之间发生了冲突,PS:只替换库libstdc++.so.6是不行的,要解决此问题需要多替换几个库。问题见https://github.com/kyamagu/mexopencv/issues/62#issuecomment-15054244。引用他的方法

Alright, then you need to make sure your shared object is loaded in matlab as expected. Repeat the following steps to find a missing dependency.

Use ldd in unix shell.

$ ldd /home/aej/Downloads/mexopencv/+cv/private/FeatureDetector_.mexa64

Use ldd in matlab shell.

>> !ldd /home/aej/Downloads/mexopencv/+cv/private/FeatureDetector_.mexa64

Find any difference in the loaded libraries. Usually such libraries are causing error. If you find any, such as libstdc++ or libgcc_s, put them in the LD_PRELOAD variable before launching matlab.

LD_PRELOAD=/usr/lib/libstdc++.6.so matlab

If you still cannot solve this issue, I suspect your opencv installation is missing something.

可以通过 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的路径添加进来,便于加载。

addpath('./matlab/+caffe/private');
 
 
  • 1
  • 1
切换到`matlab/demo/`目录下,执行如下命令来测试示例:
I = imread('../../examples/images/cat.jpg');
[scores, maxlabel] = classification_demo(I, 0);
 
 
  • 1
  • 2
  • 1
  • 2
需要特别注意,classification_demo(I, 0)函数中的0表示使用CPU,如果改为1则表示GPU。执行成功后,将会返回如下信息:
Elapsed time is 0.025054 seconds.
Elapsed time is 1.069503 seconds.
Cleared 0 solvers and 1 stand-alone nets
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
其中maxlabel=282,表示具有最大分类概率的是第282个类别。输入`figure;plot(scores);`显示所有类别上的分类概率,


第四步:配置faster-rcnn

Faster R-CNN的配置和运行十分简单,启动Matlab,切换到faster_rcnn目录下。运行faster_rcnn_build.m,在仅使用CPU的情况下,Compiling nms_gpu_mex时会出错[4]。但是其他能够编译成功,这里不用担心。

run faster_rcnn_build.m
run startup.m
 
 
  • 1
  • 2
  • 1
  • 2

获取训练好的模型,可以通过执行文件下载:

run fetch_data/fetch_faster_rcnn_final_model.m
 
 
  • 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。以下是修改后的代码,

%% -------------------- CONFIG --------------------
opts.caffe_version          = 'caffe_faster_rcnn';
% opts.gpu_id                 = auto_select_gpu;
% active_caffe_mex(opts.gpu_id, opts.caffe_version);

opts.per_nms_topN           = 6000;
opts.nms_overlap_thres      = 0.7;
opts.after_nms_topN         = 300;
opts.use_gpu                = false;

opts.test_scales            = 600;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

此外,由于VGG16模型较大,运行过程中会崩溃,因此将模型改为ZF,修改后如下:

% model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_vgg_16layers'); %% VGG-16
model_dir = fullfile(pwd, 'output', 'faster_rcnn_final', 'faster_rcnn_VOC0712_ZF'); %% ZF
 
 
  • 1
  • 2
  • 1
  • 2

至此,修改完毕。执行该程序,能够正常运行说明测试成功。我的处理器是Intel® Core™ i7-2600 CPU @ 3.40GHz × 8 ,输出如下信息:

001763.jpg (500x375): time 3.258s (resize+conv+proposal: 2.452s, nms+regionwise: 0.806s)
004545.jpg (500x375): time 4.073s (resize+conv+proposal: 2.543s, nms+regionwise: 1.530s)
000542.jpg (500x375): time 3.064s (resize+conv+proposal: 2.526s, nms+regionwise: 0.538s)
000456.jpg (500x375): time 3.757s (resize+conv+proposal: 2.497s, nms+regionwise: 1.259s)
001150.jpg (500x375): time 3.400s (resize+conv+proposal: 2.481s, nms+regionwise: 0.919s)
mean time: 3.510s
Cleared 0 solvers and 2 stand-alone nets



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值