windows c++调用yolov5模型 配置及使用
2021/6/4 7:27:37
本文主要是介绍windows c++调用yolov5模型 配置及使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
- 环境:
- 前期准备:
- libtorch下载(Release版):
- opencv下载:
- cuda10.2
- 环境变量设置
- vs配置
- vs测试
- 运行yolov5模型
- 一些常见问题
- 无法定位程序输入点***于动态链接库torch_cuda.dll上
- error :c2872 std 不明确的符号
环境:
windows 10;
vs2019;
libtorch1.8.1-cuda10.2
opencv3.4.14
cmake 3.20.2
前期准备:
libtorch下载(Release版):
在https://pytorch.org/get-started/locally/中寻找符合自己的版本,我的选择如下:
建议使用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文件夹内容如下。
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中,文件夹内容如下。
cuda10.2
下载cuda10.2并安装,这类教程就很多了。安装完成后在cmd中输入nvcc -V,若能成功输入版本号即为成功。
下载cudnn(最新版本即可),并按教程放在cuda文件夹内。
环境变量设置
安装完成后,右键“此电脑”->“属性”->“高级系统设置”->“环境变量”。对用户变量中的Path进行修改
加入"D:\libtorch\lib",“D:\opencv\build\x64\vc15\bin”(具体前缀地址以你实际放置的地址为准)
opencv选择vc15还是vc14以你的visual studio版本为主,如果是vs2015,选择14,vs2017和2019选择15即可。
vs配置
以下所有地址的具体前缀以你实际放置的地址为准。
新建项目,“项目”->“属性”,将配置改为“Release”,平台设为“x64”。
选择“调试”->“环境”,添加
PATH=%PATH%;D:\libtorch\lib
选择“VC++目录”:
- 选择“包含目录”,添加
D:\libtorch\include\torch\csrc\api\include
D:\libtorch\include
D:\opencv\build\include - 选择“库目录”,添加 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
“链接器”->“命令行”,在其他选项中输入 /INCLUDE:?warp_size@cuda@at@@YAHXZ
这个命令大概是用来链接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; }
能输出类似上述格式结果和输入图片即为成功。
// 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; }
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+±>语言->符合模式 改为“否”,问题解决。
这篇关于windows c++调用yolov5模型 配置及使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享