一、安装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,去官网下载,然后解压。

选择自定义安装,我看网上别人的教程说不要选Visual Studio Integration,即使选了也不能成功安装,然后我就没勾选:

可更改安装位置,进行安装,我安装在了D盘。

添加环境变量:

系统变量(也可以定义在环境变量里):

3、安装CUDNN10.0

进入官网https://developer.nvidia.com/rdp/cudnn-download,注册一下,下载CUDNN10.0,下载完之后是个压缩包,解压后有三个文件夹,分别是

【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 #include #include #include #include #include 'yolo_v2_class.hpp'//引用动态链接库中的头文件#include #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& 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.slnvoid draw_boxes(cv::Mat mat_img, std::vector result_vec, std::vector<: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<: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 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 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 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 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;}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

1291

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

六、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,不能混用,否则会出现各种奇怪的中断。。。

八、完结撒花

yolov4用1050ti_Windows下基于VS2019|Opencv4.2.0|CUDA10.0|YOLOv4相关推荐

  1. 海思Hi3519AV100深度学习方案(一)darknet转caffmodel之caffe安装(基于Ubuntu16.04+python3.5+opencv3.4.0+cuda10.0)

    系列文章目录 海思Hi3519AV100深度学习方案(二)darknet转caffmodel之模型转换(yolov3+caffe+python3.5) 文章目录 系列文章目录 前言 一.系统已有环境检 ...

  2. win10基于anaconda下的tensorflow2.0.0及cuda10.0、cudnn安装成功

    anaconda下安装tensorflow2.0.0 cuda10.0下载安装 安装cudnn 安装tensorflow2.0.0 cuda10.0下载安装 CUDA Toolkit 10.0 Dow ...

  3. win10下RTX 2080ti安装cuda10.0和cudnn7.6.5

    1 安装显卡驱动 在NVIDIA官网上下载显卡驱动,并进行安装 NVIDIA官网下载页面 2 安装cuda10.0 在cuda历史版本列表中下载cuda10.0 cuda10.0下载链接 下载完成后安 ...

  4. 【OBS编译】基于VS2019的W10下的编译

    最近想学习一下开源库的编译,同时又想搞一下音视频,所以选择了OBS,我是想搞一下桌面录制 网络直播,话不多说,操作如下: 官网现在已经更新到28.0.1,支持QT6.0,要求装VS2022,可惜我的电 ...

  5. ViSP安装之Windows系统基于VS2019编译器编译获得VISP动态库

    Windows系统基于VS2019编译器编译获得VISP动态库 官网地址: Installation from source for Windows with Visual C++ 2019 (vc1 ...

  6. VS2019+openCV4.5+openCV4.5 contrib扩展模块安装

    VS2019+openCV4.5+openCV4.5 contrib扩展模块安装 1.VS2019安装 首先第一步安装VS2019. https://visualstudio.microsoft.co ...

  7. 基于vs2019的虚幻4环境搭建

    基于vs2019的虚幻4环境搭建 1.准备工作 进入虚幻引擎官网注册登录Epic Games账户(受网络影响,推荐使用游戏加速器加速) 在虚幻引擎官网下载Epic Games启动程序并安装 打开Epi ...

  8. 【opencv安装和配置完整版教程】(win10+vs2019+opencv4.4.0+opencv_contrib-4.4.0+永久配置)

    [opencv安装和配置](win10+vs2019+opencv4.4.0+opencv_contrib-4.4.0+永久配置) 下载vs2019 opencv4.4.0.opencv_contri ...

  9. 基于VS2019 C++的跨平台(Linux)开发(1.2.2)——设备管理及文件IO

    接上一篇文章,我们来回顾作业以及学习其他的一些系统调用等等 Linux--设备管理及文件IO(一) 一.回顾作业 1.知识点 1.文件IO分类 ①纯文本文件:不能进行任何修饰,且只有文字的文件;如.c ...

  10. 基于VS2019 C++的跨平台(Linux)开发(1.5)——管道

    一.管道概述 1.1.管道概念 管道是Unix中最古老的进程间通信的形式.我们把从一个进程连接到另一个进程的一个数据流(文件IO流)称为一个"管道". 1.2.管道特点 管道是半双 ...

最新文章

  1. 2017年计算机四级试题,2017年全国计算机四级考试模拟试题与答案
  2. 未来几年,BCH超越BTC的路径是什么?
  3. asc desc排序_HIVE的学习之路(六)Hive的分组Join排序
  4. 下载bilibli网站视频
  5. 大学生影视主题网页制作 银翼杀手2049电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
  6. C++/C学习笔记(二)
  7. 省A类竞赛二等奖--村先游项目VUE前端重构
  8. 多目标追踪综述阅读(2021)
  9. 360浏览器如何改html5,360安全浏览器如何设置为默认浏览器
  10. 人脸识别python face_recognize_python人脸识别库-face_recognition详解
  11. java 应用 http spdy_java-删除了ALPN回调:禁用了SPDY和HTTP / 2. alpn-boot是否在引导类路径上?...
  12. 富文本编辑器Froala Editor v3.x 使用
  13. 图论,回路,旅行商、邮递员问题。
  14. INT 10H中断功能详解
  15. 【Go】Go语言中反射包的实现原理(The Laws of Reflection)
  16. 微信抢红包神器自动抢软件
  17. 用Python求矩阵的广义逆
  18. hive:条件:where and or
  19. 国内唯美花海 新娘绝美婚纱照
  20. c语言双边滤波算法,浅析bilateral filter双边滤波器的理解

热门文章

  1. 电源管理芯片之 Regulator 用法 与具体使用实例
  2. WMware虚拟化IntelVT-x/EPT或AMD-V/RVI(V)不能启用,导致AVD不能启动
  3. 对校招生培养工作的建议_贵单位对我校学生培养工作有何建议
  4. 耳机在电脑上测试有声音,但是网页和视频没有声音
  5. 为效率而生-开源Mac版Google Authenticator认证客户端GoldenPasspor
  6. 一次因为游戏程序员猝死引发的思考
  7. FFmpeg音视频播放器实现
  8. java 开发 cms_10 个最受欢迎的 Java 开发的 CMS 系统
  9. 如何修改植物大战僵尸文档
  10. IEEE1588v2解析(4)--透明时钟/一步时钟/二步时钟