Windows下基于VS2019|Opencv4.2.0|CUDA10.0|YOLOv4-gpu版本的部署、测试、封装以及出现的问题

一、安装VS2019

由于我只需要用到C++相关功能,所以只勾选了C++那个选项,右侧【安装详细信息】那栏中默认就好了,安装路径可以修改,默认安装在C盘。
在这里插入图片描述如果以后有其他需求需要安装其他的,可以之打开Visual Studio Installer,点击【更多】----【修改】,勾选其他内容进行安装。
在这里插入图片描述
考虑到以后可能会使用到VS2017或2015版本的项目,我还安装了MSVC v141和MSVC v140。
在这里插入图片描述

二、安装CUDA10.0和CUDNN10.0

1、检查电脑能安装的CUDA版本
首先打开英伟达控制面板,查看自己的电脑能安装的最高版本。没有英伟达控制面板的去商店里安装一下。然后【NVIDIA控制面板】—【系统信息】—【组件】
在这里插入图片描述
2、安装CUDA
步骤1查看到能安装的最高版本为10.0.132,因此安装CUDA10.0,去官网https://developer.nvidia.com/cuda-toolkit-archive下载,然后解压。
在这里插入图片描述
选择自定义安装,我看网上别人的教程说不要选Visual Studio Integration,即使选了也不能成功安装,然后我就没勾选:
在这里插入图片描述
可更改安装位置,进行安装,我安装在了D盘。
在这里插入图片描述
添加环境变量:
D:\CUDA10.0\Nvidia GPU Computing Toolkit\CUDA\v10.0
D:\CUDA10.0\Nvidia GPU Computing Toolkit\CUDA\v10.0\bin
D:\CUDA10.0\Nvidia GPU Computing Toolkit\CUDA\v10.0\libnvvp
D:\CUDA10.0\Nvidia GPU Computing Toolkit\CUDA\v10.0\include
在这里插入图片描述
系统变量(也可以定义在环境变量里):
CUDA_PATH = D:\CUDA10.0\Nvidia GPU Computing Toolkit\CUDA\v10.0
CUDA_PATH_V10_0 = D:\CUDA10.0\Nvidia GPU Computing Toolkit\CUDA\v10.0
CUDA_BIN_PATH = %CUDA_PATH%\bin
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64
CUDA_SDK_PATH = D:\CUDA10.0\Nvidia Corporation\CUDA Samples\v10.0
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64
在这里插入图片描述
3、安装CUDNN7.6.5
进入官网https://developer.nvidia.com/rdp/cudnn-download,注册一下,下载和cuda10.0对应的cudnn版本,下载完之后是个压缩包,解压后有三个文件夹,分别是
【bin】【include】【lib】。接下来分别把这三个文件夹中的文件添加至CUDA安装目录中对应的文件夹下。即:

  • 【bin】–【cudnn64_7.dll】添加至【D:\NVIDIA CUDA 10.0\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin】
  • 【include】–【cudnn.h】添加至【D:\NVIDIA CUDA 10.0\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include】
  • 【lib】–【x64】–【cudnn.lib】添加至【D:\NVIDIA CUDA 10.0\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64】

4、验证是否安装配置成功:命令提示符下输入nvcc -V查看cuda版本
在这里插入图片描述

三、在VS2019中使用CUDA遇到的问题

1、网上有博客说一定要先安装VS,再安装CUDA,才能正常使用。但是我先装了CUDA,再装的VS一样能用,也不知道为啥。。
2、安装完VS2019和CUDA10.0后,打开VS,新建项目应该是没有CUDA模板的选项的,而且打开GPU版本的YOLOv4的项目属性中,也看不到CUDA相关的选项。
【解决方法】
1)打开CUDA安装包,解压后得到一个名为CUDA的文件夹,(该过程中不要关闭cuda的安装界面,不然文件夹会消失)
在这里插入图片描述
进入文件夹中的MSBuildExtensions文件夹:【…\CUDA\CUDAVisualStudioIntegration\extras\visual_studio_integration\MSBuildExtensions】,文件夹下有四个文件:
在这里插入图片描述
把这四个文件复制到VS的安装目录【BuildCustomizations】中,比如我的是:
【D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations】
2)进入文件夹中的【…\CUDA\CUDAVisualStudioIntegration\extras\visual_studio_integration】,将文件夹【CudaProjectVsWizards】整个直接拷贝到VS的安装目录:
【D:\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions】和【D:\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions】

重启VS,OK!

四、VS2019部署YOLOv4-GPU版本

