Ubuntu16.04+CUDA9.0+CUDNN7.0+Faster RCNN+Tensorflow1.5

这篇文章主要记录我在电脑上跑一下Faster RCNN的demo.py的艰辛路程。期间出现了无限问题,好在结果终于成功了。

Win10+Ubuntu16.04双系统安装

关于这部分网上有很多教程,这里就不放链接了。
简单的流程就是:

  1. 压缩一未分配空间(最好大于50G)
  2. UltraISO等软件,将Ubuntu系统写入U盘。
  3. 禁用安全启动和快速启动。
  4. U盘启动并逐步安装,与Win10并存。(执行第一步,系统会自动选择未分配空间。)
  5. 等待安装完成。
    [注]在安装Faster-R-cnn整个过程我安装了两次系统,期间遇到系统进不去系统,没有引导,最后在网上试了好多引导修复的软件都不行,进入PE系统,最后下载了一个某杀毒软件报毒的软件进去直接修复好了,哈哈,一般情况下是不会出现这样的情况的,放心安装吧

安装CUDA+CUDNN

安装显卡驱动

先执行

1
2
sudo apt-get update
sudo apt-get upgrade

在系统设置->软件更新->附加驱动里选择Nvidia最新驱动应用安装即可。
在终端执行nvidia-smi,确认是否驱动安装。

安装CUDA

我安装的是CUDA9.0,Tensorflow最新版已经支持CUDA9.0,下载安装后执行

1
2
3
4
sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda

然后在.bashrc文件里添加环境变量:

1
2
3
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda

在终端执行source ~/.bashrc即可生效。

安装CUDNN

安装CUDNN7.0 for CUDA9.0,选择Linux版本。下载(下载需要注册)后解压,然后执行

1
2
3
4
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ -d
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

安装Anaconda3

安装好了Ubuntu16.04(自带python2.7)后,我有下载安装了Anaconda3,anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,还包含了大量的科学包,方便实用,建议使用。

安装Tensorflow

创建新环境(python=2.7)

conda create -n tensorflow python=2.7
代码里tensorflow是环境名称,可以自己定义。
[注]因为执行网上Faster RCNN代码是用python2写的,python2和3不兼容会产生很多错误,建议安装python2.7,我在这里进了很大一个坑,先前安装的是python3.5版本,也把代码2到3过渡了一下,还是会出现很多错误,坑惨我了。

激活tensorflow环境

source activate tensorflow

安装tensorflow

1
2
sudo apt-get install python-pip python-dev
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.5.0-cp27-none-linux_x86_64.whl

安装后验证一下:

1
2
3
4
5
(tensorflow)$ python
>>import tensorflow as tf
>>a = tf.constant('Hello, TensorFlow!')
>>sess = tf.Session()
>>sess.run(a)

安装Opencv

安装系统依赖包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 移除先前安装的x264</h3>
sudo apt-get remove x264 libx264-dev
#安装依赖项
sudo apt-get install build-essential checkinstall cmake pkg-config yasm
sudo apt-get install git gfortran
sudo apt-get install libjpeg8-dev libjasper-dev libpng12-dev
# Ubuntu 14.04
sudo apt-get install libtiff4-dev
# Ubuntu 16.04
sudo apt-get install libtiff5-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt-get install libxine2-dev libv4l-dev
sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get install libqt5-dev libgtk2.0-dev libtbb-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev
sudo apt-get install libvorbis-dev libxvidcore-dev
sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get install x264 v4l-utils
# 可选依赖项,一般DL都需要
sudo apt-get install libprotobuf-dev protobuf-compiler
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

下载Opencv3.4.1和OpenCV_contrib

在浏览器上直接下载Opencv3.4.1OpenCV_contrib即可。

执行

1
2
3
cd opencv-3.4.1
mkdir build
cd build

执行

1
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 WITH_QT=ON -D WITH_OPENMP=ON -D BUILD_TIFF=ON -D BUILD_opencv_java=OFF -D OPENCV_EXTRA_MODULES_PATH=/home/dreamsong/software/opencv_contrib-3.4.1/modules -D WITH_OPENGL=ON ..

其中文件地址相应修改成你的文件目录即可。
-D WITH_OPENMP=ON要加上去,否则会出现Makefile:160: recipe for target 'all' failed问题。
进一步执行

