onnxruntime 推理分类模型 以resnet为例

onnxruntime 推理分类模型 以resnet为例

分类模型的预处理(1) Resize 和 CenterCrop
分类模型的预处理(2)ToTensor 和 Normalize
分类模型 Top 1和Top 5 指标说明
分类模型 Top 1和Top 5 指标实现

softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等
Softmax用于二分类时会退化为Sigmoid

import torch
import torchvision.models as models
import torch.onnx
import onnx
import onnxruntime as ort
import numpy as np
from PIL import Image
from torchvision import transforms

# 1. 定义并加载预训练的ResNet模型
model = models.resnet18(pretrained=True)
model.eval()

# 2. 定义输入
dummy_input = torch.randn(1, 3, 224, 224)

# 3. 导出为ONNX格式
onnx_model_path = "resnet18.onnx"
torch.onnx.export(model, dummy_input, onnx_model_path, verbose=True)

# 4. 加载ONNX模型
onnx_model = onnx.load(onnx_model_path)


# 5. 使用ONNX Runtime进行推断
# 加载ONNX模型
ort_session = ort.InferenceSession(onnx_model_path)

# 图像预处理
def preprocess_image(image_path):
    input_image = Image.open(image_path)
    preprocess = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ])
    input_tensor = preprocess(input_image)
    input_batch = input_tensor.unsqueeze(0)  # 创建batch维度
    return input_batch.numpy()

# 推断函数
def infer(image_path):
    input_batch = preprocess_image(image_path)
    ort_inputs = {ort_session.get_inputs()[0].name: input_batch}
    ort_outs = ort_session.run(None, ort_inputs)
    return ort_outs

# Softmax函数
def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=1, keepdims=True)

# 示例图像路径
image_path = "1.jpg"

# 进行推断
outputs = infer(image_path)

# 输出的结构是一个列表,其中第一个元素是模型的输出,形状为 (1, num_classes)
print(f"outputs 的结构: {type(outputs)}, 长度: {len(outputs)}")
print(f"outputs[0] 的结构: {type(outputs[0])}, 形状: {outputs[0].shape}")

# 应用softmax
probs = softmax(outputs[0])

# 获取预测的类别索引和置信度
predicted_class = np.argmax(probs)
confidence = probs[0][predicted_class]

print(f"预测的类别索引:{predicted_class}")
print(f"预测的置信度:{confidence}")

# 可以加载类别名称文件进行实际的类别名称映射
# 例如:imagenet_labels = ["class0", "class1", ..., "class999"]
# print(f"预测的类别名称:{imagenet_labels[predicted_class]}")

在 transforms.Compose 中,变换的执行顺序是按列出的顺序进行的。
transforms.Resize(256):首先将图像的短边调整到 256 像素,长边按比例缩放。
transforms.CenterCrop(224):然后从图像中心裁剪出 224x224 的区域。
transforms.ToTensor():接着将图像转换为张量,并将像素值归一化到 [0, 1] 之间。
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]):最后使用给定的均值和标准差对图像进行归一化。
所以执行顺序是先 Resize,再 CenterCrop,接着 ToTensor,最后 Normalize。

您好!感谢您的提问。使用ResNetONNX模型进行分类预测的步骤如下: 1. 安装ONNX运行时。您可以在ONNX官网上下载合适的版本,或者使用pip命令进行安装。 2. 加载ONNX模型。使用ONNX运行时的API,可以将ONNX模型加载到内存中。 3. 准备输入数据。根据模型的输入要求,准备好需要进行预测的输入数据。对于ResNet模型,通常需要将输入数据进行归一化处理。 4. 进行预测。调用ONNX运行时的API,将输入数据传入模型,得到预测结果。 下面是一个使用ResNet-50 ONNX模型进行分类预测的Python代码示例: ```python import onnxruntime import numpy as np from PIL import Image # 加载ONNX模型 sess = onnxruntime.InferenceSession("resnet50.onnx") # 准备输入数据 image = Image.open("test.jpg") # 读取测试图片 image = image.resize((224, 224)) # 将图片缩放到模型输入尺寸 image_data = np.array(image).astype(np.float32) # 转换为numpy数组 image_data = np.transpose(image_data, [2, 0, 1]) # 调整维度顺序,将通道维度放在前面 image_data = image_data / 255.0 # 归一化 # 进行预测 input_name = sess.get_inputs()[0].name output_name = sess.get_outputs()[0].name pred = sess.run([output_name], {input_name: image_data}) pred_label = np.argmax(pred) print("预测结果:", pred_label) ``` 这段代码中,我们首先使用ONNX运行时的`InferenceSession`类加载ResNet-50 ONNX模型。然后,读取一张测试图片,并将其缩放到模型输入尺寸。接着,将图片数据转换为numpy数组,并进行归一化处理。最后,调用`sess.run`方法,传入输入数据,得到模型预测结果。预测结果为一个数组,我们需要取最大值所对应的索引作为预测标签。 希望这个回答对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值