r-cnn系列程式碼編譯及解讀(1)
本系列針對RBG在github上的fast r-cnn程式碼,做安裝配置及解讀工作
本文解決由於CAFFE版本的更新導致的fast r-cnn編譯失敗的問題
相關檔案下載
假定機器已經安裝配置好caffe環境(最新的版本使用CUDA8 + cudnn5,這個需要確定,之後的編譯錯誤就是因為這個原因)
1)git clone –recursive https://github.com/rbgirshick/fast-rcnn.git 下載工程檔案,使用引數recursive是為了同時clone caffe-fast-rcnn目錄下的檔案(作者基於caffe修改的版本)
2)下載模型檔案fast_rcnn_models.tgz
官方是通過指令碼data/scripts/fetch_fast_rcnn_models.sh自動下載,但國內地址訪問不了
下載的檔案解壓縮到data/fast_rcnn_models下
編譯
1)首先編譯Cython模組
cd $FRCN_ROOT/lib
make
2)修改FRCN_ROOT/caffe-fast-rcnn/Makefile.config檔案
解除以下內容註釋:
USE_CUDNN := 1
WITH_PYTHON_LAYER := 1 #如果不解除會在train時提示“Unknown layer type: Python”
修改以下內容:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
3)按官方步驟,此時編譯作者修改過的caffe就好了
cd $FRCN_ROOT/caffe-fast-rcnn
make -j8 && make pycaffe
但由於作者是在cudnn4的caffe上做的修改,對於預裝cudnn5的機器,編譯會出錯
文章faster rcnn +cudnn V5給出了兩種解決方案
本文參考第2種方法:
用最新的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
include/caffe/layers/cudnn_conv_layer.hpp
src/caffe/layers/cudnn_conv_layer.cpp
src/caffe/layers/cudnn_conv_layer.cu
include/caffe/util/cudnn.hpp
需要說明的是,fast r-cnn 官方caffe程式碼裡沒有 FRCN_ROOT/caffe-fast-rcnn/include/caffe/layers 目錄
索性從最新caffe程式碼裡全部copy過來
然後 make -j8 && make pycaffe,成功編譯
執行demo
官方給了3個caffemodel:caffenet、vgg16和vgg_cnn_m_1024
# 預設使用vgg16, gpu
python FRCN_ROOT/tools/demo.py
在這裡執行demo不出現檢測結果,除錯程式碼發現網路對background的概率接近1,其他目標接近0
相同的問題在github上有人提出
經過測試發現,如果改為CPU模式,能成功檢測出結果。截至目前還不知道原因
圖1. CPU模式檢測結果