Pytorch分类模型转onnx以及onnx模型推理

Pytorch分类模型转onnx以及onnx模型推理
将MobileNetV2的pytorch模型转换为ONNX模型,并用onnxruntime进行测试_cumtchw-程序员秘密
Onnx模型推理(Python),onnx,python

基本概念

onnx

Open Neural Network Exchange (ONNX)是微软和Facebook携手开发的开放式神经网络交换工具。为人工智能模型(包括深度学习和传统ML)提供了一种开源格式。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型。目前主要关注推断所需的功能。

ONNX之于机器学习模型就像JPEG之于图像或MPEG之于视频。你可以使用pytorch,tensorflow或者其他深度学习的框架来训练你的模型,最后都可以转成onnx模型. ONNX就想是不同模型之间的桥梁

ONNX Runtime

ONNX Runtime 是将 ONNX 模型部署到生产环境的跨平台高性能运行引擎,主要对模型图应用了大量的图优化,然后基于可用的特定于硬件的加速器将其划分为子图(并行处理)。

通过其可扩展的Execution Providers (EP) 框架与不同的硬件加速库协同工作,以在硬件平台上以最佳方式执行 ONNX 模型。

该接口使 AP 应用程序开发人员能够灵活地在云和边缘的不同环境中部署他们的 ONNX 模型,并通过利用平台的计算能力来优化执行

  • onnx runtime支持CPU和GPU,而tensorRT仅仅支持NVIDIAGPU。
  • onnx runtime在CPU上的加速效果很明显,而在GPU上的加速表现一般,不如tensorRT。(具体在CPU和GPU上的加速情况参见:https://blog.csdn.net/ltochange/article/details/120432092)

在这里插入图片描述

pytorch模型转ONNX模型(支持批处理)

pytorch模型转ONNX模型(支持批处理)

pytorch转onnx部署+一些小坑坑

torch.onnx.export的时候输入的data是个tensor!
诡异的是,使用onnxruntime.run的时候,如果输入的input是torch格式,就会报错RuntimeError: Input must be a list of dictionaries or a single numpy array for input ‘input.1’.
大概意思就是让你输入个numpy或者dictionary的格式。
输入的图像经过letterbox后构造成[1, 3, 640, 640]后在转个numpy就妥了。

MODNet:实时人像抠图模型-onnx python部署

在部署onnx时,将要推理的图像做简单的前处理,如果采用pytorch的transform则还需要安装pytorch,导致软件过大。此时,应该自己实现图像预处理程序。如normalize和resize

  • def normalize(self, im, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]):
    im = im.astype(np.float32, copy=False) / 255.0
    im -= mean
    im /= std
    return im
  • def resize(self, im, target_size=608, interp=cv2.INTER_LINEAR):
    if isinstance(target_size, list) or isinstance(target_size, tuple):
    w = target_size[0]
    h = target_size[1]
    else:
    w = target_size
    h = target_size
    im = cv2.resize(im, (w, h), interpolation=interp)

torch.onnx.export():将pytorch模型转换为.onnx模型

torch.onnx.export(model, args, f, export_params=True, verbose=False, training=False, input_names=None, output_names=None, aten=False, export_raw_ir=False, operator_export_type=None, opset_version=None, _retain_param_name=True, do_constant_folding=False, example_outputs=None, strip_doc_string=True, dynamic_axes=None, keep_initializers_as_inputs=None)

参数
model (torch.nn.Module) – 要导出的模型.
----args (tuple of arguments) – 模型的输入, 任何非Tensor参数都将硬编码到导出的模型中;任何Tensor参数都将成为导出的模型的输入,并按照他们在args中出现的顺序输入。因为export运行模型,所以我们需要提供一个输入张量x。只要是正确的类型和大小,其中的值就可以是随机的。请注意,除非指定为动态轴,否则输入尺寸将在导出的ONNX图形中固定为所有输入尺寸。在此示例中,我们使用输入batch_size 1导出模型,但随后dynamic_axes 在torch.onnx.export()。因此,导出的模型将接受大小为[batch_size,3、100、100]的输入,其中batch_size可以是可变的。
----export_params (bool, default True) – 如果指定为True或默认, 参数也会被导出. 如果你要导出一个没训练过的就设为 False.
----verbose (bool, default False) - 如果指定,我们将打印出一个导出轨迹的调试描述。
----training (bool, default False) - 在训练模式下导出模型。目前,ONNX导出的模型只是为了做推断,所以你通常不需要将其设置为True。
----input_names (list of strings, default empty list) – 按顺序分配名称到图中的输入节点
----output_names (list of strings, default empty list) –按顺序分配名称到图中的输出节点
----dynamic_axes – {‘input’ : {0 : ‘batch_size’}, ‘output’ : {0 : ‘batch_size’}}) # variable lenght axes

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值