python基于onnx模型的推理代码

该代码演示了如何利用ONNX Runtime对一个预先训练的模型进行推理,该模型用于对1000个类别进行图像分类。首先,加载ONNX模型和图像,然后进行预处理,包括调整大小、转换为RGB格式并归一化。接着,通过ONNX Runtime运行模型获取预测结果,并输出Top-K的类别。
摘要由CSDN通过智能技术生成

找了好几个例子,看的一头雾水,但是推理过程的核心代码如图:能写出输出处理和输出处理就可以了

根据上述代码写onnx的推理代码:

举个栗子:

使用onnx模型对1000个种类进行分类,并输出topk的结果:

# -*-coding: utf-8 -*-
import os, sys
sys.path.append(os.getcwd())
import onnxruntime
import numpy as np
import torch
import torchvision.transforms as transforms
from PIL import Image

def to_numpy(tensor):
    return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()


class_names = ['省略1000个类别']

o_model_path="E:/project/Template_detection/pytorch_net/test_model.onnx"
arr_img_path="E:/project/Template_detection/pytorch_net/attr_pred_demo1.jpg"

# img = cv2.imread("E:/project/Template_detection/pytorch_net/attr_pred_demo1.jpg")
# img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC)

"""
# scipy.misc.imread 读取的图片数据是 RGB 格式
# cv2.imread 读取的图片数据是 BGR 格式
# PIL.Image.open 读取的图片数据是RGB格式
# 注意要与pth测试时图片读入格式一致
"""
#模型图片输入的预处理,可以抄pth或者pt的图片处理
def get_img_tensor(img_path, use_cuda, get_size=False):
    img = Image.open(img_path)
    original_w, original_h = img.size

    img_size = (224, 224)  # crop image to (224, 224)
    img.thumbnail(img_size, Image.ANTIALIAS)
    img = img.convert('RGB')
    normalize = transforms.Normalize(
        mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    transform = transforms.Compose([
        # transforms.RandomResizedCrop(img_size[0]), #随机裁剪
        # transforms.RandomHorizontalFlip(), #平移
        transforms.ToTensor(),
        normalize,
    ])
    img_tensor = transform(img)
    img_tensor = torch.unsqueeze(img_tensor, 0)
    if use_cuda:
        img_tensor = img_tensor.cuda()
    if get_size:
        return img_tensor, original_w, original_w
    else:
        return img_tensor
to_tensor = get_img_tensor(arr_img_path,False)
# print('to_tensor',to_tensor)
onet_session = onnxruntime.InferenceSession(o_model_path)
# compute ONNX Runtime output prediction
inputs = {onet_session.get_inputs()[0].name: to_numpy(to_tensor)}
outs = onet_session.run(None, inputs)
preds = outs[0]
# print(preds)
#print(preds.shape)
tops_type = [3, 5, 10] #输出topk的值
#np.argsort(a)  返回的是元素值从小到大排序后的索引值的数组   [::-1] 将元素倒序排列
indexes = np.argsort(preds[0])[::-1]
print('np.argsort(preds[0]):',np.argsort(preds[0]))
print('np.argsort(preds[0][::-1]):',np.argsort(preds[0])[::-1])
# print(indexes)
# print(indexes[:10])
for topk in tops_type:
    idxes = indexes[:topk]
    print('[ Top%d Attribute Prediction ]' % topk)
    for idx in idxes:
        print(class_names[idx])

 通过模型推理得到的结果展示:

        大自然所造成的奇迹没办法复制,就像你在那一年正好的年纪里头,当时遇见亭亭玉立的她一样,没有办法复制。——董宇辉

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值