背景
老规矩首先背景介绍一下,目的就是为了把pytorch的模型部署在ros上,而ros主要使用的C++,所以我本次的目的就是使用C++调用模型。为什么使用C++呢?当然是因为c++的性能更高了。
我的电脑配置:
- I5处理器
- 英伟达的1050ti显卡,4g显存
- 运行内存8G
- cuda10.2,cudnn7.6.5
pytorch模型
将 PyTorch 模型转换为 Torch Script
对于这步,ptorch的官网提供了两种方法,
- 利用Tracing将模型转换为Torch Script
- 通过Annotation将Model转换为Torch Script
将Script Module序列化为一个文件
不论是从上面两种方法的哪一种方法获得了ScriptModule,都可以将得到的ScriptModule序列化为一个文件,然后C++就可以不依赖任何Python代码来执行该Script所对应的Pytorch模型。 假设我们想要序列化前面trace示例中显示的ResNet18模型。要执行此序列化,只需在模块上调用 save并给个文件名。
yolov5的export.py文件
对于这个python文件,它是可以转为三种类型的文件,以默认的yolov5s.pt文件为例子,
- 将模型pt文件的转换成对应的onnx文件后,即可使用netron工具查看其网络结构;
- 将模型文件转为CoreML 文件,这个目的是为了部署到APP上(苹果推出的一种架构);
- 将模型转为TorchScript文件,也就是为了方便我们使用libtorch调用
对于这部分代码,我修改了部分,主要是为了使用cuda。如果不修改的话,你在libtorch里面使用的话也就只能使用cpu了。
这部分我将True改为了False
model.model[-1].export = False # set Detect() layer export=True
下面两部分主要修改了使用设备部分
img = torch.zeros((opt.batch_size, 3, *opt.img_size)).to(device='cuda')
model = attempt_load(opt.weights, map_location=torch.device('cuda'))
至此,我们在python的编程的语言环境下工作已经完成。
在C++中加载你的Script Module
下载libtorch
我这里下载的是libtorch的cuda10.2版本,其目录结构如下所示:
libtorch/
bin/
include/
lib/
share/
- lib/ 包含含链接的共享库,