• ONNX推理流程



    在这里插入图片描述

    python版API推理流程

    1. 使用netron工具查看onnx网络结构

      如下图,可以看出此次要使用的网络输入为:

      • 输入名称:input
      • 输入形状:[1, 3, 256, 256]
      • 输入数据类型:float32

      网络的输出为:

      • 输出名称:output
      • 输出形状:[1, 1, 256, 256]
      • 输出数据类型:float32

      在这里插入图片描述

    2. 准备输入数据

      将要进行推理的图像数据的数据类型和形状转换为需要的数据类型和需要的输入形状

      # 1.准备输入数据
      img = cv2.imread("../../0.samples/0.png")  # 读取图像
      img_data = cv2.resize(img, (256, 256))  # 对图像进行大小变换
      img_data = img_data.swapaxes(1, 2).swapaxes(0, 1)  # 将维度为[256, 256, 3]转换为[3, 256, 256]
      img_data = img_data[np.newaxis, :, :, :]  # 对图像进行维度变换,使其满足网络的输入要求
      img_data = np.array(img_data)  # 将图像转换为nparray
      img_data = img_data/255.  # 对图像数据进行归一化
      img_data = img_data.astype(np.float32)  # 转换图像数据类型,使其满足网络的输入要求
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    3. 创建一个inference实例,把模型传递给inference实例

      # 2.创建一个InferenceSession的实例,并将模型的地址传递给该实例
      sess = onnxruntime.InferenceSession('../../0.onnx/uNet_32.onnx', providers=['CUDAExecutionProvider'])
      
      • 1
      • 2
    4. 调用inference实例,获取输入输出名称

      # 3.调用InferenceSession的实例,获取输入输出名称
      input_name = sess.get_inputs()[0].name
      output_name = sess.get_outputs()[0].name
      
      • 1
      • 2
      • 3
    5. 调用InferenceSession实例的run方法进行推理,根据输出名称获取推理结果

      # 4.调用InferenceSession实例的run方法进行推理,根据输出名称获取推理结果
      outputs = sess.run([output_name], {input_name: img_data})
      
      • 1
      • 2
    6. 对inference实例输出的结果进行处理,获得所需要的结果

      # 5.推理结果处理
      predict_imgs = np.squeeze(outputs[0])  # 推理结果转换为nparray
      predict_imgs = predict_imgs * 255  # 结果数值范围转换
      predict_imgs = np.clip(predict_imgs, 0, 255)  # 结果数值范围转换
      predict_imgs = cv2.resize(predict_imgs, (1920, 1080))  # 结果图像大小转换
      predict_imgs = predict_imgs.astype('uint8')  # 结果数据类型转换
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    7. python版API推理流程

      import cv2
      import onnxruntime
      import numpy as np
      
      # 1.准备输入数据
      img = cv2.imread("../../0.samples/0.png")  # 读取图像
      img_data = cv2.resize(img, (256, 256))  # 对图像进行大小变换
      img_data = img_data[np.newaxis, :, :, :]  # 对图像进行维度变换,使其满足网络的输入要求
      img_data = np.array(img_data)  # 将图像转换为nparray
      img_data = img_data/255.  # 对图像数据进行归一化
      img_data = img_data.astype(np.float32)  # 转换图像数据类型,使其满足网络的输入要求
      
      # 2.创建一个InferenceSession的实例,并将模型的地址传递给该实例
      sess = onnxruntime.InferenceSession('../../0.onnx/uNet_32.onnx')
      
      # 3.调用InferenceSession的实例,获取输入输出名称
      input_name = sess.get_inputs()[0].name
      output_name = sess.get_outputs()[0].name
      
      # 4.调用InferenceSession实例的run方法进行推理,根据输出名称获取推理结果
      outputs = sess.run([output_name], {input_name: img_data})
      
      # 5.推理结果处理
      predict_imgs = np.squeeze(outputs[0])  # 推理结果转换为nparray
      predict_imgs = predict_imgs * 255  # 结果数值范围转换
      predict_imgs = np.clip(predict_imgs, 0, 255)  # 结果数值范围转换
      predict_imgs = cv2.resize(predict_imgs, (1920, 1080))  # 结果图像大小转换
      predict_imgs = predict_imgs.astype('uint8')  # 结果数据类型转换
      
      # 查看输出结果
      cv2.imshow("1", predict_imgs)
      cv2.waitKey(0)
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
  • 相关阅读:
    【Java】方法
    OG-488酸|195136-52-8|俄勒冈绿488羧酸|氟化荧光素试剂
    自定义实现基于注解的缓存使用
    23软考备考已开始,网络工程师知识点速记~
    上架即封神!3.6k Star 的开源游戏模拟器,Delta 冲上 App Store 免费榜
    Centos7 设置时间
    jsp+sql毕业生招聘系统免费系统+论文
    Oracle-函数
    vsCode git 修改、清空、重置、保存账号名密码
    选择排序(简单选择排序和堆排序)
  • 原文地址:https://blog.csdn.net/qq_30150579/article/details/133685002