1. 程式人生 > >r-cnn系列程式碼編譯及解讀(1)

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模式檢測結果