搭建opencv的GPU(CUDA、CUDNN)环境

背景

想使用opencv驱动yolov3训练的模型,但是只使用CPU的时候,发现一个问题,速度太慢,使用opencl的时候反而时间更长,貌似原因是需要交互所以需要时间更长(原谅我不求甚解),于是想要gpu进行加速,但这需要使用cuda,,但是发现使用opencv4.1.0不能使用cudnn,而opencv4.2.0则可以。所以重装opencv4.2.0。

系统:ubuntu16.04

电脑显卡:GTX850M

安装opencv4.2.0以及扩展包

安装包下载

第一步首先进行安装包下载,分别包括opencv和contribute,可以在opencv4.2.0上下载opencv源码和github上下载contribute,这里注意一点,opencv和扩展包要保持一致。比如你使用opencv4.2.0的源码,那么扩展包必须也是4.2.0版本。将opencv解压后放置在home下,同时将扩展包也放置在opencv目录下面,并在opencv目录下建立build文件。

配置CMAKE

安装opencv相关依赖包
sudo apt-get install build-essential cmake git
sudo apt-get install libgtk-3-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev  
sudo apt-get install python-dev python-numpy  python3-dev python3-numpy   
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get -y install libavresample-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
sudo apt-get install libopenblas-dev doxygen

为了解决问题Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR)

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
使用cmake-gui配置cmake更简单
sudo apt-get install cmake-gui   #安装指令 
cmake-gui                        #打开方法  
操作cmake-gui界面

终端输入cmake-gui可以打开cmake图形界面,然后点击configure,然后选择默认界面,最后如下图一般填写即可。

- 主要修改CMAKE_BUILD_TYPE为RELEASE

- 修改OPENCV_EXTRA_MODULES_PATH为
  /home/demon/RobMaster/opencv420/opencv_contrib-4.2.0/modules

- 勾选WITH_CUDA和OPENCV_DNN_CUDA和OPENCV_GENERATE_PKGCONFIG和OPENCV_ENABLE_NONFREE.

搭建opencv的GPU(CUDA、CUDNN)环境_第1张图片

修改文件,避免
- gedit /home/demon/robmasteer/opencv420/3rdparty/ippicv/ippicv.cmake
记得demon换成自己的用户名, 将47行改为文件的本地路径:"file:///home/demon/下载/"(仅供参考,根据自己的路径填写,下载的是加速文件)

- 修改opencv420/opencv_contrib-4.2.0/modules/face/CMakeLists.txt第19行,下载face_landmark_model.dat文件

- 修改opencv420/opencv_contrib-4.2.0/modules/xfeatures2d/cmake/download_boostdesc.cmake的27行,下载boostdec_bgm等文件

- 修改opencv420/opencv_contrib-4.2.0/modules/xfeatures2d/cmake/download_vgg.cmake21行,下载vgg_generated_120.i 等文件
修改CMAKE匹配的GPU计算能力

opencv4.2.0对GPU计算能力要求5.3以上,所以删除不匹配的计算能力,如图所示。

搭建opencv的GPU(CUDA、CUDNN)环境_第2张图片

点击configure和generate,完成cmake配置

开始编译

sudo make -j8   #8核编译 
sudo make install #安装

配置一些OpenCV的编译环境, 将OpenCV的库添加到路径,从而可以让系统找到

sudo gedit /etc/ld.so.conf.d/opencv.conf

新建或者打开此文件,在文件末尾添加/usr/local/lib

配置bash

sudo gedit /etc/bash.bashrc

在该文件下面添加如下内容:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig 
export PKG_CONFIG_PATH   
配置生效
source /etc/bash.bashrc    #配置生效
sudo updatedb              #更新       

安装CUDA

查看电脑配置

lspci |grep VGA
ubuntu-drivers devices

搭建opencv的GPU(CUDA、CUDNN)环境_第3张图片

可以看到我的电脑的显卡是GTX 850M,推荐安装的驱动是 nvidia-440

安装显卡驱动法一

如果同意安装推荐驱动,则可以输入如下指令:

sudo ubuntu-drivers autoinstal

也可以选择自己需要的

sudo apt install nvidia-384

安装显卡驱动法二

下载驱动

进入NVDIA下载驱动,根据我的个人电脑进行如下选择

搭建opencv的GPU(CUDA、CUDNN)环境_第4张图片

处理原有的驱动

sudo apt-get remove --purge nvidia*

禁用Ubuntu默认自带安装的开源驱动:nouveau

sudo gedit /etc/modprobe.d/blacklist.conf

在次文件中添加以下内容:

blacklist nouveau 
blacklist lbm-nouveau 
options nouveau modeset=0 
alias nouveau off alias 
lbm-nouveau off
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf#关闭nouveau
update-initramfs -u
reboot  #重启电脑
验证是否成功

