发布时间:2022-11-30 19:30
Yolov5 libtorch检测版本链接:https://github.com/yasenh/libtorch-yolov5
原作者的运行环境是:
而我用的环境:win10 + vs2017 + libTorch1.7.0 + cuda11.1 + opencv3.4.7
正式使用之前,需要将vs2017、libTorch1.7.0、cuda11.1、opencv3.4.7全部安装配置好。
1、将libtorch-yolov5-master.zip下载下来解压;
2、用vs2017创建空项目libtorch-yolov5-master,然后将刚刚解压的目录中“ cxxopts.hpp、detector.cpp、detector.h、mian.cpp、utils.h、images目录、weight目录”拷贝到libtorch-yolov5-master根目录;
3、对项目配置opencv环境;
4、对项目配置libtorch环境;
(1)包含目录
D:\3rd-Part\libtorch-1.7.0-cuda11.0-release\include
D:\3rd-Part\libtorch-1.7.0-cuda11.0-release\include\torch\csrc\api\include
D:\3rd-Part\libtorch-1.7.0-cuda11.0-release\include\torch\csrc\api\include\torch
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include
(2)库目录
D:\3rd-Part\libtorch-1.7.0-cuda11.0-release\lib
(3)附加依赖项
asmjit.lib
c10.lib
c10_cuda.lib
c10d.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
gloo.lib
gloo_cuda.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
mkldnn.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
5、C/C++语言符合模式,调成“否”
在配置属性--> C/C++ --> 语言 --> 符合模式 选为“否”,即可编译通过;
否则会报错“E1866:特性不适用于任何实体”等等,导致无法编译成功。
1、前提
(1)下载pytorch版本的yolov5代码,地址:https://github.com/ultralytics/yolov5;
(2)配置好yolov5的环境(anaconda+pytorch1.7.0+cuda11.1+python3.8),将yolov5的train.y和detect.py运行起来(可能需要安装opencv-python等等许多依赖包);
注意:保持pytorch版yolov5的pytorch、cuda版本 与 libtorch版yolov5的libtorch、cuda版本相同。
2、生成模型文件
(1)打开models目录下的export.py文件;
(2)程序中默认加载的是yolov5s.pt模型,因为这个模型速度最快,比较轻巧;如果要修改成其他模型,可以手动修改;
(3)将yolov5s.pt文件拷贝到models目录下,与export.py文件同级目录;不然运行export.py时会加载不到yolov5s.pt文件;
(4)设置model.model[-1].export = False; 默认是True,需要修改为False;不然最终生成的yolov5s.torchscript.pt在libtorch中调用检测时会出现异常中断;
(5)安装onnx、coremltools依赖库
通过Anaconda Prompt(Anaconda3)进入yolov5的环境下(通过指令 conda activate 环境名称来激活环境),分别输入以下两个命令来下载安装onnx、coremltools依赖库:
pip install -i https://pypi.douban.com/simple onnx
pip install -i https://pypi.douban.com/simple coremltools
(6)运行export.py,然后就可以在models目录下看到生成yolov5s.torchscript.pt、yolov5s.onnx、yolov5s.mlmodel这三个文件(我的在生成yolov5s.mlmodel时报错了,暂时没去解决;因为最终需要的是yolov5s.torchscript.pt);相关参考链接
(7)yolov5s.torchscript.pt就是我们需要在libtorch中使用的模型文件;
1、将yolov5s.torchscript.pt拷贝到libtorch-yolov5-master根目录下;
【注意:这里加载的模型不是yolov5s.pt模型文件,也不是通过训练得到的best.pt或last.pt模型文件;而是这些模型文件,通过export.py导出的用途libtorch使用的torchscript.pt模型文件】
2、修改参数
在main函数中,将模型参数weights的默认值设置为“yolov5s.torchscript.pt”;
将图像源参数source的默认值设置为“./images/bus.jpg”;
如果想要显示查看检测结果图像,就把view-img参数的默认值设置为true。
3、运行程序,就可以看到运行结果了
我使用的是默认cpu运行检测,如果想要使用gpu运行检测,则按照原作者的介绍,修改export.py文件,即可生成使用gpu检测的模型文件:
然后在libtorch版检测程序的main函数中,把gpu参数的默认值修改为true
最关键的一点,不要忘记使用cmake重编译一遍程序,不然调用不起来cuda。
1、无法打开源文件 "cuda.h"
一般出现这个问题,就是因为没有在项目属性的包含目录中添加对应的头文件目录,在libtorch的环境目录中搜索"cuda.h",找到对应的目录添加到项目包含目录中:
D:\3rd-Part\libtorch-1.7.0-cuda11.0-release\include\torch\csrc\api\include\torch
2、无法打开源文件 ”torch/torch.h”
项目包含目录中添加如下目录:
D:\3rd-Part\libtorch-1.7.0-cuda11.0-release\include\torch\csrc\api\include
3、无法打开源文件 “cuda_runtime.h”
在libtorch的环境目录中搜索"cuda_runtime.h",没有搜索到这个文件,于是查询了下资料知道这些文件是在cuda环境目录下,于是在cuda环境目录下果然搜索到了这些文件,找到对应目录,包含在项目的包含目录中:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include
4、E1866:特性不适用于任何实体
在libtorch-1.7.0-cuda11.0-release\include\c10\util\ArrayRef.h 文件中,
278行C10_DEFINE_DEPRECATED_USING 报错“E1866:特性不适用于任何实体”
解决方法:在配置属性--> C/C++ --> 语言 --> 符合模式 选为“否”,即可编译通过。
5、error :c2872 std 不明确的符号
解决方法:在配置属性--> C/C++ --> 语言 --> 符合模式 选为“否”,即可编译通过。
6、执行到“auto detections = output.toTuple()->elements()[0].toTensor();”时异常中断
运行程序后,在detector.cpp文件的Run函数中,执行到代码
“auto detections = output.toTuple()->elements()[0].toTensor();”时发生异常中断,也不没有异常信息弹出;
经查询,是因为在第三步骤生成pt模型文件时,没有在export.py文件中修改代码“model.model[-1].export = False”导致的;修改代码后,重新导出生成的模型文件;使用新的torchscript.pt模型文件,运行libtorch版检测程序就不会再异常中断了。
另附其他博客中的问题汇总参考链接:使用C++版Pytorch(libTorch)的问题汇总
1、找到了另一个人在github上发布了yolov5的libtorch版本,但是目前还没有尝试;这里先把原文链接附上,后续有需要再尝试:https://github.com/L1129433134/YOLOv5-LibTorch
2、还有一个人的github主页中发布了包括yolov3、yolov4、yolov5的C++版本,以及其他神经网络的框架代码;有空可以研究下:https://github.com/wang-xinyu/tensorrtx