1、配置项目属性
【特别注意】YOLO的官方代码中,默认的cuda版本是10.0,如果版本不匹配,在打开【darknet.sln】项目时会出错:
在这里插入图片描述
【解决方法】
如果安装的是其他版本的cuda,则需要修改项目配置中关于cuda版本的部分,打开【darknet.vcxproj】文件修改以下两处,将cuda版本改为自己的版本:
在这里插入图片描述
在这里插入图片描述
【OK 完成!进行下一步!】

打开源码文件夹,打开darknet.sln,弹出的框中将该项目的平台工具集重定向至v142(适配VS2019)
在这里插入图片描述
配置Opencv 4.2.0:包含目录、库目录、附加依赖项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置GPU算力:将CUDA选项中算力调整至自己电脑GPU的算力(官网可查),默认是算力为compute_75,sm_75,我电脑GPU是GTX1050Ti,改为算力为6.1)
(我试过不修改,就保持默认好像也没啥问题。。)
在这里插入图片描述
【注意保持版本一致】:
在这里插入图片描述
2、生成exe并测试
右键项目,选择【生成】,即可在x64文件夹下生成darknet.exe,下载yolov4.weights放入x64文件夹,并进行测试:darknet.exe detector test data/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg
在这里插入图片描述
3、遇到的问题
在生成exe的过程中,我遇到了这个问题:
在这里插入图片描述
【解决方法】
【调试】–【选项】–【项目和解决方案】–【生产成并运行】–【最大并行项目生成数改为1】
在这里插入图片描述
在这里插入图片描述

五、GPU版YOLOv4的封装和使用(动态链接库)

1、生成动态链接库
打开源码中的yolo_cpp_dll.sln项目,重定向平台工具集至v142,保持项目属性和菜单栏中的debug或release版本一致,配置Opencv(包含目录、库目录、附加依赖项),在项目属性的CUDA选项中修改GPU算力。
选择【配置类型】为动态库,可在通过【目标文件名】修改生成的目标文件名。
在这里插入图片描述
右键生成,即可在x64文件夹下生成yolo_cpp_dll.dll和yolo_cpp_dll.lib。(注意与dll一同生成的lib文件和单独生成的静态库的lib文件是不同的)

2、使用生成的动态链接库
新建一个空项目,将yolo_cpp_dll.dll和yolo_cpp_dll.lib,以及coco.names、yolov4.cfg、yolov4.weights和yolo_v2_class.hpp(在源码include文件夹中)放在该项目文件夹下:
在这里插入图片描述
配置Opencv(包含目录、库目录、附加依赖项)。
新建main.cpp,加入测试代码:

#include <iostream>
#include <vector>
#include <string.h>
#include <fstream>
#include <io.h>
#include "yolo_v2_class.hpp" //引用动态链接库中的头文件
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/highgui/highgui_c.h"
using namespace std;

#ifdef WIN32    // 在项目属性->C/C++->添加预处理器WIN32
#define OPENCV
#define GPU
#endif
#pragma comment(lib, "yolo_cpp_dll.lib") //引入YOLO动态链接库

