编译 ONNX 模型

news2024/11/24 5:59:55

本篇文章译自英文文档 Compile ONNX Models — tvm 0.13.dev0 documentation
作者是 Joshua Z. Zhang
更多 TVM 中文文档可访问 →TVM 中文站。

本文将介绍如何用 Relay 部署 ONNX 模型。

首先安装 ONNX 包,最便捷的方法推荐安装 protobuf 编译器:

pip install --user onnx onnxoptimizer

或参考官方网站:https://github.com/onnx/onnx

import onnx
import numpy as np
import tvm
from tvm import te
import tvm.relay as relay
from tvm.contrib.download import download_testdata

加载预训练的 ONNX 模型

下面示例中的超分辨率模型与 ONNX 教程 中的模型完全相同,跳过 PyTorch 模型的构建部分,下载保存的 ONNX 模型:

model_url = "".join(
    [
        "https://gist.github.com/zhreshold/",
        "bcda4716699ac97ea44f791c24310193/raw/",
        "93672b029103648953c4e5ad3ac3aadf346a4cdc/",
        "super_resolution_0.2.onnx",
    ]
)
model_path = download_testdata(model_url, "super_resolution.onnx", module="onnx")


# 现在磁盘上有 super_resolution.onnx 模型
onnx_model = onnx.load(model_path)

加载测试图像

该模型接收大小为 224x224 的单个图像作为输入,输出沿每个轴放大 3 倍的图像(即大小为 672x672)。为适配输入的 shape,重新缩放猫图像,并转换为 YCbCr。然后超分辨率模型应用于亮度(Y)通道。

from PIL import Image

img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"
img_path = download_testdata(img_url, "cat.png", module="data")
img = Image.open(img_path).resize((224, 224))
img_ycbcr = img.convert("YCbCr")  # convert to YCbCr
img_y, img_cb, img_cr = img_ycbcr.split()
x = np.array(img_y)[np.newaxis, np.newaxis, :, :]

使用 Relay 编译模型

通常 ONNX 模型将输入值与参数值混合在一起,输入名称为 1,具体要查看模型文档来确定完整的输入和参数名称空间。

将 shape 字典传给 relay.frontend.from_onnx 方法,以便 Relay 知道哪些 ONNX 参数是输入,哪些是参数,并提供输入尺寸的静态定义:

target = "llvm"

input_name = "1"
shape_dict = {input_name: x.shape}
mod, params = relay.frontend.from_onnx(onnx_model, shape_dict)

with tvm.transform.PassContext(opt_level=1):
    executor = relay.build_module.create_executor(
        "graph", mod, tvm.cpu(0), target, params
    ).evaluate()

输出结果:

/workspace/python/tvm/relay/frontend/onnx.py:5785: UserWarning: Mismatched attribute type in ' : kernel_shape'

==> Context: Bad node spec for node. Name:  OpType: Conv
  warnings.warn(str(e))
/workspace/python/tvm/driver/build_module.py:268: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  "target_host parameter is going to be deprecated. "

在 TVM 上执行

dtype = "float32"
tvm_output = executor(tvm.nd.array(x.astype(dtype))).numpy()

查看结果

将输入和输出图像放在一起比对。亮度通道 Y是模型的输出。将色度通道 Cb 和 Cr 调整到匹配简单的双三次算法,然后将图像重新组合,并转换回 RGB。

from matplotlib import pyplot as plt

out_y = Image.fromarray(np.uint8((tvm_output[0, 0]).clip(0, 255)), mode="L")
out_cb = img_cb.resize(out_y.size, Image.BICUBIC)
out_cr = img_cr.resize(out_y.size, Image.BICUBIC)
result = Image.merge("YCbCr", [out_y, out_cb, out_cr]).convert("RGB")
canvas = np.full((672, 672 * 2, 3), 255)
canvas[0:224, 0:224, :] = np.asarray(img)
canvas[:, 672:, :] = np.asarray(result)
plt.imshow(canvas.astype(np.uint8))
plt.show()

from onnx

输出结果:

