1. 程式人生 > >caffe學習(四):py-faster-rcnn配置,執行測試程式(Ubuntu)

caffe學習(四):py-faster-rcnn配置,執行測試程式(Ubuntu)

上一篇部落格中講了在Ubuntu下安裝caffe的經驗總結(各種問題,簡直懷疑人生了)。部落格連結:點我開啟
faster-rcnn有兩個版本,分別是Python的和MATLAB的。這裡介紹python版本的faster-rcnn的配置。
網上有很多相關的教程,起初我在配置時也被一些部落格坑了,這裡分享一下除錯和解決問題的過程。

下載工程

輸入指令:

git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
  • 1

由於Git的速度有點慢,所以可以選擇直接訪問他的網址,在github上直接下載。連結:點我開啟
這裡寫圖片描述
我是直接在github上下載的,下載完後發現了caffe-faster-rcnn資料夾中是空的。所以還需要另外下載caffe-faster-rcnn資料夾,可以選擇使用指令:

cd caffe-fast-rcnn
git submodule update --init --recursive
  • 1

或者直接點選,進入caffe-faster-rcnn,進行下載。下載後拷貝到py-faster-rcnn目錄下即可。
這裡寫圖片描述

安裝Caffe依賴包

安裝一些要用的依賴包,否則編譯時會報錯。

sudo apt-get install python-pip
sudo pip install cython  
sudo pip install easydict 
sudo apt-get install python-opencv

每個人裝的都不一樣,少了哪個就裝哪個吧。我編譯的時候少了easydict和python-

OpenCV,這塊問題不多,全部都會自動配置完成。
補充:有一個朋友安裝easydict時發現輸入指令後安裝成功,但是在python shell下import easydict報錯。這種情況可以重啟一下,再試試能不能正常import easydict。有可能是配置還沒立即生效。

編譯caffe

預設用$RCNN_ROOT表示下載下來的py-faster-rcnn目錄所在的路徑。

cd $RCNN_ROOT/lib
make -j8

-j8是使用多核編譯,這樣編譯速度快一點。

輸入指令:

先進入到caffe-fast-rcnn目錄下:

cd $RCNN_ROOT/caffe-fast-rcnn

複製Makefile.config.example為Makefile.config。

cp  Makefile.config.example  Makefile.config

編輯Makefile.config。

sudo gedit Makefile.config

在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

把前面的註釋去掉即可。
WITH_PYTHON_LAYER必須開,否則會報錯。
USE_CUDNN建議開,但是由於程式碼提供者的caffe版本是老版本的,沒有”與時俱進“,所以只相容CUDNN 較老版本的。我裝的是v5.0版本的,開了它就會報錯。
解決辦法有兩種:一、更換CUDNN的版本為老版本的v3.0或是v4.0的;二、註釋掉CUDNN那句程式碼,我是直接註釋掉了,使用也不影響。
推薦使用cuDNN,由於不想重新折騰CUDNN,我就沒有更換為老版本的。暫時還沒找到相對好的解決辦法,如果找到了其他會再補充。

—————————————————2017.7.30 補充————————————————-

我使用的是cuDNN v5版本,不能支援py-faster-rcnn。今天找到了一個不需要更換cuDNN,就能使cuDNN v5也能相容py-faster-rcnn。
參考連結:faster rcnn +cudnn V5
其中給出了兩種方法:
一種是到github去下載新版的caffe並將它與py-faster-rcnn中的caffe-faster-rcnn合併,更換成新版的caffe,使其支援cuDNN v5版本;
另一種是自己手動更改一些檔案,更改caffe的一些配置使其相容cuDNN v5。
第一種方法較簡單,但是一旦工程被修改過就很容易出錯,不推薦;所以我採用了第二種方法。

1、用最新版本的caffe原始碼目錄中的如下檔案替換py-faster-rcnn/caffe-fast-rcnn中的對應檔案。

include/caffe/layers/cudnn_relu_layer.hpp,
src/caffe/layers/cudnn_relu_layer.cpp,
src/caffe/layers/cudnn_relu_layer.cu

include/caffe/layers/cudnn_sigmoid_layer.hpp,
src/caffe/layers/cudnn_sigmoid_layer.cpp,
src/caffe/layers/cudnn_sigmoid_layer.cu

include/caffe/layers/cudnn_tanh_layer.hpp,
src/caffe/layers/cudnn_tanh_layer.cpp,
src/caffe/layers/cudnn_tanh_layer.cu

2、用caffe原始碼中的這個檔案替換掉faster rcnn 對應檔案

include/caffe/util/cudnn.hpp

3、開啟 py-faster-rcnn/caffe-fast-rcnn 中的 src/caffe/layers/cudnn_conv_layer.cu檔案,並將:

cudnnConvolutionBackwardData_v3
替換為
cudnnConvolutionBackwardData

