OpenCV DNN模块可加载深度学习模型用于目标检测等任务,OpenCV4.2.0之后支持模型推理使用CUDA加速,但是需要手动将CUDA模块编译进OpenCV. 本文记录了编译的全部过程,最终可用于c++/python下的opencv_dnn模块加速。


目录

  • step1 运行环境和前期准备
  • step2 编译OpenCV DNN模块(WITH CUDA)
  • step 3 测试
  • (1)c++
  • (2)python


step1 运行环境和前期准备

1、Windows 10 系统
2、Visual Studio 2017 专业版(先安装
3、CUDA 10.1、cuDNN 7.6.5(后安装
cuda下载地址:
https://developer.nvidia.com/cuda-10.1-download-archive-base cudnn下载地址(需要注册登录):
https://developer.nvidia.com/cudnn
将解压后的cuDNN压缩包中的bin、include、lib文件夹复制到CUDA安装路径下:
opencv diaoyongcuda opencv调用cuda加速_DNN

4、OpenCV 4.2.0、OpenCV Contrib 4.2.0
contrib下载地址:
https://github.com/opencv/opencv_contrib/releases 5、opencv-python 4.2系列,opencv-contrib-python 4.2系列
6、Anaconda 5.3.1 (python 3.7)
7、Cmake 3.13
https://cmake.org/download/

step2 编译OpenCV DNN模块(WITH CUDA)

1、打开cmake,设置OpenCV源码目录、编译后输出目录、第一次点击configure,设置编译平台:

opencv diaoyongcuda opencv调用cuda加速_DNN_02


2、开始第一次configure,中间会下载一些缓存文件,如果下载失败,可以至build目录下CMakeDownloadLog.txt文件中的链接自行下载后放入OpenCV源码目录下的.cache文件夹中,也可至此直接下载后放入:

opencv diaoyongcuda opencv调用cuda加速_OpenCV_03

3、勾选BUILD_opencv_world、WITH_CUDA、OPENCV_DNN_CUDA、设置OPENCV_EXTRA_MODULES_PATH,再次点击configure:

opencv diaoyongcuda opencv调用cuda加速_OpenCV_04


opencv diaoyongcuda opencv调用cuda加速_opencv diaoyongcuda_05

opencv diaoyongcuda opencv调用cuda加速_CUDA_06


4、configure之后会报错,找到CUDA_ARCH_BIN,根据https://developer.nvidia.com/cuda-gpus此网站找到自己显卡的算力填入(我的显卡是1080ti,算力为6.1),并且勾选CUDA_FAST_MATH,将OpenCV_GENERATE_SETUPVARS的勾去掉,再次点击configure:

opencv diaoyongcuda opencv调用cuda加速_OpenCV_07


5、Configure done后,需要确认以下几个信息:

(1)OpenCV中必须包含cuda、python3

(2)必须要检测到正确版本的CUDA和cuDNN

opencv diaoyongcuda opencv调用cuda加速_CUDA_08


opencv diaoyongcuda opencv调用cuda加速_OpenCV_09


6、步骤5的条件都满足后,可以点击Generate,generating done之后,点击Open Project,设置编译平台(Release/Debug均可)、右键ALL_BUILD-生成,生成时间较长,需要1.5小时左右:

opencv diaoyongcuda opencv调用cuda加速_DNN_10


7、经过一段时间的等待,共生成成功122个:

opencv diaoyongcuda opencv调用cuda加速_opencv diaoyongcuda_11


8、生成成功后,右键INSTALL-仅用于项目-仅生成INSTALL,INSTALL生成成功后,会在build目录下看到一个install文件夹,结构和OpenCV很类似,可在此直接下载:

opencv diaoyongcuda opencv调用cuda加速_DNN_12


opencv diaoyongcuda opencv调用cuda加速_DNN_13


至此,将CUDA编译至OpenCV DNN模块已全部成功,接下去分别以c++和python平台下的opencv dnn进行测试。

step 3 测试

程序均参考:,需要将net类进行两处修改:

c++:
	net.setPreferableBackend(DNN_BACKEND_CUDA);
	net.setPreferableTarget(DNN_TARGET_CUDA);

python:
	net.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)
	net.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA)

(1)c++

使用cuda加速后平均帧率在35–40之间,使用之前平均帧率在3–5之间。

opencv diaoyongcuda opencv调用cuda加速_CUDA_14

(2)python

使用cuda加速后平均帧率在13–15之间,使用之前平均帧率在3–4之间。

opencv diaoyongcuda opencv调用cuda加速_opencv diaoyongcuda_15