让OpenCV的DNN模块速度飞起来 | Ubuntu18.04下联合编译OpenCV4.2和CUDA10.1

一、介绍 :

  • 在python-Flask框架下部署yolo3貌似只能基于OpenCV的DNN模块来做,但是这样实在是太慢了,业务场景又不需要C++做极致的速度。
  • 所以考虑让OpenCV做一个支持GPU的操作,这样yolo3在前向推理的时候速度就可以翻倍了。

二、需要的有:

  • Ubuntu18.04(最好完全新装避免依赖问题,Ubuntu20.04.1测试失败-2020-11-25)
  • 显卡RTX2080的435版本驱动
  • Anaconda3-5.2.0(Python3.6.5)
  • CUDA10.1(10.0不兼容)
  • CuDnn7.6.5(要求7.5+)

三、安装CUDA

默认已经装好了anaconda和显卡驱动。

#装完了之后在bashrc里面写入路径

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

使其生效:

source ~/.bashrc

测试用例验证:

cd /usr/local/cuda-10.1/samples/1_Utilties/deviceQuery
sudo make
./deviceQuery

出现Resut=PASS表示验证通过。

四、安装CuDnn

不要下载.deb格式的,直接下载cuDNN Library for Linux

解压之后进入这个文件夹,里面有一个cuda,在这里打开终端:

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

验证是否正确:(这个命令有点问题 cat出来的肯定对啊)

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

五、准备工作和下载文件

5.1 安装依赖

sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
sudo apt-get install libgtk-3-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgphoto2-dev libavresample-dev

5.2 下载项目文件

OpenCV 4.2.0:
https://github.com/opencv/opencv/releases/tag/4.2.0

OpenCV Contib 4.2.0:
https://github.com/opencv/opencv_contrib/releases/tag/4.2.0

ippicv_2019_lnx_intel64_general_20180723.tgz
链接: https://pan.baidu.com/s/1eyG7mqKLY6CvUQdh7CbUgA 提取码: 1miu (感谢好心人分享)

都解压好了放一起:

/home/ubuntu/opencv4.2/
	opencv-4.2.0/
	opencv_contrib-4.2.0/
	ippicv_2019_lnx_intel64_general_20180723.tgz

六、联合编译OpenCV4.2和CUDA10.1

6.1 进入opencv-4.2.0(就是opencv的源码目录)新建一个build文件夹然后进入文件夹

cd /home/username/opencv4.2/opencv-4.2.0
mkdir build
cd build

6.2 安装cmake 

pip install cmake

6.3 cmake

cmake之前要在要在OpenCV的项目目录中的CMakeLists.txt的开头,第17行左右加一句话

include_directories("modules")

然后下载一些文件:

boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i

点击这里(z7dp),把他们复制到opencv_contrib/moudles/xfeatures2d/src

开始Cmake:

cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D PYTHON_DEFAULT_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \
-D PYTHON3_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print (numpy.get_include())") \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D CUDA_ARCH_BIN='7.5' \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D WITH_OPENGL=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" \
-D WITH_CUBLAS=1 \
-D OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/opencv4.2/opencv_contrib-4.2.0/modules \
-D OPENCV_GENERATE_PKGCONFIG=ON \
..

如果这个报错还可以试试这个:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_C_EXAMPLES=ON \
      -D CUDA_ARCH_BIN='7.5' \
      -D WITH_CUDA=ON \
      -D WITH_TBB=ON \
      -D WITH_V4L=ON \
      -D WITH_QT=ON \
      -D WITH_OPENGL=ON \
      -D OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/opencv4.2/opencv_contrib-4.2.0/modules \
      -D BUILD_EXAMPLES=ON \
      -D HAVE_opencv_python3=ON \
      -D ENABLE_FAST_MATH=1 \
      -D WITH_CUDNN=ON \
      -D OPENCV_GENERATE_PKGCONFIG=ON ..

注意对应你自己的显卡算力 CUDA_ARCH_BIN