cudnnConvolutionBackwardFilter_v3
替換為
cudnnConvolutionBackwardFilter

修改之後,即使不註釋USE_CUDNN := 1,在編譯時也不會報錯了。

修改完成之後就可以編譯了:

make -j8
make pycaffe -j8

編譯caffe工程和caffe的python支援,要等一會兒。
make完的結果:
這裡寫圖片描述
make pycaff完的結果:
這裡寫圖片描述

獲取faster_rcnn_models

輸入指令:

cd $RCNN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh

好了,這裡給出一個翻牆下載的方法,速度也還可以。
https://mm.ww.rrjs.pw/翻牆下載,這是一個網頁代理,在網頁輸入你想要訪問的地址,它會幫你跳轉到國外的網站去。
在網頁下輸入:
https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz?dl=0
這個url可以在fetch_faster_rcnn_models.sh中查到。
這裡寫圖片描述
點選開始瀏覽,即可進行下載了。我下載下來有728.6MB。
這裡寫圖片描述
把這個檔案移到$RCNN_ROOT/data下,將其解壓。
指令和結果截圖:
這裡寫圖片描述

獲取imagenet_models

方法同faster_rcnn_models。
網上通用的方法是:

cd $RCNN_ROOT
./data/scripts/fetch_imagenet_models.sh

如果有別的較快的翻牆手段的,或者自己買了vpn的,都可以直接輸入指令下載。
這裡寫圖片描述
檔案有1.1GB。把它複製到$RCNN_ROOT/data下,解壓。
指令和結果截圖:
這裡寫圖片描述

測試demo.py檔案

先直接執行demo.py看看吧:

cd $RCNN_ROOT
./tools/demo.py

我執行後出現了錯誤:

Loaded network /home/xhb/Study/Caffe_Study/py-faster-rcnn-master/data/faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel
F0726 11:58:39.877975  3897 syncedmem.cpp:56] Check failed: error == cudaSuccess (2 vs. 0)  out of memory
*** Check failure stack trace: ***
已放棄

意思是,在載入VGG16_faster_rcnn_final.caffemodel時出錯。查閱資料,發現這是因為gpu的視訊記憶體不夠。
如果是自己訓練和測試模型,可以去更改配置檔案中的batch_size,將test和train的batch_size都改為1。我們只是測試別人訓練的模型也沒法更改了。
起初我也很困惑,明明我的gpu視訊記憶體有4G,而這個要求的應該是3G,應該是可以的。試了很多方法,但是還是會報錯。

下面是官方給出的說明:

  • For training smaller networks (ZF, VGG_CNN_M_1024) a good GPU (e.g., Titan, K20, K40, …) with at least 3G of memory suffices
  • For training Fast R-CNN with VGG16, you’ll need a K40 (~11G of memory)
  • For training the end-to-end version of Faster R-CNN with VGG16, 3G of GPU memory is sufficient (using CUDNN)

退一步考慮,我們下載下來的faster_rcnn_models模型中有兩個:

VGG16_faster_rcnn_final.caffemodel  
ZF_faster_rcnn_final.caffemodel

VGG16是大型模型,而ZF模型則是較小的模型。
所以我們換成使用ZF模型進行測試。
方法一:
使用如下指令:

 ./tools/demo.py --net zf

方法二:
由於預設使用VGG16模型,所以修改為使用ZF模型。
開啟demo.py:
這裡寫圖片描述
定義了一個字典,有兩個模型,VGG16和ZF。
這裡寫圖片描述
修改vgg16為zf,這樣預設載入的就是zf的模型而不是vgg16的了。
這裡寫圖片描述
儲存一下,可以開始測試了。
輸入指令:

cd $RCNN_ROOT
./tools/demo.py

測試結果:
自動載入圖片進行測試,識別出的東西會用紅框標出。
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這次只是跑了一個faste-rcnn,依然還有很多問題,後面解決了還會補上解決方案。
我使用的是gpu版本的caffe,如果要使用CPU版本的caffe,可以參考這篇部落格:ubuntu16.04+py-faster-rcnn+ZF執行demo.py。 修改一些東西,使用步驟大致一樣。

—————————————————2017.7.30 補充————————————————-

今天我在文章中補充了cuDNN v5不相容的解決辦法。
之前我跑vgg16的模型總是說視訊記憶體不夠,最後選擇了使用zf模型,在我今天開啟了cuDNN後重新編譯了caffe,重新執行發現能夠正常使用vgg16的模型了。
總結一下:
我的筆記本帶的gpu記憶體是4G。
只有開啟了cuDNN支援後,要求gpu至少有3G的視訊記憶體,可以正常使用vgg16、zf等模型;
若不開啟cuDNN支援,編譯也可以正常通過,但是隻有zf可以使用,使用vgg16模型會報錯,提示視訊記憶體不夠。
執行VGG16模型的結果:
這裡寫圖片描述