1
2
3
4
make -j16 #16是线程,我电脑是8核16线程,所以写的16
sudo make install
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

制作软连接:

1
2
cd /home/dreamsong/software/anaconda3/envs/tensorflow/lib/python2.7/site-packages
ln -s /usr/local/lib/python2.7/dist-packages/cv2.so cv2.so

验证:

1
2
3
$python
>>import cv2
>>print cv2.__version__

Faster R-CNN运行demo.py

在这里有两个项目都可以运行:
TFFRCNNFaster-RCNN_TF,我选的是前者,后者操作没有差别。
解压后,修改make.sh为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env bash
TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')
echo $TF_INC
TF_LIB=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())')
# echo $TF_LIB
CUDA_PATH=/usr/local/cuda/
cd roi_pooling_layer
nvcc -std=c++11 -c -o roi_pooling_op.cu.o roi_pooling_op_gpu.cu.cc \
-I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC -arch=sm_52
## if you install tf using already-built binary, or gcc version 4.x, uncomment the two lines below
#g++ -std=c++11 -shared -D_GLIBCXX_USE_CXX11_ABI=0 -o roi_pooling.so roi_pooling_op.cc \
# roi_pooling_op.cu.o -I $TF_INC -fPIC -lcudart -L $CUDA_PATH/lib64
# for gcc5-built tf
#g++ -std=c++11 -shared -D_GLIBCXX_USE_CXX11_ABI=1 -o roi_pooling.so roi_pooling_op.cc \
# roi_pooling_op.cu.o -I $TF_INC -fPIC -lcudart -L $CUDA_PATH/lib64
g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc -D_GLIBCXX_USE_CXX11_ABI=0 \
roi_pooling_op.cu.o -I $TF_INC -L $TF_LIB -ltensorflow_framework -D GOOGLE_CUDA=1 \
-fPIC $CXXFLAGS -lcudart -L $CUDA_PATH/lib64
cd ..
# add building psroi_pooling layer
cd psroi_pooling_layer
nvcc -std=c++11 -c -o psroi_pooling_op.cu.o psroi_pooling_op_gpu.cu.cc \
-I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC -arch=sm_52
#g++ -std=c++11 -shared -o psroi_pooling.so psroi_pooling_op.cc \
# psroi_pooling_op.cu.o -I $TF_INC -fPIC -lcudart -L $CUDA_PATH/lib64
g++ -std=c++11 -shared -o psroi_pooling.so psroi_pooling_op.cc -D_GLIBCXX_USE_CXX11_ABI=0 \
psroi_pooling_op.cu.o -I $TF_INC -L $TF_LIB -ltensorflow_framework -D GOOGLE_CUDA=1 \
-fPIC $CXXFLAGS -lcudart -L $CUDA_PATH/lib64
## if you install tf using already-built binary, or gcc version 4.x, uncomment the two lines below
# g++ -std=c++11 -shared -D_GLIBCXX_USE_CXX11_ABI=0 -o psroi_pooling.so psroi_pooling_op.cc \
# psroi_pooling_op.cu.o -I $TF_INC -fPIC -lcudart -L $CUDA_PATH/lib64
cd ..

执行

1
2
3
git clone https://github.com/CharlesShang/TFFRCNN.git
cd TFFRCNN/lib
make

[注]

  1. 编译过程中 出现nsync_cv.h: No such file or directory,找到相应文件目录下mutex.h文件,把文件全路径填上去即可,我的是/home/xxx/tensorflow/lib/python2.7/site-packages/external/nsync/public/nsync_cv.h,这个问题参考链接
  2. 期间还会出现导入模块错误,没有模块就直接pip install 相应模块即可
    运行Demo
    1
    2
    cd $TFFRCNN
    python ./faster_rcnn/demo.py --model model_path

下载VGG_imagenet.npy
demo.py的简单流程:
FasterRCNNdemo
结果如下:
TFRRCNN_demo_1.png
TFRRCNN_demo_2.png
TFRRCNN_demo_3.png
TFRRCNN_demo_4.png
TFRRCNN_demo_5.png
TFRRCNN_demo_6.png
TFRRCNN_demo_7.png

您的支持将鼓励我努力创作!