想使用opencv驱动yolov3训练的模型,但是只使用CPU的时候,发现一个问题,速度太慢,使用opencl的时候反而时间更长,貌似原因是需要交互所以需要时间更长(原谅我不求甚解),于是想要gpu进行加速,但这需要使用cuda,,但是发现使用opencv4.1.0不能使用cudnn,而opencv4.2.0则可以。所以重装opencv4.2.0。
系统:ubuntu16.04
电脑显卡:GTX850M
第一步首先进行安装包下载,分别包括opencv和contribute,可以在opencv4.2.0上下载opencv源码和github上下载contribute,这里注意一点,opencv和扩展包要保持一致。比如你使用opencv4.2.0的源码,那么扩展包必须也是4.2.0版本。将opencv解压后放置在home下,同时将扩展包也放置在opencv目录下面,并在opencv目录下建立build文件。
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
sudo apt-get install 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 等文件
opencv4.2.0对GPU计算能力要求5.3以上,所以删除不匹配的计算能力,如图所示。
sudo make -j8 #8核编译
sudo make install #安装
配置一些OpenCV的编译环境, 将OpenCV的库添加到路径,从而可以让系统找到
sudo gedit /etc/ld.so.conf.d/opencv.conf
新建或者打开此文件,在文件末尾添加/usr/local/lib
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 #更新
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
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_10.2.89_440.33.01_linux.run和cudnn-10.2-linux-x64-v7.6.5.32.tgz.
cuda和cudnn,二者一定要对应.
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一定要去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
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
参考链接
本次我打算安装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。
笔记本自带驱动最低是450,cuda10.2 的是对应驱动430,我安装的是CUDA10.2。nvidia-smi的结果显示CUDA版本是11.0,而从nvcc命令来看,却是CUDA 10.2。但是在实际运行中没啥问题。