/workspace/gallery/how_to/compile_models/from_onnx.py:120: DeprecationWarning: BICUBIC is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BICUBIC instead.
  out_cb = img_cb.resize(out_y.size, Image.BICUBIC)
/workspace/gallery/how_to/compile_models/from_onnx.py:121: DeprecationWarning: BICUBIC is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BICUBIC instead.
  out_cr = img_cr.resize(out_y.size, Image.BICUBIC)

注意
ONNX 导入器在导入时默认根据动态 shape 定义模型,编译器在编译时将模型转换为静态 shape。如果失败,模型中可能仍存在动态操作。目前并非所有 TVM 内核都支持动态 shape,如果遇到动态内核错误,请在 discuss.tvm.apache.org 上提交 issue。

这个特定的模型是用旧版本的 ONNX 构建的。在导入阶段,ONNX 导入器运行 ONNX 验证程序(可能抛出属性类型不匹配的警告)。由于 TVM 支持许多不同的 ONNX 版本,所以 Relay 模型仍然有效。

下载 Python 源代码:from_onnx.py

下载 Jupyter Notebook:from_onnx.ipynb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【资料分享】浪涌电流(Inrush Current)产生原因

1、对Inrush Current电流的直观感受 当电灯在电路中工作时,如果突然启动马达或者变压器时,会出现电灯暗一下,此时电灯出现暗的情况就是因为马达或者变压器启动时,在电路中产生较大Inrush Current,具体分析可以参考下图…

图解HTTP书籍学习

