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 runtest時遇到錯誤。
Unknown V1LayerParameter Layer type: 40
5.將Matlab的安裝路徑添加到PATH中
先打開.bashrc文件,
- sudo vim ~/.bashrc
- 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
通過命令“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提到的完全一樣,因此我採納了文中的建議,執行了下面的命令,(感謝)
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
I = imread('../../examples/images/cat.jpg');
[scores, maxlabel] = classification_demo(I, 0);
- 1
- 2
- 1
- 2
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
第四步:配置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