yolov5-训练好的模型部署的几种方式-ONNX

发布时间 2023-06-28 14:49:20作者: 黄晓魚

ONNX,即 Open Neural Network Exchange ,是微软和 Facebook 发布的一个深度学习开发工具生态系统,旨在让 AI 开发人员能够随着项目发展而选择正确的工具。

ONNX 所针对的是深度学习开发生态中最关键的问题之一,在任意一个框架上训练的神经网络模型,无法直接在另一个框架上用。开发者需要耗费大量时间精力把模型从一个开发平台移植到另一个。因此,如何实现不同框架之间的互操作性,简化从研究到生产的路径,成为了重中之重。

 

我们在实际的项目中,使用python环境训练出的权重文件(pt)需要应用到我们的上位机程序中(NET),上位机是使用C#开发的

在实际的探索过程中ONNX这种部署方式进入了我们的视野

在NuGet中,有几个onnx部署到NET环境中的库

其中OnnxRuntime 只通过cpu进行推测

OnnxRuntime.DirectML 是通过direct12调用显卡进行推测

OnnxRuntime.Gpu 是可以通过cuda调用显卡进行推测(需要在电脑环境中配置好cuda和cudnn)

github上有这样一个工程github.com 

可以参考这个案例来实现yolov5通过onnxruntime进行NET上的部署

在自己的工程中加载nuget包管理器中的OnnxRuntime

如果是使用CPU进行推测,那么OnnxRuntime的版本就不用做限制,最新版本的就行

将yolov5-NET-master这个工程下载下来,并在nuget上给工程加载好onnxruntime库

 修改工程目录中这个路径下的文件-我现在用的是P5Model这个文件

 保持这里面的图像宽高和你训练的时候裁剪的图像宽高一致,并且Dimensions设置为你需要检测对象的种类数+5(比如我这里需要检测的种类有两种,那么加上5后我这里就填的7)

 继续向下看,这个Outputs根据你到处的ONNX模型来修改的

下面这个Labels中需要修改成你自己这个标注信息,ID是从1开始的

接下来是加载ONNX模型

 这样一句话就可以加载完毕

如果是使用的OnnxRuntime.Gpu这个库,那么这里就需要加两句代码

 这个数字0是你当前显卡的序号,独立显卡一般都是0

另外如果是使用gpu推测,那么onnxRuntime和cuda和cudnn的版本互相会有依赖

 严格按照这个版本信息来配置

如果是使用DirectML来配置ONNX模型的话,那么首先你在nuget上加载的库应该是OnnxRuntime.DirectML

并且加载模型的代码如下

 在更换了nuget中的库之后记得点击一下重新生成解决方案,这样debug目录下的dll文件才会更新

 

经过测试 使用DirectML推测会比使用Gpu版本的库推测会快一些

 

*在使用.Gpu版本的onnx库推测时报错:cudnn遇到严重问题,请求程序关闭,或者是报00007f的错(内存上的错误)

这种不明不白的错误经过排查考虑是onnx cuda torch等之间的链接问题,将anaconda中的虚拟环境中的torch包里面的lib文件夹中的库拷贝的C#工程的根目录下即可解决报错的问题