了解Web及网络基础 HTTP(HyperText Transfer Protocol,超文本传输协议) Web是建立在HTTP协议上通信的 把SGML(Standard Generalized Markup Language,标准通用标记语言) HTML(HyperText Mar…

大数据:spark任务调度,DAGscheduler,Taskscheduler

大数据:spark任务调度 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其s…

SpringBoot源码分析:SpringBoot自动装配(二)

一、概述 SpringBoot的启动流程入下图所示,它主要分为加载主启动类和解析启动类两个部分,我将从这两个部分分别开始介绍。 二、加载主启动类 首先点入SpringApplication.run方法 之后进入SpringApplication.prepareContext方法 之后进入SpringApplicat…

【JavaEE】简单前后端分离小项目-表白墙

plus版表白墙!✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & 简单前后端分离小项目 - 表白墙1. body格式约定 - 应用层协议2. 后端处理请求2.1 模板2.2 doGet方法2.3 doPost方法 3. 前端制作请求并解析响应3.1 原前端页面的代码3.2 刷新时发送GET请求3.3 点击发送时构造Pos…

40 KVM管理设备-配置磁盘IO悬挂

文章目录 40 KVM管理设备-配置磁盘IO悬挂40.1 总体介绍40.1.1 概述40.1.2 应用场景40.1.3 注意事项和约束限制 40.2 磁盘IO悬挂配置40.2.1 Qemu命令行配置40.2.2 xml配置方式 40 KVM管理设备-配置磁盘IO悬挂 40.1 总体介绍 40.1.1 概述 存储故障(比如存储断链&am…

卡尔曼滤波与组合导航原理(三)连续随机系统的离散化与连续时间Kalman滤波

文章目录 一、连续时间系统方程离散化1、连续时间模型2、状态转移矩阵计算3、激励噪声的等效计算4、最终离散化结论5、常见简单随机过程离散化6、实际物理信号的噪声单位 二、连续时间量测方程离散化三、连续时间Kalman滤波1、连续状态空间模型2、离散时间Kalman滤波3、增益矩阵…

自学网络安全解决问题方法

自学网络安全很容易学着学着就迷茫了,找到源头问题,解决它就可以了,所以首先咱们聊聊,学习网络安全方向通常会有哪些问题,看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间,光语言都有几门&#xf…

《Java并发编程实战》课程笔记(十三)

并发容器 同步容器及其注意事项 Java 中的容器主要可以分为四个大类,分别是 List、Map、Set 和 Queue,但并不是所有的 Java 容器都是线程安全的。 例如,我们常用的 ArrayList、HashMap 就不是线程安全的。如何将非线程安全的容器变成线程安…

java双亲委派机制详解

1. 类加载流程 类加载机制其实就是虚拟机把Class文件加载到内存,并对数据进行校验,转换解析和初始化,形成可以虚拟机直接使用的Java类型,即java.lang.Class。 1.1 装载 Class文件 -- >二进制字节流 -->类加载器 1&#x…

(0.50mm)TF31-4S-0.5SH 4 位置 FFC,FPC 连接器、G846A10221T4EU(1.0MM)矩形连接器 互连器件

TF31-4S-0.5SH (0.50mm)脚距前开盖式FFC/FPC连接器的安装深度为5.7mm,可最大限度地节省电路板空间,并能够自动放置电路板。Hirose Electric TF31连接器具有高FPC保持力(采用FPC侧拉手设计),易于…

Linux下进程及其进程地址空间以及一些进程的控制函数

目录 什么是进程?进程的状态Linux下进程的状态 进程地址空间什么是进程地址空间为什么需要进程地址空间? 进程控制进程控制函数forkwait/waitpid 进程等待进程替换,进程替换函数exe 今天我们来分享一下Linux下的进程和进程地址空间以及一些进…

进出口跨境电商软件平台系统开发,源码技术架构

一、进出口跨境电商软件平台系统开发需做好相应的前期准备,如确定市场、了解政策、推广宣传等。 欢迎名片沟通探讨 确定目标市场:选择合适的目标市场。需要了解目标市场的消费习惯、政策法规以及竞争情况。 了解海关相关政策:针对不同国家或…

python之函数(参数,匿名函数,局部变量和全局变量)

文章目录 前言一、函数的参数 1、形参和实参2、必传参数(也叫:必须参数)3、关键字传参4.、默认参数5、不定长参数6、传参的顺序二、匿名函数(lambda函数) 1. 定义及特点语法格式2. lambda函数的特点三、函数返回值retu…

微信小程序商城开发

随着移动互联网的发展,小程序商城逐渐成为了电商领域的新宠。小程序商城具有便捷、快速、安全等优点,为用户提供了更加优质的购物体验。下面我们来介绍小程序商城的功能和优点。 一、商品展示 小程序商城提供了丰富的商品展示,包括商品分类…

llama_index中query_engine的response_mode详解

文章目录 0. 前言1. ResponseMode: tree_summarize (总结摘要-最优)2. ResponseMode: generation3. ResponseMode: no_text4. ResponseMode: simple_summarize (最省token)5. ResponseMode: refine (基于关键词询问-最…

ROS:坐标管理系统

目录 一、机器人中的坐标变换二、TF功能包2.2TF功能包简介2.2TF坐标变换实现2.3TF案例 三、小海龟跟随实验3.1打开小程序3.2查看当前的TF树3.3坐标相对位置关系可视化1(tf_echo)3.4坐标相对位置关系可视化2(rviz) 一、机器人中的坐…

二、电压源、电流源、受控源

点我回到目录 目录 理想电压源 理想电流源 受控源 电流源做功问题 电压源做功问题 理想电压源 •定义:两端电压保持定值或一定的时间函数,且电压值与流过它的电流i无关 •特点:理想电压源两端的电压由本身决定,与外电路无关…

ChatGPT2论文解读《Language Models are Unsupervised Multitask Learners》(2019)

论文总结 以下是我阅读完整篇论文做的个人总结,包含了ChatGPT-2文章的主要内容,可以仅看【论文总结】章节。 数据集 自制了一个网页爬虫,被抓取的网页部分来自于社交平台,这些网页由人工进行过滤。最终生成WebText数据集&#…

多种工厂模式的运用

文章目录 多种工厂模式的运用一、简单工厂模式(非23种设计模式)1.1 结构2.2 实现2.2.1 简单工厂类图2.2.2 代码2.2.3 优缺点 二、静态工厂模式(非23种设计模式)3.1 代码 三、工厂模式3.1 结构 3.2 实现3.2.1 工厂模式类图3.2.2 代…