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


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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章