yolov4用1050ti_Windows下基于VS2019|Opencv4.2.0|CUDA10.0|YOLOv4

本文详细介绍了如何在VS2019中安装CUDA和CUDNN,包括安装步骤、配置环境变量以及验证安装成功的方法。接着,针对在VS2019中使用CUDA遇到的问题,如缺少CUDA模板,给出了解决方案。然后,重点讲解了如何部署和测试GPU版YOLOv4,包括项目属性配置、动态库和静态库的生成与使用,并解决了测试时可能出现的版本匹配问题。最后,文章总结了封装过程中遇到的问题及解决办法。
摘要由CSDN通过智能技术生成

一、安装VS2019

由于我只需要用到C++相关功能,所以只勾选了C++那个选项,右侧【安装详细信息】那栏中默认就好了,安装路径可以修改,默认安装在C盘。

213341000_1_20210118080659729如果以后有其他需求需要安装其他的,可以之打开Visual Studio Installer,点击【更多】----【修改】,勾选其他内容进行安装。

213341000_2_20210118080700151

考虑到以后可能会使用到VS2017或2015版本的项目,我还安装了MSVC v141和MSVC v140。

213341000_3_20210118080700291.png

二、安装CUDA10.0和CUDNN10.0

1、检查电脑能安装的CUDA版本

首先打开英伟达控制面板,查看自己的电脑能安装的最高版本。没有英伟达控制面板的去商店里安装一下。然后【NVIDIA控制面板】—【系统信息】—【组件】

213341000_4_20210118080700447

2、安装CUDA

步骤1查看到能安装的最高版本为10.0.132,因此安装CUDA10.0,去官网下载,然后解压。

213341000_5_20210118080700650

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

213341000_6_20210118080700947

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

213341000_7_20210118080701103

添加环境变量:

213341000_8_20210118080701268.png

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

213341000_9_20210118080701307.png

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版本

213341000_10_20210118080701478.png

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

1、网上有博客说一定要先安装VS,再安装CUDA,才能正常使用。但是我先装了CUDA,再装的VS一样能用,也不知道为啥。。

2、安装完VS2019和CUDA10.0后,打开VS,新建项目应该是没有CUDA模板的选项的,而且打开GPU版本的YOLOv4的项目属性中,也看不到CUDA相关的选项。

【解决方法】

1)打开CUDA安装包,解压后得到一个名为CUDA的文件夹,(该过程中不要关闭cuda的安装界面,不然文件夹会消失)

213341000_11_20210118080701650

进入文件夹中的MSBuildExtensions文件夹:【…\CUDA\CUDAVisualStudioIntegration\extras\visual_studio_integration\MSBuildExtensions】,文件夹下有四个文件:

213341000_12_20210118080701728.png

把这四个文件复制到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】项目时会出错:

213341000_13_20210118080701853

【解决方法】

如果安装的是其他版本的cuda,则需要修改项目配置中关于cuda版本的部分,打开【darknet.vcxproj】文件修改以下两处,将cuda版本改为自己的版本:

213341000_14_20210118080701963.png

213341000_15_2021011808070227.png

【OK 完成!进行下一步!】

打开源码文件夹,打开darknet.sln,弹出的框中将该项目的平台工具集重定向至v142(适配VS2019)

213341000_16_2021011808070272

配置Opencv 4.2.0:包含目录、库目录、附加依赖项

213341000_17_20210118080702265

213341000_18_20210118080702447

213341000_19_20210118080702619

配置GPU算力:将CUDA选项中算力调整至自己电脑GPU的算力(官网可查),默认是算力为compute_75,sm_75,我电脑GPU是GTX1050Ti,改为算力为6.1)

(我试过不修改,就保持默认好像也没啥问题。。)

213341000_20_20210118080702807

【注意保持版本一致】:

213341000_21_20210118080702994

2、生成exe并测试

右键项目,选择【生成】,即可在x64文件夹下生成darknet.exe,下载yolov4.weights放入x64文件夹,并进行测试:darknet.exe detector test data/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg

213341000_22_20210118080703197

3、遇到的问题

在生成exe的过程中,我遇到了这个问题:

213341000_23_20210118080703853

【解决方法】

【调试】–【选项】–【项目和解决方案】–【生产成并运行】–【最大并行项目生成数改为1】

213341000_24_20210118080704307

213341000_25_20210118080704416

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

1、生成动态链接库

打开源码中的yolo_cpp_dll.sln项目,重定向平台工具集至v142,保持项目属性和菜单栏中的debug或release版本一致,配置Opencv(包含目录、库目录、附加依赖项),在项目属性的CUDA选项中修改GPU算力。

选择【配置类型】为动态库,可在通过【目标文件名】修改生成的目标文件名。

213341000_26_20210118080704650

右键生成,即可在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文件夹中)放在该项目文件夹下:

213341000_27_20210118080704791.png

配置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。

213341000_28_20210118080704932

2、使用生成的静态链接库

新建一个空项目,将yolo_cpp_dll.lib,以及coco.names、yolov4.cfg、yolov4.weights和yolo_v2_class.hpp(在源码include文件夹中)、pthreadVC2.lib(在源码的【3rdparty–pthreads–lib】文件夹下)放在该项目文件夹下:

213341000_29_2021011808070557.png

配置Opencv:包含目录、库目录、附加依赖项

配置CUDA:包含目录、库目录、附加依赖项

213341000_30_20210118080705231

213341000_31_20210118080705400

213341000_32_20210118080705588

新建main.cpp,加入测试代码同上。

测试OK!

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

用生成的dll和lib进行测试的时候,会出现各种奇形怪状的程序中断,比如:

213341000_33_20210118080705885

或者中断出现在这里:

213341000_34_20210118080706135.png

或者是其他各种奇状的中断位置。。。

或者是会出现这种错误:

213341000_35_20210118080706182

【原因】测试版本 和 动态/静态链接库版本 不匹配。

我测试了之后发现,debug模式下生成的动态或静态链接库:在debug模式下的测试文件能正常运行,release下的测试文件直接中断。release模式下生成的动态或静态链接库:在release模式下的测试文件能正常运行,debug下的测试文件直接中断。

【解决方法】

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

八、完结撒花

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值