目录

C++ 中使用 YoloV5

Windows 下 C++ 中使用 YoloV5

  1. 工具选择 CMake 或者 VS2019

CMake 下载路径 download

其中 VS2019 配置可以见这篇博客 VS2019 配置 LibTorch 和 OpenCV

2.下载 C++ 的 YoloV5 库

YoloV5-LibTorch

1
2
// 下载 YoloV5-LibTorch
git clone https://github.com/ncdhz/YoloV5-LibTorch.git
  1. 下载 LibTorchOpenCV 并配置环境变量可以参考 VS2019 配置 LibTorch 和 OpenCV

  2. 打开刚才下载下来的项目并修改根目录下的 CMakeLists.txt 文件

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-4bf3ca55f01223679aab519ccfffed1e_1440w.jpg

打开注解并更改为刚才下载的 LibTorch 和 OpenCV 路径,下面是我电脑上面的 LibTorch 和OpenCV 路径。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-127fc34680777e4b3fd3b0cd39e6b57e_r-20220130102210101.jpg

  1. 新建 build 目录并编译此项目
1
2
3
4
5
6
7
8
mkdir build
cd build
// 下面这行代码在 windows 下依赖于 VS2019 别的系统只需要有 cmake 和 make 就好
cmake ..
// 构建项目 (如果你下载的是Debug版本的 LibTorch 不用加 --config Release 是 Release 版本需要加)
cmake --build .
// 下载项目 后面的 Debug 可以替换成 Release 这取决于上一条命令是否加了 --config Release
cmake --install . --config Debug

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-72af83bdebcabd3809dfa7f612af7fcc_r-20220130102201182.jpg

其中 Linux 系统应该不用这么麻烦直接下面操作应该可以解决问题

1
2
3
4
5
6
// 下面操作我没有在 Linux 系统下测试 主要本人懒下载虚拟机等等
mkdir build
cd build
cmake ..
make
make install
  1. 测试识别物体
1
2
3
// 先 cd 到根目录
cd bin
./test.exe

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-8a0a39bee927190d73800e54fc1d37e6_r-20220130102140675.jpg

这里使用的是 yolov5s 模型。模型可以根据需要进行更改(用官方yolov5库训练模型就好了然后把模型转换成 LibTorch 可以识别的)。

下面画红标的是官方提供的转换工具

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-78bf039b50e5bbe37173b2ef37347782_1440w.jpg

通过三种方式把上面介绍的库使用到自己的项目

  1. 在 VS2019 中通过复制库的头文件和实现文件使用(其中 VS2019 配置见上面提到的配置文档)
  • 新建头文件和cpp文件

  • https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-40036f7f18f4afe7491305b971759b08_1440w.jpg

  • 粘贴 src/YoloV5.cpp 中的代码到上面的 YoloV5.cpp 文件中

  • 粘贴 nclude/YoloV5.h 中的代码到上面的 YoloV5.h 文件中

  • 更改 YoloV5.cpp 中头文件引入方式为 “YoloV5.h”

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-c7f4286089e1285bdf928e73c36baa19_r.jpg

  • https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-0ce8c56ca78b6763ff0b0c7d01fb277b_1440w.jpg
  • 新建 main.cpp 使用 YoloV5 吧
 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
// 复制下面的代码到main.cpp
#include "YoloV5.h"

int main()
{
	// 第二个参数为是否启用 cuda 详细用法可以参考 YoloV5.h 文件
	YoloV5 yolo("C:/Users/hwx/Documents/Github/YoloV5-LibTorch/test/yolov5s.cuda.pt", true);
	// 读取分类标签(我们用的官方的所以这里是 coco 中的分类)
	// 其实这些代码无所谓哪 只是后面预测出来的框没有标签罢了
	std::ifstream f("C:/Users/hwx/Documents/Github/YoloV5-LibTorch/test/coco.txt");
	std::string name = "";
	int i = 0;
	std::map<int, std::string> labels;
	while (std::getline(f, name))
	{
		labels.insert(std::pair<int, std::string>(i, name));
		i++;
	}
	// 用 OpenCV 打开摄像头读取文件(你随便咋样获取图片都OK哪)
	cv::VideoCapture cap = cv::VideoCapture(0);
	// 设置宽高 无所谓多宽多高后面都会通过一个算法转换为固定宽高的
	// 固定宽高值应该是你通过YoloV5训练得到的模型所需要的
	// 传入方式是构造 YoloV5 对象时传入 width 默认值为 640,height 默认值为 640
	cap.set(cv::CAP_PROP_FRAME_WIDTH, 1000);
	cap.set(cv::CAP_PROP_FRAME_HEIGHT, 800);
	cv::Mat frame;
	while (cap.isOpened())
	{
		// 读取一帧
		cap.read(frame);
		if (frame.empty())
		{
			std::cout << "Read frame failed!" << std::endl;
			break;
		}
		// 预测
		// 简单吧,两行代码预测结果就出来了,封装的还可以吧 嘚瑟
		std::vector<torch::Tensor> r = yolo.prediction(frame);
		// 画框根据你自己的项目调用相应的方法,也可以不画框自己处理
		frame = yolo.drawRectangle(frame, r[0], labels);
		// show 图片
		cv::imshow("", frame);
		if (cv::waitKey(1) == 27) break;
	}
	return 0;
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-6537878b78fd1bdbd8f34a7e1989d4e4_r.jpg

点击上面的运行按钮得到的结果和上面有框的图一样

  1. 在 VS2019 中通过引用库的方式使用 YoloV5
  • 删除上面的 YoloV5.cpp 和 yoloV5.h (当然没有新建就不用删除了)
  • LibTorch 和 OpenCV 还是要配置的呀(怎么配置就不说了,自己看上面的,其实这几个字已经够写出来了,嘻嘻)
  • 下面引入上面编译好的库

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-683f38130f010d6305da46439e72569f_r-20220130102120450.jpg

在 VC++目录/包含目录 中添加头文件

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-186115bb6bc295f6d164d9dbfd8dd60c_r.jpg

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-a1a0fc0b5bf79822b43c4c4fe2276772_r-20220130102114501.jpg

在 VC++目录/库目录 中添加 .lib 库

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-30a141d76fb8b0a0b934151efae9b8a9_r-20220130102111248.jpg

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-4f8518e1017ea667d5bbf6df4ad7ec9f_r.jpg

在 输入/附加依赖项 中添加 lib 库名称

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/v2-7cd229738cc867ec182468a084e6dec3_r-20220130102104515.jpg

  • 修改 main.cpp 文件的引入代码(测试代码和上面一样不重复书写)

  • 测试(和上面测试步骤和结果一样)

  1. 直接修改刚才下载下来的项目(略,自己可以仿照 test 书写,还要改一下根目录下的 CMakeLists.txt)