基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)

基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)

1、openCV4.2.0导出配置

2019年12月23号,openCV发布了新版本4.2.0,其中比较重要的更新是对主流深度学习模型进行了cuda支持。openCV4.2.0
不过该模块还暂未以release版本发布,需要自己利用cmake进行导出编译。
工具:
cmake 3.9.0
VS2015
openCV4.2.0
CUDA 10.2
cudnn 7.6
首先,在openCV官网下载源码,下载地址
然后,下载额外包,下载地址选择对应的版本,如下图

基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第1张图片
将openCV4.2.0安装完成,并将额外包解压,放在安装好的openCV路径中的sources内,如下图
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第2张图片
CUDA安装较为简单,略过
cudnn解压后为三个文件,头文件、lib、dll,将其放置安装好的cuda路径下对应的头文件、lib及dll路径下。
接着,打开cmake,选择openCV源码路径及导出路径,如下图
在这里插入图片描述
选择编译工具为VS2015 WIN64
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第3张图片

然后去掉CUDA_ARCH_PTX中小于6.0的选项(显卡1050TI及以上),如下图
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第4张图片
并勾选如下选项:OPENCV_DNN_CUDA、WITH_CUDA、WITH_CUDNN
然后设置openCV额外包路径(与你之前放置额外包的路径对应上),如下图
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第5张图片
勾选BUILD_opencv_world
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第6张图片
然后点击cmake左下角Configure;
配置完第一遍后,需要再次点击Configure。配置成功后,不会再有红色Name及Value,如下图
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第7张图片
然后点击生成Generate。顺利情况下,会在你指定的路径下生成VS工程。

openCV4.2.0编译

找到cmake导出的工程,打开OpenCV.sln
找到grid_stride_range.hpp文件,将其15-33行替换如下:

using dim3_member_type = decltype(dim3::x);

		template   __device__ dim3_member_type getGridDim();
		template <> inline __device__ dim3_member_type getGridDim<0>() { return gridDim.x; }
		template <> inline __device__ dim3_member_type getGridDim<1>() { return gridDim.y; }
		template <> inline __device__ dim3_member_type getGridDim<2>() { return gridDim.z; }

		template  __device__ dim3_member_type getBlockDim();
		template <> inline __device__ dim3_member_type getBlockDim<0>() { return blockDim.x; }
		template <> inline __device__ dim3_member_type getBlockDim<1>() { return blockDim.y; }
		template <> inline __device__ dim3_member_type getBlockDim<2>() { return blockDim.z; }

		using uint3_member_type = decltype(uint3::x);

		template  __device__ uint3_member_type getBlockIdx();
		template <> inline __device__ uint3_member_type getBlockIdx<0>() { return blockIdx.x; }
		template <> inline __device__ uint3_member_type getBlockIdx<1>() { return blockIdx.y; }
		template <> inline __device__ uint3_member_type getBlockIdx<2>() { return blockIdx.z; }

		template  __device__ uint3_member_type getThreadIdx();
		template <> inline __device__ uint3_member_type getThreadIdx<0>() { return threadIdx.x; }
		template <> inline __device__ uint3_member_type getThreadIdx<1>() { return threadIdx.y; }
		template <> inline __device__ uint3_member_type getThreadIdx<2>() { return threadIdx.z; }

包含头文件:device_launch_parameters.h

找到文件cudnn.hpp,将其40-42行,替换如下:

using cudnn_data_enum_type = decltype(CUDNN_DATA_FLOAT);
		template  cudnn_data_enum_type get_data_type();
		template <> inline cudnn_data_enum_type get_data_type() { return CUDNN_DATA_HALF; }
		template <> inline cudnn_data_enum_type get_data_type() { return CUDNN_DATA_FLOAT; }

然后配置工程为Release x64,右键ALL_BUILD生成
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第8张图片

调用yolov3模型进行检测

新建工程,测试编译后的opencv库
设置

// Load the network
    Net net = readNetFromDarknet(modelConfiguration, modelWeights);
    net.setPreferableBackend(DNN_BACKEND_CUDA);
    net.setPreferableTarget(DNN_TARGET_CUDA);

在1050TI显卡下,基本可以跑到20fps,相比darknet要快一些
基于openCV4.2.0的yoloV3目标检测(支持nvidia GPU加速)_第9张图片
编译好的下载地址:
链接: https://pan.baidu.com/s/1XCBI1wuCyPhT2Yhzy6sqvw 提取码: gwsz
参考博客
连接1

你可能感兴趣的:(编程细节)