Ubuntu16.04下搭建OpenCV+CUDA+Tensorflow(搭建环境记录)

一、安装顺序
Cuda9.0(先安装显卡驱动) cuDNN7.2.1 OpenCV3.4.2 Tensorflow1.10
首先Ubuntu要安装一些依赖库

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 libopenblas-dev liblapack-dev libatlas-base-dev 
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

二、更新一下显卡驱动,GeForce1060显卡,最新驱动390版本(2018.8.12)
2.1 NVIDIA网站,查找下载.run文件
https://www.nvidia.com/Download/index.aspx?lang=en-us
2.2 卸载老驱动

sudo apt-get autoremove --purge nvidia-*

2.3 安装新驱动
关闭图形界面,安装.run驱动文件,打开图形界面

sudo service lightdm stop    #(关闭图形界面) (实测重装驱动需要此步骤)
./NVIDIA-390.run             #(运行驱动安装文件,若无权限,使用chmod +x NVIDIA-390.run)
sudo service lightdm start   #(打开图形界面)
nvidia-smi           #(查看显卡及驱动状态,smi--System Management Interface)

三、安装CUDA9.0+cuDNN7.2.1
下载CUDA9.0

https://developer.nvidia.com/cuda-toolkit-archive

上述网站选择适合当前系统的CUDA版本,下载.run文件

测试方法
终端输入如下指令查询cuda版本信息

 nvcc --version 

把CUDA路径添加到用户环境变量里

sudo gedit ~/.bashrc

打开文件,把下面两条添加到文件末尾

export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

执行

source ~/.bashrc

使配置文件生效
3.2 安装cuDNN
下载地址

https://developer.nvidia.com/rdp/cudnn-download
[cuDNN v7.2.1 Library for Linux]

下载得到tgz文件

tar xvf cudnn-xxx

进入cudnn7.2.1解压之后的include目录,在命令行进行如下操作:

sudo cp cudnn.h /usr/local/cuda/include/ #复制头文件

再进入lib64目录下的动态文件进行复制和链接:

sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库 
cd /usr/local/cuda/lib64/ 
sudo rm -rf libcudnn.so libcudnn.so.7 #删除原有动态文件 
sudo ln -s libcudnn.so.7.2.1 libcudnn.so.7 #生成软衔接 
sudo ln -s libcudnn.so.7 libcudnn.so #生成软链接

四、安装OpenCV3.4.2
4.1 OpenCV依赖包
GCC 4.4.x or later
CMake 2.6 or higher
Git
GTK+2.x or higher, including headers (libgtk2.0-dev) # 控制opencv GUI
pkg-config
Python 2.6 or later and Numpy 1.5 or later with developer packages (python-dev, - - python-numpy)
ffmpeg or libav development packages: libavcodec-dev, libavformat-dev, - libswscale-dev
[optional] libtbb2 libtbb-dev
[optional] libdc1394 2.x
[optional] libjpeg-dev, libpng-dev, libtiff-dev, libjasper-dev, libdc1394-22-dev
安装指令

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev  #处理图像所需的包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev  #处理视频所需的包
sudo apt-get install libatlas-base-dev gfortran  #优化opencv功能
sudo apt-get install ffmpeg

4.2 OpenCV3.4.2源码下载配置
创建文件夹并打开

mkdir OpenCV
cd OpenCV

官方下载地址

https://opencv.org/releases.html

注:官网下载速度太慢,在CSDN上下载了一个.7z的压缩源码
7z解压方法

sudo apt install p7zip-full  #安装解压软件
7z x opencv3.4.2+contrib.7z -r -o /home/xx   # x ---- 解压缩;-r ---- 表示递归所有的子文件夹;-o 是指定解压到的目录
unzip opencv-3.4.2.zip 
unzip opencv_contrib-3.4.2.zip  # 解压官方源码压缩包

配置编译opencv (NVIDIA CUDA版本)

cd opencv-3.4.2
mkdir build && cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_EXTRA_MODULES_PATH=~/OpenCV/opencv_contrib-3.4.2/modules \
    -D PYTHON_EXCUTABLE=/usr/bin/python \
    -D WITH_CUDA=ON \    # 使用CUDA
    -D WITH_CUBLAS=ON \
    -D DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" \
    -D CUDA_ARCH_BIN="6.1" \    # 这个需要去官网确认使用的GPU所对应的版本(https://developer.nvidia.com/cuda-gpus)
    -D CUDA_ARCH_PTX="" \
    -D CUDA_FAST_MATH=ON \    # 计算速度更快但是相对不精确
    -D WITH_TBB=ON \
    -D WITH_V4L=ON \
    -D WITH_QT=ON \    # 如果qt未安装可以删去此行;若因为未正确安装qt导致的Qt5Gui报错,可将build内文件全部删除后重新cmake,具体可以参考[这里](http://stackoverflow.com/questions/17420739/opencv-2-4-5-and-qt5-error-s)
    -D WITH_GTK=ON \
    -D WITH_OPENGL=ON \
    -D BUILD_EXAMPLES=ON ..

