ONNX简介

本文介绍了ONNX作为机器学习模型的统一中间格式,如何将PyTorch和TensorFlow等训练框架的模型转换为ONNX格式以提高部署推理效率。同时展示了如何使用onnxruntime和onnxruntime-gpu进行模型推理,并通过ResNet18示例演示了实际操作过程。
摘要由CSDN通过智能技术生成

参考:1.B站大学
           2.ONNX官方github
           2.ONNX官网

1.ONNX简介

        ONNX(Open Neural Network Exchange)是一种开放格式,旨在表示机器学习模型。通俗来讲其表示一种统一的中间结构,如下图所示,可以将Pytorch、TensorFlow等模型训练框架(这些框架更适合做模型训练,不适合模型的部署推理)训练的模型转换为ONNX格式模型,然后再使用推理框架(如onnxruntime、OpenVINO、TensorRT等)进行推理,其推理速度相比于使用模型训练框架进行推理会快很多(几倍到几十倍不等)。
在这里插入图片描述
        如果没有ONNX作为中间格式进行表示,那么一堆各种框架训练的模型和不同硬件就需要很多种适配,有了ONNX作为中间表示,各种框架训练的模型和不同硬件就只需要一种适配,即适配onnx的转换则可。
在这里插入图片描述
        此外,还需要说明的是将训练好的模型转换成ONNX格式后其中不仅存储了神经网络的结构,还存储了模型的权重信息,使得复杂的神经网络架构可以变成一个十分简洁的文件进行表示(转换后变成.onnx格式文件)。

2.ONNX相关库

1.onnx

安装库命令

pip install onnx

onnx库是用于将训练框架的模型导出为ONNX格式

2.onnxruntime(CPU推理)

安装库命令

pip install onnxruntime

onnxruntime库是用于推理ONNX格式的模型,只能进行CPU推理,无法使用GPU推理。

3.onnxruntime-gpu(GPU推理)

安装库命令

pip install onnxruntime-gpu

onnxruntime-gpu库可使用GPU推理ONNX格式的模型。此外,需要值得注意的是onnxruntime-gpu库和onnxruntime库不能同时安装。

3.实际使用

        接下来进行实战:,具体为:

import torch
from torchvision import models

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print(device)

model = models.resnet18(pretrained=True)

model = model.eval().to(device) #将模型设置为评估模式

x = torch.randn(1,3,256,256).to(device) # 模拟输入图片

output = model(x)

print(output.shape)
with torch.no_grad():
    torch.onnx.export(
        model,                          # 需要转换的模型
        x,                              # 模型任意一组输入
        'resnet18_imagenet.onnx',       # 导出的onnx文件名
        opset_version=11,               # ONNX算子版本
        input_names=['input'],          # 输入Tensor的名称(自己起名字)
        output_names=['output']         # 输出Tensor的名称(自己起名字)
    )

然后使用Netron工具(下载地址,打开后window系统下载Netron-Setup-7.5.8.exe,然后直接安装即可)打开转换后的resnet18_imagenet.onnx文件,打开后显示如下:
在这里插入图片描述

onnxruntime推理onnx格式模型

import onnx
import onnxruntime
import cv2
import numpy as np
import torch


class ResNet18():
    def __init__(self,onnxpath):
        self.onnx_session=onnxruntime.InferenceSession(onnxpath)
        self.input_name=self.get_input_name()
        self.output_name=self.get_output_name()
    #-------------------------------------------------------
	#   获取输入输出的名字
	#-------------------------------------------------------
    def get_input_name(self):
        input_name=[]
        for node in self.onnx_session.get_inputs():
            input_name.append(node.name)
        return input_name
    def get_output_name(self):
        output_name=[]
        for node in self.onnx_session.get_outputs():
            output_name.append(node.name)
        return output_name
    #-------------------------------------------------------
	#   输入图像
	#-------------------------------------------------------
    def get_input_feed(self,img_tensor):
        input_feed={}
        for name in self.input_name:
            input_feed[name]=img_tensor
        return input_feed
    #-------------------------------------------------------
	#   1.cv2读取图像并resize
	#	2.图像转BGR2RGB和HWC2CHW
	#	3.图像归一化
	#	4.图像增加维度
	#	5.onnx_session 推理
	#-------------------------------------------------------
    def inference(self,img):
        # img=cv2.imread(img_path)
        or_img=cv2.resize(img,(256,256))
        img=or_img[:,:,::-1].transpose(2,0,1)  #BGR2RGB和HWC2CHW
        img=img.astype(dtype=np.float32)
        img/=255.0
        img=np.expand_dims(img,axis=0)
        input_feed=self.get_input_feed(img)
        pred=self.onnx_session.run(None,input_feed)[0]
        return pred,or_img


def main():
    #读取ONNX模型
    onnx_model = onnx.load('resnet18_imagenet.onnx')

    #检查模型格式是否正确
    onnx.checker.check_model(onnx_model)

    print("Success!")
    
    onnx_path = 'resnet18_imagenet.onnx'
    model = ResNet18(onnx_path)
    img=cv2.imread('cat.jpg')
    output,org = model.inference(img)
    print(output.shape)

if __name__=="__main__":
    main()

结果:
在这里插入图片描述

如有错误欢迎指正,同时也感谢上述参考资料作者的贡献!

  • 54
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ONNX(Open Neural Network Exchange)是一种开放的深度学习模型表示格式,它的目标是实现模型的互操作性。通过使用ONNX,可以将模型从一个深度学习框架转移到另一个框架,而无需重新训练模型。ONNX定义了一种中间表示(IR),可以表示深度学习模型的结构和参数。\[1\] ONNXRuntime是一个用于高性能推理的开源引擎,它支持在多个平台上运行ONNX模型。ONNXRuntime提供了一组API,可以加载和执行ONNX模型,并提供了针对不同硬件和操作系统的优化。它可以与各种深度学习框架(如PyTorch、TensorFlow等)集成,使得在不同框架之间进行模型转换和推理变得更加方便。\[1\] 关于问题中提到的错误信息,根据引用\[2\]中的内容,可能是由于打包的ONNX文件与当前版本的ONNXRuntime不兼容导致的。解决方法是重新打包ONNX文件,以适应当前版本的ONNXRuntime。 如果你对ONNXONNXRuntime的更多细节感兴趣,可以参考引用\[1\]和引用\[3\]中提供的文章,它们提供了关于ONNX标准、ONNXRuntime的设计理念以及使用ONNXONNXRuntime进行推理加速的详细信息。 #### 引用[.reference_title] - *1* *2* [onnx标准 & onnxRuntime加速推理引擎](https://blog.csdn.net/qq_33934427/article/details/124114195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [onnx和pytorch,tensorrt 推理速度对比GPU CPU](https://blog.csdn.net/weixin_37989267/article/details/126243985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值