Pytorch的pth模型转onnx,再用ONNX Runtime调用推理(附python代码)

本文记录了一个使用PyTorch的vgg11模型进行二分类任务,然后将模型转换为ONNX格式的过程。在转换后,通过ONNX Runtime进行推理,避免了依赖PyTorch环境。尽管尝试使用opencv.dnn调用ONNX模型遇到了问题,但最终通过其他方法实现了成功转换和推理。文中引用了多位作者的文章作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我做的是一个简单的二分类任务,用了个vgg11,因为要部署到应用,所以将 PyTorch 中定义的模型转换为 ONNX 格式,然后在 ONNX Runtime 中运行它,那就不用了在机子上配pytorch环境了。然后也试过转出来的onnx用opencv.dnn来调用,发现识别完全不对,据说是opencv的那个包只能做二维的pooling层,不能做三维的。

然后具体的模型转换以及使用如下代码所示,仅作为学习笔记咯~(亲测可用)

pip install onnx
pip install onnxruntime

首先,将Pytorch模型转成onnx格式,然后验证一波onnx模型有没有什么毛病

# coding=gbk
#_*_ coding=utf-8 _*_
import torch
import torchvision
import torch.nn as nn
from vgg import vgg11_bn
from torchvision import models
import time

out_onnx = 'model.onnx'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
dummy = torch.randn(1, 1, 128, 128)   # 模型的输入格式
model = vgg11_bn()					  # 模型
model = nn.DataParallel(model
### 将PTH模型文件换为ONNX格式并使用ONNX Runtime进行推理 #### PyTorch模型ONNX格式 为了将`.pth`模型文件换成ONNX格式,首先需要加载预训练好的PyTorch模型。这可以通过定义相同的模型架构并通过`torch.load()`方法加载权重实现[^2]。 一旦模型被成功加载,可以调用`torch.onnx.export()`函数来进行导出操作。此过程涉及指定输入张量形状作为示例数据传递给模型,以便于静态图构建工具理解网络结构和维度变化情况: ```python import torch from torchvision.models import resnet50 # 定义设备 device = 'cpu' # 构建模型实例 model = resnet50(pretrained=False) # 加载已保存的.pth模型参数 state_dict = torch.load('path_to_your_model.pth', map_location=device) model.load_state_dict(state_dict) # 设置评估模式 model.eval() # 创建虚拟输入用于导出 dummy_input = torch.randn(1, 3, 224, 224, device=device) # 导出为onnx文件 output_onnx = 'resnet50.onnx' torch.onnx.export( model, dummy_input, output_onnx, export_params=True, opset_version=11, do_constant_folding=True, input_names=['input'], output_names=['output'], dynamic_axes={'input': {0: 'batch_size'}, 'output': {0: 'batch_size'}} ) ``` 上述代码片段展示了如何创建ResNet-50模型并将之化为ONNX格式的过程[^1]。 #### 使用ONNX Runtime执行推理 完成模型换之后,下一步就是利用ONNX Runtime库来运行预测任务。下面是一个简单的例子说明怎样初始化环境、读取之前生成的ONNX文件,并对其进行测试样本上的前向传播计算: ```python import onnxruntime as ort import numpy as np # 初始化会话选项 sess_options = ort.SessionOptions() sess_options.optimized_model_filepath = "optimized_resnet50.onnx" # 启动InferenceSession ort_session = ort.InferenceSession('resnet50.onnx', sess_options=sess_options) def to_numpy(tensor): return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() # 准备输入数据 (这里假设已经有一个名为img_tensor的图像Tensor) inputs = {'input': to_numpy(img_tensor)} # 执行推理 outputs = ort_session.run(None, inputs) print(outputs[0]) ``` 这段脚本解释了从准备必要的依赖项到最后获取输出结果整个流程中的每一步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值