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

时间:2022-10-28 10:22:44

原博客地址: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