windows c++调用yolov5模型 配置及使用

目录

环境:

windows 10;
vs2019;
libtorch1.8.1-cuda10.2
opencv3.4.14
cmake 3.20.2

前期准备:

libtorch下载(Release版):

https://pytorch.org/get-started/locally/中寻找符合自己的版本,我的选择如下:
windows c++调用yolov5模型 配置及使用
建议使用release version,debug version未实测过。
这里的pytorch版本需和训练yolov5的pytorch版本统一,如果需要其他版本的libtorch,推荐看这篇博客

我使用的版本的地址如下:
gpu:https://download.pytorch.org/libtorch/cu102/libtorch-win-shared-with-deps-1.8.1%2Bcu102.zip
cpu:https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-1.8.1%2Bcpu.zip
一般只下载gpu版即可,除非你只需在cpu上跑模型。
下载完成后解压在任意地址即可,这里假定文件在D:\libtorch中。libtorch文件夹内容如下。
windows c++调用yolov5模型 配置及使用

opencv下载:

https://opencv.org/releases/中选择自己所需版本即可。我这里选择的是3.4.14的windows版。https://sourceforge.net/projects/opencvlibrary/files/3.4.14/opencv-3.4.14-vc14_vc15.exe/download
双击执行,解压在任意地址即可,这里假定文件在D:\opencv中,文件夹内容如下。
windows c++调用yolov5模型 配置及使用

cuda10.2

下载cuda10.2并安装,这类教程就很多了。安装完成后在cmd中输入nvcc -V,若能成功输入版本号即为成功。
windows c++调用yolov5模型 配置及使用
下载cudnn(最新版本即可),并按教程放在cuda文件夹内。

环境变量设置

安装完成后,右键“此电脑”->“属性”->“高级系统设置”->“环境变量”。对用户变量中的Path进行修改

windows c++调用yolov5模型 配置及使用
加入"D:\libtorch\lib",“D:\opencv\build\x64\vc15\bin”(具体前缀地址以你实际放置的地址为准)
windows c++调用yolov5模型 配置及使用
opencv选择vc15还是vc14以你的visual studio版本为主,如果是vs2015,选择14,vs2017和2019选择15即可。

vs配置

以下所有地址的具体前缀以你实际放置的地址为准。
新建项目,“项目”->“属性”,将配置改为“Release”,平台设为“x64”。
windows c++调用yolov5模型 配置及使用
选择“调试”->“环境”,添加
PATH=%PATH%;D:\libtorch\lib

选择“VC++目录”:

  1. 选择“包含目录”,添加
    D:\libtorch\include\torch\csrc\api\include
    D:\libtorch\include
    D:\opencv\build\include
  2. 选择“库目录”,添加 D:\libtorch\lib
    D:\opencv\build\x64\vc15\lib(如果你在环境变量设置中选择的是vc14,则这里也改为vc14)

选择“链接器”->“附加依赖项”,添加
D:\opencv\build\x64\vc15\lib\opencv_world3414.lib
D:\opencv\build\x64\vc15\lib\opencv_world3414d.lib(用于debug版) (具体地址与opencv_world后缀以实际为准)
c10.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
windows c++调用yolov5模型 配置及使用
“链接器”->“命令行”,在其他选项中输入 /INCLUDE:?warp_size@cuda@at@@YAHXZ
windows c++调用yolov5模型 配置及使用
这个命令大概是用来链接cuda库的,cpu版无需输入。

vs测试

至此,vs上的配置已全部完成,写一段简单的代码进行测试。

// for cpu version test
#include <opencv2/opencv.hpp>
#include <torch/script.h>
#include <torch/torch.h>
#include <iostream>

int main()
{
	torch::Tensor tensor = torch::rand({ 5,3 });
	std::cout << tensor << std::endl;
	cv::Mat img = cv::imread("D:/test.png");
	cv::imshow("", img);
	cv::waitKey(1000);
	return 0;
}

windows c++调用yolov5模型 配置及使用
能输出类似上述格式结果和输入图片即为成功。

// for gpu version test
#include <opencv2/opencv.hpp>
#include <torch/script.h>
#include <torch/torch.h>
#include <iostream>

int main()
{
	std::cout << torch::cuda::is_available() << std::endl;
	torch::DeviceType device_type = at::kCUDA;
	std::cout << device_type << std::endl;
	torch::Tensor tensor = torch::rand({ 5,3 }).to(device_type);
	std::cout << tensor << std::endl;
	cv::Mat img = cv::imread("D:/test.png");
	cv::imshow("", img);
	cv::waitKey(1000);
	return 0;
}

windows c++调用yolov5模型 配置及使用
torch::cuda::is_available()输出为1即为成功。

运行yolov5模型

想要使用libtorch读取yolov5生成的pt模型需要先对模型进行序列化转换,相关的代码官方就有,详见https://github.com/ultralytics/yolov5/issues/251。注:古早版本的export.py有bug,请先更新至最新版的export.py再进行转换。
具体的运行部分代码推荐https://github.com/ncdhz/YoloV5-LibTorch。将test中的test.cpp, src中的YoloV5.cpp和include中的YoloV5.h取出,放在你自己的项目中,再对test.cpp中设置的pt文件和coco.txt文件进行修改,就可以使用了。

一些常见问题

无法定位程序输入点***于动态链接库torch_cuda.dll上

按网上的所有教程都无法在我的电脑上解决这一问题,通过使用procmon监控发现,在调用cuda的过程中程序需要调用libtorch\lib\cudnn64_7.dll,而这一文件在我的用户环境中也存在(具体在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64中),因此系统会默认先调用后者,而我使用的是cudnn8的版本,这导致了冲突,通过将后者文件移除解决了这一问题。

error :c2872 std 不明确的符号

vs2017及以下版本出现过该问题,vs2019未出现该问题
解决方法:将 属性->C/C+±>语言->符合模式 改为“否”,问题解决。

上一篇:yolov5 导出LibTorch模型(CPU和GPU)


下一篇:python有序字典和字典排序