(上面指令报错找不到目录,把-D后面空格删除后,可行,不知道什么原理)

编译完成之后安装

sudo make -j6
sudo make install

make时出错,错误信息:

[ 88%] Built target example_gpu_optical_flow
Scanning dependencies of target example_gpu_video_reader
[ 88%] Building CXX object samples/gpu/CMakeFiles/example_gpu_video_reader.dir/video_reader.cpp.o
/usr/bin/ld: CMakeFiles/example_gpu_multi.dir/multi.cpp.o: undefined reference to symbol '_ZN3tbb18task_group_contextD1Ev'
//usr/lib/x86_64-linux-gnu/libtbb.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
samples/gpu/CMakeFiles/example_gpu_multi.dir/build.make:120: recipe for target 'bin/example_gpu_multi' failed
make[2]: *** [bin/example_gpu_multi] Error 1
CMakeFiles/Makefile2:46979: recipe for target 'samples/gpu/CMakeFiles/example_gpu_multi.dir/all' failed
make[1]: *** [samples/gpu/CMakeFiles/example_gpu_multi.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
[ 88%] Built target example_gpu_farneback_optical_flow
[ 88%] Linking CXX executable ../../bin/example_gpu_generalized_hough
[ 88%] Built target opencv_perf_superres
[ 88%] Linking CXX executable ../../bin/example_gpu_video_reader
[ 88%] Built target example_gpu_generalized_hough
[ 88%] Linking CXX executable ../../bin/example_gpu_pyrlk_optical_flow
[ 88%] Linking CXX executable ../../bin/example_gpu_stereo_multi
[ 88%] Linking CXX executable ../../bin/example_gpu_opticalflow_nvidia_api
[ 88%] Built target example_gpu_video_reader
[ 88%] Built target example_gpu_pyrlk_optical_flow
[ 88%] Built target example_gpu_opticalflow_nvidia_api
[ 88%] Built target example_gpu_stereo_multi
Makefile:160: recipe for target 'all' failed
make: *** [all] Error 2

错误原因猜测为关于multi gpu的example例程出问题了,所以更改cmake指令参数-DBUILD_EXAMPLES=OFF,并添加-DBUILD_TESTS=OFF(此句应该不添加也没问题)
将make生成清除再重新cmake、make

$ make clean
$ cmake -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
    -DINSTALL_PYTHON_EXAMPLES=ON \
    -DINSTALL_C_EXAMPLES=OFF \
    -DOPENCV_EXTRA_MODULES_PATH=~/OpenCV/opencv_contrib-3.4.2/modules \

    -DBUILD_opencv_python3=ON -DBUILD_opencv_python2=OFF \   ##这里做了些更改,生成与Anaconda+Python3匹配的共享库(2018.08.15)
    -DPYTHON_EXCUTABLE=/home/guo/anaconda3/bin/python3 \
    -DPYTHON3_INCLUDE_DIR=/home/guo/anaconda3/include/python3.6m \
    -DPYTHON3_LIBRARY=/home/guo/anaconda3/lib/libpython3.6m.so.1.0 \
    -DPYTHON_NUMPY_PATH=/home/guo/anaconda3/lib/python3.6/site-packages \

    -DWITH_CUDA=ON \
    -DWITH_CUBLAS=ON \
    -DDCUDA_NVCC_FLAGS="-D_FORCE_INLINES" \
    -DCUDA_ARCH_BIN="6.1" \
    -DCUDA_ARCH_PTX="" \
    -DCUDA_FAST_MATH=ON \
    -DWITH_TBB=ON \
    -DWITH_V4L=ON \
    -DWITH_GTK=ON \
    -DWITH_OPENGL=ON \
    -DBUILD_EXAMPLES=OFF \
    -DWITH_OPENMP=ON \
    -DBUILD_TESTS=OFF ..
##将生成的Anaconda+Python3匹配的共享库复制到anaconda lib python3.6的目录下(2018.08.15)
$ cp /home/guo/OpenCV/opencv-3.4.2/build/lib/python3/* ~/anaconda3/lib/python3.6/site-packages/

$ sudo make -j6
$ sudo make install

用python测试

import cv2
cv2.__version__

4.2 OpenCV环境配置
环境配置添加库路径

sudo gedit /etc/ld.so.conf.d/opencv.conf 
#打开后可能是空文件,在文件内容最后添加
/usr/local/lib

更新系统库

sudo ldconfig

配置bash,执行如下命令

sudo gedit /etc/bash.bashrc 
#在末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  

保存退出,然后执行如下命令使得配置生效

source /etc/bash.bashrc
# 激活配置然后更新database
sudo updatedb  

4.3 在CLion中测试
创建CMakeLists.txt文件

cmake_minimum_required(VERSION 3.10)
project(demo)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
add_executable(demo main.cpp)
target_link_libraries( demo ${OpenCV_LIBS} )

创建Main.cpp文件

#include 
#include 

using namespace cv;
using namespace std;

int main()
{
    Mat image;
    # 必须使用绝对路径
    image = imread("/home/nic/20171125154428073.png");
    if ( image.empty() )
    {
        cout<<"No image data!"<< endl;
        return -1;
    }
    namedWindow("Display Image");
    imshow("Display Image", image);
    waitKey(0);
    return 0;
}

进行测试
五、Tensorflow安装
根据Tensorflow官网的安装教程 https://www.tensorflow.org/install/install_linux
首先添加环境变量

sudo gedit ~/.bashrc

打开配置文件,添加

export CUDA_HOME=/usr/local/cuda    ## 打开目录,发现/usr/local下有一个cuda-9.0的快捷方式

然后,运行指令

source ~/.bashrc

更新配置
Tensorflow官网安装教程里,需要安装libcupti-dev库,安装教程,运行下面代码

sudo apt-get install cuda-command-line-tools

提示无法定位软件,经过百度,google查到,在安装CUDA9.0时已经安装了此库,在如下位置

/usr/local/cuda/extras/CUPTI/lib64

然后,只要添加一下环境变量就可以了,添加方法跟前面一样,在 ~/.bashrc最后添加,记得执行 source ~/.bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/extras/CUPTI/lib64

继续跟随官网教程,有一个可选的安装选项,Nvidia TensorRT3.0,查了一下,可以加速模型预测速度,在Nvidia官网下载了一个3.0.4版本(Ubuntu14.04,Tensorflow教程中要求下载此版本)的tar文件,根据Nvidia教程解压,添加环境变量,后续没有尝试其他,以后用到的话再说
最后,根据Tensorflow官网教程使用 Virtualenv 安装 TensorFlow:
1.发出下列其中一条命令来安装 pip 和 Virtualenv:

$ sudo apt-get install python-pip python-dev python-virtualenv # for Python 2.7
$ sudo apt-get install python3-pip python3-dev python-virtualenv # for Python 3.n

2.发出下列其中一条命令来创建 Virtualenv 环境:

$ virtualenv --system-site-packages targetDirectory # for Python 2.7
$ virtualenv --system-site-packages -p python3 targetDirectory # for Python 3.n

targetDirectory 用于指定 Virtualenv 树的顶层目录。我们的指令假定 targetDirectory 为 ~/tensorflow,但您可以选择任何目录。
3.通过发出下列其中一条命令激活 Virtualenv 环境:

$ source ~/tensorflow/bin/activate # bash, sh, ksh, or zsh
$ source ~/tensorflow/bin/activate.csh  # csh or tcsh
$ . ~/tensorflow/bin/activate.fish  # fish

4.确保安装了 pip 8.1 或更高版本:

(tensorflow)$ easy_install -U pip

5.发出下列其中一条命令以在活动 Virtualenv 环境中安装 TensorFlow:

(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n
(tensorflow)$ pip install --upgrade tensorflow-gpu  # for Python 2.7 and GPU
(tensorflow)$ pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU

等待下载安装完成,根据提示如缺失依赖库就用pip指令安装相应库即可,本人电脑上没有出现问题。
6.测试,需要在tensorflow环境激活状态下,python指令进入python终端,执行下面代码

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

若输出

b'Hello, TensorFlow!'

说明安装没有问题~
7.在jupyter-notebook中使用tensorflow virtualenv的问题
因为一开始是在virtualenv下安装的虚拟环境,所里打开jupyter-notebook后,看不到相关的kernel,查询资料,首先安装了nb_conda软件包,使用conda install

conda install nb_conda

安装完成后,发现可以看到conda下的虚拟环境,还是看不到virtualenv下的tensorflow环境,继续查资料,使用ipykernel软件包,通过pip安装

sudo pip install ipykernel

安装完成后,使用下述命令建立tensorflow虚拟环境的Kernel,注意在tensorflow环境激活状态下

python -m ipykernel install --user --name=tensorflow

这样tensorflow Kernel就建立好了,尝试了一下,不必在tensorflow环境激活状态下启动jupyter-notebook,也可以使用tensorflow Kernel!

你可能感兴趣的:(Ubuntu16.04下搭建OpenCV+CUDA+Tensorflow(搭建环境记录))