ubuntu16安装cuda,cudnn,gpu版opencv

1,安装预操作

1,有木有显卡

##查看有没有显卡
lspci | grep -i nvidia

返回:看不大懂,大意是有的

01:00.0 VGA compatible controller: NVIDIA Corporation Device 1c82 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 0fb9 (rev a1)

2,查看是不是受到支持的系统

uname -m && cat / etc / * release
##返回:x86_64...大约是没问题

3,查看是否有gcc

gcc --version
#c语言编译器,我理解的

4,查看内核标头

uname -r    ##返回:4.15.0-54-generic

话说,内核的头文件和开发包好像还可以安装,命令如下:

sudo apt-get install linux-headers  - $(uname -r)

我自己运行的时候返回的信息是这样的,估计是没装,原版没问题

返回:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
注意,根据正则表达式 '4.15.0-54-generic' 选中了 'linux-modules-extra-4.15.0-54-generic'
注意,根据正则表达式 '4.15.0-54-generic' 选中了 'linux-image-unsigned-4.15.0-54-generic'
注意,根据正则表达式 '4.15.0-54-generic' 选中了 'linux-modules-4.15.0-54-generic'
注意,根据正则表达式 '4.15.0-54-generic' 选中了 'linux-headers-4.15.0-54-generic'
注意,根据正则表达式 '4.15.0-54-generic' 选中了 'linux-image-4.15.0-54-generic'
虚拟软件包 linux-headers 由下面的软件包提供:
  linux-headers-4.15.0-29-generic 4.15.0-29.31~16.04.1
  linux-headers-4.15.0-54-generic 4.15.0-54.58~16.04.1
  linux-headers-4.4.0-21-lowlatency 4.4.0-21.37
  linux-headers-4.4.0-21-generic 4.4.0-21.37
请您明确地选择安装其中一个。

E: 软件包 linux-headers 没有可安装候选

2,开始安装cuda

安装新的之前,要彻底卸载原版,我自己新装的16.04的系统第一次装cuda,所以不知道咋卸载,有需求的小伙伴们自己想办法卸载吧

装驱动:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nvidia-410    
#本人在装其中一个的时候有报错,后经过修改源文件以后,安装成功了,修改源文件请先备份。自己找找教程吧。我的教程链接失效了
sudo reboot
nvidia-settings
##返回:nvidia英伟达驱动界面
##以上代码的意思是:加入英伟达官方ppa源,刷新软件库并且更新驱动,安装本地下载的410驱动,查看是否安装成功,重启

装cuda,软件包自己下吧:

sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
#安装deb包
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
#选择本地仓库进行安装时安装gpg的密钥,返回ok
sudo apt-get update
sudo apt-get install cuda

cuda添加到环境变量:参考教程

vim .bashrc  ##编辑.bashrc文件,在最后一行添上:export PATH=$PATH:/usr/local/cuda-10.0/bin 等号两边没空格,保存
##重启终端,输入echo $PATH得到想要的环境变量
##后来又在bashrc中加入了两行:
##总之bashrc的最后三行现在是这样的:
export PATH=$PATH:/usr/local/cuda-10.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.0

如何证明cuda安装成功:

nvcc --version
#返回:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

3,安装cudnn

##cuda和cudnn是对应起来的,别的不知,cuda10对应的是cudnn7.5
tar xvf cudnn-10.0-linux-x64-v7.5.0.56.tar
sudo cp cuda/include/cudnn.h /usr/local/cuda-10.0/include/
sudo cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
#基本内容是解压cudnn的tar包。然后把需要的头文件,库文件等复制到该有的地方去

安装成功:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
##返回:
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 5
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

4,安装opencv4.1(注意,先下载好opencv4.1和opencv4.1_contrib,这俩是严格对应的)

opencv依赖:

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  
sudo apt-get install git cmake build-essential  
#一通装以后没报错

安装opencv:

cd ~/daqing_opencv/opencv-4.1.0/build
##如果没有build就建一个,执行:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. 

