背景
想使用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.
修改文件,避免翻墙
- 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以上,所以删除不匹配的计算能力,如图所示。
点击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
可以看到我的电脑的显卡是GTX 850M,推荐安装的驱动是 nvidia-440
安装显卡驱动法一
如果同意安装推荐驱动,则可以输入如下指令:
sudo ubuntu-drivers autoinstal
也可以选择自己需要的
sudo apt install nvidia-384
安装显卡驱动法二
下载驱动
进入NVDIA下载驱动,根据我的个人电脑进行如下选择
处理原有的驱动
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
驱动已经安装就不要在安装了,剩下的按照默认的就行了.
配置环境
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
出现下面图形说明安装成功
使用自带的例子进行测试:
cd /usr/local/cuda-10.2/samples/1_Utilities/deviceQuery
sudo make #编译代码
./deviceQuery #执行
出现如下结果说明安装成功
安装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
卸载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。但是在实际运行中没啥问题。