1. 程式人生 > >Ubuntu16.04+Cuda8.0+cuDNN6配置py-faster rcnn(轉)

Ubuntu16.04+Cuda8.0+cuDNN6配置py-faster rcnn(轉)

原部落格地址:https://blog.csdn.net/meccaendless/article/details/79557162

0前言
Faster R-CNN是任少卿2015年底推出的目標檢測演算法 ,時至今日依舊還是Object Detection領域最好方法之一,基於該框架後續推出了 R-FCN,Mask R-CNN 等改進框架,但基本結構變化不大。同時不乏有SSD,YOLO2等骨骼清奇的新作,雖然在速度上大幅度領先Faster R-CNN,尤以SSD lite和yolo lite為甚, 但精度上依然以Faster R-CNN為最好。對於一般的detector問題,只需在ImageNet pre-train model上進行若干次 fine-tune,就能得到非常好的效果。

        Faster R-CNN 主要由三個部分組成:(1)基礎特徵提取網路(2)RPN (Region Proposal Network) (3)Fast-RCNN 。其中RPN和Fast-RCNN共享特徵提取卷積層,思路上依舊延續提取proposal + 分類的思想。後人在此框架上,推出了一些更新,也主要是針對以上三點。有關改進總結和理解參考以下三篇部落格:

http://blog.csdn.net/z5337209/article/details/72838049

http://blog.csdn.net/linolzhang/article/details/74159463

http://blog.csdn.net/linolzhang/article/details/75137050

1配置基本環境
1. 硬體環境:

i5 6500 四核四執行緒

NVIDIA GTX1080TI

16G RAM

2. 軟體基礎環境:

ubuntu 16.04 LTS

CUDA 8.0 + cuDNN6.0

需要注意的是:

(1)有關顯示卡驅動,cuda和cudnn安裝參考這裡。需要注意的是拆顯示卡裝ubuntu的步驟,筆者在某些機器上安裝ubuntu時出現黑屏才採取此下策,若已經裝好ubuntu,直接正常安裝cuda即可。

(2)還需注意的是,筆者沒有測試py-faster rcnn是否支援cuda9.1和cuDNN7,還是採用了保守的cuda8.0+cudnn6.0。其實py-faster rcnn支援的是cudnn 4,所以即使採用cudnn6.0也需要做一些修改,具體請看下文。

(3)cuda8.0預設的驅動版本是375,需要修改/NVIDIA_CUDA-8.0_Samples/3_Imaging/cudaDecodeGL/findgllib.mk file檔案,否則會報錯,參考這裡。

到此為止,還需安裝opencv3.1,caffe,python以及numpy等依賴項,參考下文介紹。

2安裝依賴項
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
      build-essential \
      cmake \
      git \
      libgoogle-glog-dev \
      libprotobuf-dev \
      protobuf-compiler \
      python-dev \
      python-pip                          
sudo pip install numpy protobuf
sudo apt-get install -y --no-install-recommends libgflags-dev

其它依賴項
sudo apt-get install -y --no-install-recommends \
      libgtest-dev \
      libiomp-dev \
      libleveldb-dev \
      liblmdb-dev \
      libopencv-dev \
      libopenmpi-dev \
      libsnappy-dev \
      openmpi-bin \
      openmpi-doc \
      python-pydot
sudo pip install \
      flask \
      graphviz \
      hypothesis \
      jupyter \
      matplotlib \
      pydot python-nvd3 \
      pyyaml \
      requests \
      scikit-image \
      scipy \
      setuptools \

      tornado


3.opencv安裝
安裝必要的庫

sudo apt-get -y remove ffmpeg x264 libx264-dev
sudo apt-get -y install libopencv-dev build-essential checkinstall cmake pkg-config yasm libtiff4-dev libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev x264 v4l-utils ffmpeg libgtk2.0-dev
點這裡下載OpenCV3.1.0版本,下載tar.gz壓縮包,進行解壓,解壓之後進入opencv3.1目錄,建立要編譯的build目錄,然後進入build目錄進行編譯:

cd ~/opencv-3.1.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
由於國內網路原因,cmake過程可能會出現如下以下錯誤:

 ICV: Downloading ippicv_linux_20151201.tgz…

在直接下載該檔案的過程中,會因為超時而失敗,可以下載ippicv_linux_20151201.tgz, 並替換掉 opencv-3.1.0/3rdparty/ippicv/downloads/linux-8b449a536a2157bcad08a2b9f266828b下的同名檔案,然後再次cmake即可。

生成編譯檔案之後,在opencv-3.1.0/build目錄下,終端輸入:

make -j4
sudo make install
接著配置環境變數:

sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
編譯make opencv時可能以下錯誤:

/opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp:120:54: error: ‘NppiGraphcutState‘ has not been declared typedef NppStatus (*init_func_t)(NppiSize oSize, NppiGraphcutState** ppStat

.......

這是由於opencv3.1不支援cuda8.0的原因,解決方案:
進入opencv-3.1.0/modules/cudalegacy/src/目錄,修改graphcuts.cpp檔案

<span style="color:#990000;">cd ~/opencv-3.1.0/modules/cudalegacy/src
sudo gedit ./graphcuts.cpp</span>
將:

#include "precomp.hpp"

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)

改為
#include "precomp.hpp"
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
然後make編譯就可以了

安裝完畢後終端輸出:

pkg-config --modversion opencv
若輸出opencv版本號則說明安裝成功。

4安裝python
用系統自帶的python2.7即可,需要再裝一些依賴項:

sudo apt-get install python-numpy python-scipy python-matplotlib python-qt4 qt4-designer pyqt4-dev-tools python-qt4-doc spyder cython swig python-sklearn python-skimage python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags ipython protobuf-c-compiler protobuf-compiler
sudo apt-get install python-pip
sudo pip install tornado pyzmq pygments
sudo apt-get install libzmq-dev
完成後終端輸入

ipython
檢視是否安裝成功。

5安裝caffe
首先安裝依賴

sudo apt-get update
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install build-essential cmake git pkg-config libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev python-dev
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libatlas-base-dev
然後github上clone 原始碼

git clone https://github.com/BVLC/caffe.git
cd到caffe根目錄,修改Makefile.conf檔案

cd caffe
cp Makefile.config.example Makefile.config
修改如下內容:

去掉第5行註釋 USE_CUDNN := 1
去掉第21行的註釋 OPENCV_VERSION := 3
去掉註釋 WITH_PYTHON_LAYER := 1
在 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include 後面新增 /usr/include /usr/include/hdf5/serial
在 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 後面新增 /usr/lib/x86_64-linux-gnu/hdf5/serial
實現caffe對Python和Matlab介面的支援 修改 PYTHON_LIB := /usr/local/lib
注意
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include和/usr/include /usr/include/hdf5/serial 有一個空格,
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib同理
cuda8.0編譯器問題,開啟/usr/local/cuda/include/host_config.h ,將:

#error -- unsupported GNU version! gcc versions later than 5.3 are not supported!
註釋掉,即:

//#error -- unsupported GNU version! gcc versions later than 5.3 are not supported!
最後編譯caffe

make all -j4
make test -j4
make runtest -j4
make pycaffe -j4
時間較長,耐心等待編譯完成。

6訓練MINST測試caffe
配置caffe完成後,用MNIST資料集對caffe進行測試

1.將終端定位到Caffe根目錄

cd ~/caffe
2.下載MNIST資料庫並解壓縮

./data/mnist/get_mnist.sh
3.將其轉換成Lmdb資料庫格式
./examples/mnist/create_mnist.sh
4.訓練網路

./examples/mnist/train_lenet.sh
訓練速度很快,幾十秒即可結束。

筆者參考了

http://blog.csdn.net/zem_nezer/article/details/56966964

的caffe配置方案,博主沒有使用cudnn,測試速度大概117 literations/s,使用cudnn後,速度可達850 literations/s。根據NVIDIA官方資訊,採用cuda9.1+cudnn7速度會更快,感興趣的同學可以嘗試一下是否能夠配置成功。
7部署faster rcnn
1. github clone原始碼

git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
2. 編譯Cython模型

cd py-faster-rcnn/lib
make
3. 替換caffe-fast-rcnn檔案,以支援cudnn6.0:

(1)用最新caffe原始碼的以下檔案替換掉faster 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)將 faster rcnn 中的 src/caffe/layers/cudnn_conv_layer.cu 檔案中的所有
  cudnnConvolutionBackwardData_v3 函式名替換為 cudnnConvolutionBackwardData
  cudnnConvolutionBackwardFilter_v3函式名替換為 cudnnConvolutionBackwardFilter

4.編譯Caffe和pycaffe

cd py-faster-rcnn/caffe-fast-rcnn
make -j8 && make pycaffe
5.下載faster-rcnn識別模型

cd py-faster-rcnn
./data/scripts/fetch_faster_rcnn_models.sh
由於國內網路問題,可能下載失敗,可以參考以下方法: 

FQ下載

https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz?dl=0

下載好後,將壓縮包放在 py-faster-rcnn/data/下解壓即可

6.測試demo

cd py-faster-rcnn
./tools/demo.py