不好意思,这个不行,因为我想装的是支持gpu的opencv,而cmake的过程中没有:NVIDIA CUDA:                   YES 的字样,而且gpu支持的opencv需要contrib模块,所以我们必需要指定。

rm -rf *    #情空刚刚编译的数据,重装
##执行: cmake
-D CMAKE_BUILD_TYPE=RELEASE -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/center/daqing_opencv/opencv_contrib-4.1.0/modules -D BUILD_EXAMPLES=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON -D WITH_FFMPEG=ON -D WITH_LIBV4L=ON -D WITH_GTK=ON -D WITH_OPENGL=ON -D WITH_ZLIB=ON -D BUILD_PNG=ON -D BUILD_JPEG=ON -D BUILD_TIFF=ON -D WITH_CUDA=ON -D WITH_OPENCL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=/usr/local -DPYTHON3_EXECUTABLE=$(which python) -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

返回结果中,有一段是这样的:

这次返回的结果中有一段是这样的:

--   NVIDIA CUDA:                   YES (ver 10.0, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             30 35 37 50 52 60 61 70 75
--     NVIDIA PTX archs:
-- 
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/center/daqing_opencv/opencv-4.1.0/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python (ver 3.5.2)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2)

很明显这就基本看起来没问题了,注意编译的时候的几个参数:

OPENCV_EXTRA_MODULES_PATH=‘...’  指定contrib模块位置

BUILD_opencv_python3=ON    想要python3可以import cv2的话就选它

CMAKE_INSTALL_PREFIX='...'    库文件和头文件生成在哪里,其他参数不细说了

OPENCV_GENERATE_PKGCONFIG=ON    是不是生成opencv4.pc,这个原本默认是自动生成的,但是,我发现opencv4.1.1不会默认生成pc文件,pkg-config就用不了,强烈建议一定要带这个参数

##编译完了,装吧
make -j8    #8个进程一块装100%,貌似成功
sudo make install
##如何证明成功了
python3中可以 import cv2并且打印版本,估计是可以了

5,开发自己的项目去了

g++ test.cpp -o test `pkg-config --cflags --libs opencv`
这样编译的opencv应该是能跑起来,但是很悲催的是。这个跑得版本不是我自己安装的版本,鬼知道这个opencv 2.4.9.1是个啥
pkg-config --cflags --libs opencv
打出来一堆库和目录,得,那我自己的文件在哪里呢?编译的时候我写了一个参数,-D CMAKE_INSTALL_PREFIX=/usr/local,实践证明,它在我的/usr/local中,包括lib,share,include等。总之刚生成文件就是opencv的。
那么,只剩下两个问题了,一,改pkg的配置 二,g++编译的时候指到lib和include中,加油

首先用4.1.0运行一个最简单的显示图片的程序,显示图片的源码是test1.out
系统自带的opencv2.4编译是这样的:g++ test1.cpp `pkg-config --cflags --libs opencv` -o test1.out
而opencv4.1.0的编译命令是这样的:

g++ test1.cpp -I /usr/local/include/opencv4 -L /usr/local/lib/*.so -o test2.out -std=c++11

但是这样并不能直接运行,因为缺少动态库,所谓缺少倒不是真的缺少,而是不在环境变量或者说是当前文件夹下,所以我的解决方法是把opencv4的lib库添加到环境变量中去,添加方式:

sudo vim /etc/ld.so.conf
在其中添加一句 /usr/local/lib 保存,
使刚刚的配置生效:sudo ldconfig
(插一句,系统提示/sbin/ldconfig.real: /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so.7 不是符号连接
不明所以,故而忽略)

基本的程序能跑起来啦,耶耶耶!其实用cmake工具会更加方便,但是我总觉得g++比较有操控感,可能是项目还是太小吧

 

posted @ 2020-08-18 22:15  0点0度  阅读(554)  评论(0编辑  收藏  举报