//获取目录下的所有文件名
void getFiles(string path, vector<string>& files)
{
    //文件句柄
    intptr_t hFile = 0;
    //文件信息
    struct _finddata_t fileinfo;
    string p;
    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    {
        do
        {
            //如果是目录,迭代之
            //如果不是,加入列表
            if ((fileinfo.attrib & _A_SUBDIR))
            {
                if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
            }
            else
            {
                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
}

//以下两段代码来自yolo_console_dll.sln
void draw_boxes(cv::Mat mat_img, std::vector<bbox_t> result_vec, std::vector<std::string> obj_names,
	int current_det_fps = -1, int current_cap_fps = -1)
{
	int const colors[6][3] = { { 1,0,1 },{ 0,0,1 },{ 0,1,1 },{ 0,1,0 },{ 1,1,0 },{ 1,0,0 } };

	for (auto& i : result_vec) {
		cv::Scalar color = obj_id_to_color(i.obj_id);
		cv::rectangle(mat_img, cv::Rect(i.x, i.y, i.w, i.h), color, 2);
		if (obj_names.size() > i.obj_id) {
			std::string obj_name = obj_names[i.obj_id];
			if (i.track_id > 0) obj_name += " - " + std::to_string(i.track_id);
			cv::Size const text_size = getTextSize(obj_name, cv::FONT_HERSHEY_COMPLEX_SMALL, 1.2, 2, 0);
			int const max_width = (text_size.width > i.w + 2) ? text_size.width : (i.w + 2);
			cv::rectangle(mat_img, cv::Point2f(std::max((int)i.x - 1, 0), std::max((int)i.y - 30, 0)),
				cv::Point2f(std::min((int)i.x + max_width, mat_img.cols - 1), std::min((int)i.y, mat_img.rows - 1)),
				color, CV_FILLED, 8, 0);
			putText(mat_img, obj_name, cv::Point2f(i.x, i.y - 10), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.2, cv::Scalar(0, 0, 0), 2);
		}
	}
	if (current_det_fps >= 0 && current_cap_fps >= 0) {
		std::string fps_str = "FPS detection: " + std::to_string(current_det_fps) + "   FPS capture: " + std::to_string(current_cap_fps);
		putText(mat_img, fps_str, cv::Point2f(10, 20), cv::FONT_HERSHEY_COMPLEX_SMALL, 1.2, cv::Scalar(50, 255, 0), 2);
	}
}

std::string  names_file = "coco.names";
std::string  cfg_file = "yolov4.cfg";
std::string  weights_file = "yolov4.weights";
Detector detector(cfg_file, weights_file, 0); //初始化检测器

int main()
{
	std::vector<std::string> obj_names;
	std::ifstream ifs(names_file.c_str());
	std::string line;
	while (getline(ifs, line)) obj_names.push_back(line);

	//测试图像
	std::string filename = "E:\\pic\\23.jpg";
	cv::Mat image = cv::imread(filename);
	std::vector<bbox_t> result_vec = detector.detect(image);
	draw_boxes(image, result_vec, obj_names);
	cv::namedWindow("test", CV_WINDOW_NORMAL);
	cv::imshow("test", image);
	cv::waitKey(0);


	测试文件夹下所有图片
	//vector<string> files;
	//string filePath = "E:\\pic";
	获取该路径下的所有文件
	//getFiles(filePath, files);
	//for (int i = 0; i < files.size(); i++)
	//{
	//	cout << "\n" << files[i].c_str() << endl;

	//	cv::Mat image = cv::imread(files[i].c_str());
	//	std::vector<bbox_t> result_vec = detector.detect(image);
	//	draw_boxes(image, result_vec, obj_names);
	//	cv::namedWindow("test", CV_WINDOW_NORMAL);
	//	cv::imshow("test", image);
	//	cv::waitKey(2000);
	//}

	//测试视频
	/*cv::VideoCapture capture;
	capture.open("test.mp4");
	if (!capture.isOpened())
	{
		printf("文件打开失败");
	}
	cv::Mat frame;
	while (true)
	{
		capture >> frame;
		std::vector<bbox_t> result_vec = detector.detect(frame);
		draw_boxes(frame, result_vec, obj_names);
		cv::namedWindow("test", CV_WINDOW_NORMAL);
		cv::imshow("test", frame);
		cv::waitKey(3);
	}*/
	return 0;
}

六、GPU版YOLOv4的封装和使用(静态链接库)

1、生成静态链接库并使用
打开源码中的yolo_cpp_dll.sln项目,重定向平台工具集至v142,保持项目属性和菜单栏中的debug或release版本一致,配置Opencv(包含目录、库目录、附加依赖项),在项目属性的CUDA选项中修改GPU算力。
【配置类型】选择静态库,可在通过【目标文件名】修改生成的目标文件名。右键项目,选择【生成】,会在x64文件夹下生成yolo_cpp_dll.lib。
在这里插入图片描述
2、使用生成的静态链接库
新建一个空项目,将yolo_cpp_dll.lib,以及coco.names、yolov4.cfg、yolov4.weights和yolo_v2_class.hpp(在源码include文件夹中)、pthreadVC2.lib(在源码的【3rdparty–pthreads–lib】文件夹下)放在该项目文件夹下:
在这里插入图片描述
配置Opencv:包含目录、库目录、附加依赖项
配置CUDA:包含目录、库目录、附加依赖项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
新建main.cpp,加入测试代码同上。
测试OK!

七、封装过程中出现的问题

用生成的dll和lib进行测试的时候,会出现各种奇形怪状的程序中断,比如:
在这里插入图片描述
或者中断出现在这里:
在这里插入图片描述
或者是其他各种奇状的中断位置。。。
或者是会出现这种错误:
在这里插入图片描述
【原因】测试版本 和 动态/静态链接库版本 不匹配。
我测试了之后发现,debug模式下生成的动态或静态链接库:在debug模式下的测试文件能正常运行,release下的测试文件直接中断。release模式下生成的动态或静态链接库:在release模式下的测试文件能正常运行,debug下的测试文件直接中断。

【解决方法】
debug测试项目下使用debug版本的dll和lib,release的测试项目下使用release版本的dll和lib,不能混用,否则会出现各种奇怪的中断。。。

八、完结撒花

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值