YOLOv4+CUDA10.2+cudnn7.6.5.32+opencv3.4.10+VS2015目标识别

准备材料:

YOLOv4:下载地址
CUDA10.2:下载地址
cudnn7.6.5.32:下载地址
opencv3.4.10

1、安装CUDA

安装cuda首先查看自己所使用的gpu型号,cuda enable列表中找到对应的型号,注意区分下图中的台式与笔记本的型号,本人电脑为RTX2060。
YOLOv4+CUDA10.2+cudnn7.6.5.32+opencv3.4.10+VS2015目标识别_第1张图片
下载完cuda10.2之后,直接按照默认方式安装即可,这里可以先退出杀毒软件,否则会不停弹出拦截。安装完cuda后,将cudnn中的文件拷贝进cuda相应目录。
随后需要修改添加环境变量与系统变量,如下图所示:
环境变量:YOLOv4+CUDA10.2+cudnn7.6.5.32+opencv3.4.10+VS2015目标识别_第2张图片系统变量:在这里插入图片描述
然后重启,修改后的环境变量生效。
命令行模式下(cmd)进入CUDA安装目录的\extras\demo_suite工作目录,然后分别运行
bandwidthTest.exe和deviceQuery.exe
如果输出中都出现Result=Pass,就成功了。

2、编译YOLOv4为DLL

在darknet-master\build\darknet路径下找到yolo_cpp_dll.vcxproj,用记事本打开,修改其中两处CUDA 10.0为CUDA 10.2。随后用VS2015打开yolo_cpp_dll.sln。右击“项目”->“属性”->“C\C++”->“预处理器”->“预处理器定义”,首行添加“CUDNN"。接着以“x64 release”方式编译(即菜单栏“生成”->“生成解决方案”)完成后,在darknet-master\build\darknet\x64目录下新生成:yolo_cpp_dll.dll和yolo_cpp_dll.lib,同时该目录下还有pthreadGC2.dll、pthreadVC2.dll。这4个文件后续会用到。

3、创建VS2015工程

创建一个工程,右击“项目”->“属性”属性页中,配置为:Release,平台为:x64。
1、添加“配置属性”>“VC++目录”>“包含目录”如下图:
YOLOv4+CUDA10.2+cudnn7.6.5.32+opencv3.4.10+VS2015目标识别_第3张图片
2、添加“配置属性”>“VC++目录”>“库目录”如下图:
YOLOv4+CUDA10.2+cudnn7.6.5.32+opencv3.4.10+VS2015目标识别_第4张图片
3、“配置属性”>“链接器”>“输入”>“附加依赖项”如下图:YOLOv4+CUDA10.2+cudnn7.6.5.32+opencv3.4.10+VS2015目标识别_第5张图片

4、添加dll

将yolo_cpp_dll.dll、pthreadGC2.dll、pthreadVC2.dll和opencv3.4.10\opencv\build\x64\vc14\bin目录下opencv_world3410.dll一共4个文件全部拷贝到工程根目录下,根目录的打开方式是:项目右击,点击“在文件资源管理器中打开文件夹”,将上述4个文件拷贝进弹出的文件夹中即可。
另一种dll添加方式,与上述方式选一种即可。修改环境变量,将darknet-master\build\darknet\x64与opencv3.4.10\opencv\build\x64\vc14\bin两条路径添加进环境变量Path中,然后重启。

5、添加程序

程序里面用到的weights cfg name文件在这里下载:下载链接

#define _CRT_SECURE_NO_WARNINGS
#define OPENCV

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;
#pragma warning(disable:4996)
using namespace cv;
std::vector<std::string> objects_names_from_file(std::string const filename);
void main(int argc, char *argv[])
{
	std::vector<std::string> name = objects_names_from_file("coco.names");
	Detector detector_("yolov4.cfg", "yolov4.weights");
	Mat src = imread("dog.jpg");

	double time0 = static_cast<double>(getTickCount());
	std::vector<bbox_t> result_vec=detector_.detect(src,0.6);
	time0 = ((double)getTickCount() - time0) / getTickFrequency();
	cout << "time:" << time0 << "s" << endl;
	for (int j = 0; j < result_vec.size(); j++)
	{
		//cout << result_vec[j].obj_id << " " << result_vec[j].prob << " " << result_vec[j].w << " " << result_vec[j].h << endl;
		rectangle(src, Rect(result_vec[j].x, result_vec[j].y, result_vec[j].w, result_vec[j].h), Scalar(0, 0, 255),2);
		putText(src, name[result_vec[j].obj_id]+" "+to_string((int)((result_vec[j].prob+0.005)*100))+"%", Point(result_vec[j].x, result_vec[j].y-7), FONT_HERSHEY_COMPLEX_SMALL, 0.8, Scalar(0, 0, 255));
	}
	namedWindow("Img", 0);
	resizeWindow("Img", Size(960, 540));
	imshow("Img", src);
	cout << result_vec.size() << endl;

	cvWaitKey(0);
	system("pause");
}
std::vector<std::string> objects_names_from_file(std::string const filename) 
{
	std::ifstream file(filename);
	std::vector<std::string> file_lines;
	if (!file.is_open()) return file_lines;
	for (std::string line; getline(file, line);) file_lines.push_back(line);
	std::cout << "object names loaded \n";
	return file_lines;
}

运行后结果如图:

你可能感兴趣的:(opencv)