对应OPENCV_EXTRA_MODULES_PATH的路径,就是旁边那个文件夹的

cmake完成后记得检查

让OpenCV的DNN模块速度飞起来 | Ubuntu18.04下联合编译OpenCV4.2和CUDA10.1_第1张图片

NVIDIA CUDA 和 CUDNN 是不是yes

如果不是yes就是驱动/CUDA/CUDNN没装好或者版本没对上。

2020-11-25补充:

① 97%左右报一个找不到cuda.hpp的问题,sudo apt-get install libcurl4-openssl-dev 之后清除build里面的所有文件,再跑一次cmake会找不到ippv,重复跑一次就过去了,不知道为什么,然后用了 make -j2 编译成功。

② 中途有一个 /sbin/ldconfig.real: /usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7 is not a symbolic link.的错误,cd /usr/local/cuda-10.1/lib64/ 下面,发现有libcudnn.so.7和libcudnn.so.7.6.5 正常情况下应该只有一个libcudnn.so.7.6.5  ,在终端执行 sudo ln -sf /usr/local/cuda-10.1/lib64/libcudnn.so.7.6.5 /usr/local/cuda-10.1/lib64/libcudnn.so.7 重新搭建软连接。即可解决

6.4 make

make 

不要用多线程,每次用多线程都会有一些莫名其妙的问题,这个要编译很久,一小时多一点。

6.5 安装

sudo make install

如果make没出问题这一步肯定不会出问题的

6.6 其他

安装完成后执行:

sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig

七、补充操作

7.1 如果上述配置成功,则会在/usr/local/lib/文件夹中出现一个pkgconfig文件夹,里面有一个opencv.pc文件,内容大致如下:

# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv4/opencv2
includedir_new=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.2.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudev
Libs.private: -lm -lpthread -L/usr/lib/x86_64-linux-gnu -lGL -lGLU -lcudart_static -ldl -lrt -lnppc -lnppial -lnppicc -lnppicom -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu -lnppitc -lnpps -lcublas -lcudnn -lcufft -L-L/usr/local/cuda -llib64 -L-L/usr/lib -lx86_64-linux-gnu
Cflags: -I${includedir_old} -I${includedir_new}

如果没有就要自己手写一个,如果已经存在就要在第6行最后加个2

7.2 在bashrc中加入路径

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

记得

source ~/.bashrc

判断路径是否生效:

# 判断路径时候添加成功,返回:/usr/local/lib/pkgconfig即可
echo $PKG_CONFIG_PATH

这个时候安装基本完成了,可以再Python下面import cv2试试看会不会报错,不报错也不代表真的安装成功了

要用这个去试,具体放到下个帖子讲。

net.setPreferableBackend(DNN_BACKEND_CUDA)
net.setPreferableTarget(DNN_TARGET_CUDA)

最后:

ubuntu下的联合编译基本没什么人写,找到的也大都漏洞百出,不是少个.就是多个/,真是太难了。

============================2022.4.13更新==============================

【1】ippv这个压缩包要重命名为:

c0bd78adb4156bbf552c1dfe90599607-ippicv_2019_lnx_intel64_general_20180723.tgz

要放在 opencv4.2-cuda/opencv4.2/opencv-4.2.0/.cache/ippicv 这个文件夹里面

他找到之后会自动解压

【2】xfeatures2d里面一大堆东西 让他自己下载吧 我下好了改名放进去也没用 贼傻逼 如果能想办法用手机流量热点的话 可能会快一点

【3】保持各个版本一致,上面的opencv源代码的版本为4.2.0(注意没有第四位版本号),那么opencv-contrib也要保持4.2.0,这两个部分你可以理解为后端的安装,前端(python环境里面)还是要pip install opencv-python==4.2.0.32(注意这个部分要保持一致的版本,但是第四位版本号我选择的32,其他版本没试过)

你可能感兴趣的:(OpenCV实战,cuda,opencv,gpu,cmake,linux)