目录

yolov5-libtorch使用总结

yolov5-libtorch使用总结

Yolov5 libtorch检测版本链接:https://github.com/yasenh/libtorch-yolov5

一、环境

原作者的运行环境是:

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_10,color_FFFFFF,t_70,g_se,x_16.png

而我用的环境: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根目录;

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_15,color_FFFFFF,t_70,g_se,x_16.png

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](https://so.csdn.net/so/search?q=torch&spm=1001.2101.3001.7020)\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:特性不适用于任何实体”等等,导致无法编译成功。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16.png

三、生成pt模型文件

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文件;

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200539868.png

(2)程序中默认加载的是yolov5s.pt模型,因为这个模型速度最快,比较轻巧;如果要修改成其他模型,可以手动修改;

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200539922.png

(3)将yolov5s.pt文件拷贝到models目录下,与export.py文件同级目录;不然运行export.py时会加载不到yolov5s.pt文件;

(4)设置model.model[-1].export = False; 默认是True,需要修改为False;不然最终生成的yolov5s.torchscript.pt在libtorch中调用检测时会出现异常中断;

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200539973.png

(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);相关参考链接

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200540076.png

(7)yolov5s.torchscript.pt就是我们需要在libtorch中使用的模型文件;

四、修改libtorch-yolov5-master程序

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。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200540124.png

3、运行程序,就可以看到运行结果了

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200805532.png

*我使用的是默认cpu运行检测,如果想要使用gpu运行检测,则按照原作者的介绍,修改export.py文件,即可生成使用gpu检测的模型文件:*

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200540283.png

*然后在libtorch版检测程序的main函数中,把gpu参数的默认值修改为true*

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200540323.png

*最关键的一点,不要忘记使用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”

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_18,color_FFFFFF,t_70,g_se,x_16-20220206200749546.png

在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:特性不适用于任何实体”

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200540690.png

解决方法:在配置属性–> C/C++ –> 语言 –> 符合模式 选为“否”,即可编译通过。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200540727.png

5、error :c2872 std 不明确的符号

解决方法:在配置属性–> C/C++ –> 语言 –> 符合模式 选为“否”,即可编译通过。

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6auY56WleGlhbmc=,size_20,color_FFFFFF,t_70,g_se,x_16-20220206200735851.png

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