lsmod | grep nouveau

安装CUDA驱动

ctrl+alt+f1进入字符界面,ctrl+alt+f7返回界面

sudo service lightdm stop      #这个是关闭图形界面,不执行会出错
sudo chmod  a+x NVIDIA-Linux-x86_64-396.18.run  # 给驱动run文件赋予执行权限
sudo ./NVIDIA-Linux-x86_64-396.18.run -no-x-check -no-nouveau-check -no-opengl-files #安装

只有禁用opengl这样安装才不会出现循环登陆的问题

-no-x-check:安装驱动时关闭X服务

-no-nouveau-check:安装驱动时禁用nouveau

-no-opengl-files:只安装驱动文件,不安装OpenGL文件

安装过程
  • The distribution-provided pre-install script failed! Are you sure you want to continue? 选择 yes 继续。

  • Would you like to register the kernel module souces with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later? 选择 No 继续。

  • 问题没记住,选项是:install without signing

  • 问题大概是:Nvidia’s 32-bit compatibility libraries? 选择 No 继续。

    Would you like to run the nvidia-xconfigutility to automatically update your x configuration so that the NVIDIA x driver will be used when you restart x? Any pre-existing x confile will be backed up. 选择 Yes 继续

打开图形界面

sudo service lightdm start #这个是打开图形界面

安装CUDA

下载源文件

下载地址
进入官网下载cuda,本人下载的是cuda_10.2.89_440.33.01_linux.run和cudnn-10.2-linux-x64-v7.6.5.32.tgz.

cuda和cudnn,二者一定要对应.

安装cuda
sudo chmod +x cuda_10.2.89_440.33.01_linux.run  #改变可读可写权限
sudo ./cuda_10.2.89_440.33.01_linux.run       

驱动已经安装就不要在安装了,剩下的按照默认的就行了.

搭建opencv的GPU(CUDA、CUDNN)环境_第5张图片

配置环境

sudo gedit ~/.bashrc

将安装路径添加到文件末尾:

export PATH=/usr/local/cuda-10.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH

然后执行如下命令使路径生效:

source ~/.bashrc

验证是否成功

nvcc -V

出现下面图形说明安装成功

搭建opencv的GPU(CUDA、CUDNN)环境_第6张图片

使用自带的例子进行测试:

cd /usr/local/cuda-10.2/samples/1_Utilities/deviceQuery
sudo make        #编译代码
./deviceQuery   #执行

出现如下结果说明安装成功

搭建opencv的GPU(CUDA、CUDNN)环境_第7张图片

安装CUdnn

安装CUDNN一定要去CUDA相互匹配,否则无法使用,下载地址,不过通过官网下载要注意需要登陆的。OPENCV要求版本在cudnn7.5以上。

过程
tar -xzvf cudnn-10.2-linux-x64-v7.6.5.32.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64 
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn* 
验证

nvidia-smi

搭建opencv的GPU(CUDA、CUDNN)环境_第8张图片

卸载cudnn与cuda

1,sudo /usr/local/cuda-10.2/bin/uninstall_cuda_10.2.pl
2,sudo rm -rf /usr/local/cuda/lib64/libcudnn
sudo rm -rf /usr/local/cuda/include/cudnn.h

问题补充

1,在使用yolo训练出来的模型(迭代900次 ),发现使用有问题,主要问题如下,使用cpu处理320*320图片需要600ms作用,使用opencl需要2s左右,使用cuda需要不到100ms处理一帧图片。

2,在使用cmake-gui生成cuda文件时候,提示一个错误,大概就是opencv使用cuda,要求nvidia显卡计算能力达到5.3以上,显卡的计算能力对应表格

欢迎访问我的个人网站 tongxioshuo.club

参考链接

2020-8-28问题补充

本次我打算安装CUDA10.0版本。

1,对于上面的nvidia显卡驱动的卸载,我使用上面的指令无法卸载,最后使用了sudo /usr/bin/nvidia-uninstall成功卸载。
2,我个人建议禁用自带的驱动后,不要在单独安装英伟达的显卡驱动了,可以直接通过cuda来安装。否则会带来一个问题就是CUDA Driver Version = 10.2, CUDA Runtime Version = 10.0, NumDevs = 1
为什么这样呢?那时因为我的显卡安装的是最新版本的,他匹配的是cuda10.2。

2021-03-16问题补充

笔记本自带驱动最低是450,cuda10.2 的是对应驱动430,我安装的是CUDA10.2。nvidia-smi的结果显示CUDA版本是11.0,而从nvcc命令来看,却是CUDA 10.2。但是在实际运行中没啥问题。

你可能感兴趣的:(opencv,深度学习,cuda)