当前位置: 首页 > news >正文

Pytorch图像模型转ONNX后出现色偏问题

本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后,在推理过程中出现了明显色偏问题的解决过程。

问题描述:原始pytorch模型推理正常,通过torch.onnx.export()函数转换成onnx之后,推理时出现了比较明显的颜色偏差。

原始模型转换程序如下:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')pth_path = 'model/my_model.pth'
onnx_path = 'model/my_model.onnx'# 模型定义
model = MyModelStruct()
# 加载模型到设备
model.to(device)# 加载checkpoint
checkpoint = torch.load(pth_path, map_location=device)
# 将checkpoint加载到模型
model.load_state_dict(checkpoint) # 将模型设置为推理模式
model.eval()# 定义模型输入输出
input_names = ['input', 'a', 'b']
output_names = ['output']# 定义输入数据格式,随机数初始化
input = torch.rand(1,3, 512, 512)
a = torch.rand(1)
b = torch.rand(1)# 将数据加载到设备
input = input.to(device)
a = a.to(device)
b = b.to(devici)# 开始转换
torch.onnx.export(model, (input, a, b), onnx_path, input_names=input_names, output_names=output_names, verbose=True)print('Done.')

问题解决过程:

1. 由于不是自己的模型,因此,这个pytorch模型拿到手后,先自己写了推理程序,在自己的PC上跑了一下。我自己的PC机只有CPU,在CPU上运行的结果跟onnx上一致,也存在色偏。但将同样的程序放到GPU服务器上运行,结果确实正常的。因此得出结论,应该是模型中间的某些算子,在CPU和GPU上的处理存在误差。

2. 将pytorch模型使用上面的转换程序转换成onnx之后,通过onnxruntime进行推理(这部分本篇先略过,后面再专门开一篇写onnxruntime推理),同样偏色,复现了最初的问题。

3. 通过研究torch.onnx.export()函数,发现跟算子处理关系最大的参数是opset_version,我的版本中,默认使用的opset_version为14,尝试换到16,转换出来的模型推理结果竟然正常了!

相应转换代码替换为:

torch.onnx.export(model, (input, a, b), onnx_path, input_names=input_names, output_names=output_names, verbose=True, opset_version=16)

torch.onnx.export()接收的部分关键参数解释如下:

_export(model,args,f,export_params,verbose,training,input_names,output_names,operator_export_type=operator_export_type,opset_version=opset_version,do_constant_folding=do_constant_folding,dynamic_axes=dynamic_axes,keep_initializers_as_inputs=keep_initializers_as_inputs,custom_opsets=custom_opsets,export_modules_as_functions=export_modules_as_functions,)

其中,

  • model:需要被转换成onnx的模型。
  • args:模型输入参数,一般我们在这里指定模型输入数据的尺寸,如果模型有多个参数,该参数也可以是一个元组,如本例中模型输入三个参数。
  • f:要导出的onnx模型的路径,包括onnx文件名。
  • export_params:(bool, default True),为True时所有的模型参数都会被导出;为False时,则会导出一个未被训练的模型。
  • training:(enum, default TrainingMode.EVAL),有三种模式,分别为:TrainingMode.EVAL,TrainingMOde.PRESERVE,TrainingMode.TRAINING,一般使用EVAL模式即可。
  • input_names:模型图中输入节点的名称,字符串。
  • output_names:模型图中输出节点的名称,字符串。
  • operator_export_type:算子导出类型,包括:OperatorExportTypes.ONNX,OperatorExportTypes.ONNX_FALLTHROUGH,OperatorExportTypes.ONNX_ATEN,OperatorExportTypes.ONNX_ATEN_FALLBACK,我们常用的模型算子一般都有onnx支持,因此默认选第一种。
  • opset_version:这是我们本篇中问题解决的核心参数,默认opset版本为14,可用范围是7~16,通过手动设置,将其设为最高版本,问题初步解决。
  • dynamic_axes:允许在导出的onnx模型中创建变化的维度,是一个字典形式,默认为空。

4. 到第三步其实还没完,因为,虽然模型输出没有偏色了,但是拿到实际场景中去运行,发现它的运行速度变慢了很多。于是又尝试了使用opset_version 11:

torch.onnx.export(model, (input, a, b), onnx_path, input_names=input_names, output_names=output_names, verbose=True, opset_version=11)

这次,也没有偏色,而且推理速度回归正常。

目前暂时使用opset_version 11,至于为什么版本16会使运行速度变慢,还需要更深入地去了解不同版本地差异。留待后续吧。

相关文章:

Pytorch图像模型转ONNX后出现色偏问题

本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后,在推理过程中出现了明显色偏问题的解决过程。 问题描述:原始pytorch模型推理正常,通过torch.onnx.export()函数转换成onnx之后,推理时出现了比较明显的颜色偏差。 原始模型…...

插值表达式 {{}}

前言 持续学习总结输出中,今天分享的是插值表达式 {{}} Vue插值表达式是一种Vue的模板语法,我们可以在模板中动态地用插值表达式渲染出Vue提供的数据绑定到视图中。插值表达式使用双大括号{{ }}将表达式包裹起来。 1.作用: 利用表达式进行…...

白雪公主

前言 #define 皇后 王后 在很久很久以前,有一个国王,由于王后难产致死,导致生下的孩子没母,由于缺爱,变的非常的刻薄 由于公主过于刻薄,以至于见到她的人都面色煞白感到空中飘雪 37C 的嘴怎能说出如此刻薄的话语。为了…...

宏观角度认识递归之合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode) 依旧是利用宏观角度来看待问题,其中最主要的就是要找到重复的子问题; 题目中要求把两个有序链表进行合并,同时不能够创建新的节点,并返回链表的起始点:因…...

Leetcode-509 斐波那契数列

使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…...

解密 docker 容器内 DNS 解析原理

背景 这几天在使用 docker 中&#xff0c;碰到了在容器中 DNS 解析的一些问题。故花些时间弄清了原理&#xff0c;写此文章分享。 1. docker run 命令启动的容器 以启动一个 busybox 容器为例&#xff1a; rootubuntu20:~# docker run -itd --name u1 busybox 63b59ca8aeac…...

故障诊断模型 | Maltab实现SVM支持向量机的故障诊断

效果一览 文章概述 故障诊断模型 | Maltab实现SVM支持向量机的故障诊断 模型描述 Chinese: Options:可用的选项即表示的涵义如下   -s svm类型:SVM设置类型(默认0)   0 – C-SVC   1 --v-SVC   2 – 一类SVM   3 – e -SVR   4 – v-SVR   -t 核函数类型:核函…...

开源的网站数据分析统计平台——Matomo

Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面&#xff0c;就可以看到登陆…...

linux入门到地狱

linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退&#xff0c;僵停(vs2019卡掉线)&#xff0c;重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…...

架构”4+1“视图

1995年Kruchten提出了著名的“41”视图&#xff0c;用来描述软件系统的架构。在“41”视图中&#xff0c;&#xff08;物理视图 &#xff09;用来描述系统软硬件之间的映射关系&#xff0c;这个视图往往&#xff08;系统工程人员&#xff09;最为关注&#xff1b;&#xff08;逻…...

『精』Vue 组件如何模块化抽离Props

『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料&#x1f498;推荐博文&#x1f357; 一、为什么要抽…...

JavaScript字符串字面量详细解析与代码实例

JavaScript字符串字面量是一种表示字符串值的语法结构&#xff0c;通常用双引号或单引号括起来。 var str1 "Hello World!"; var str2 Hello World!;另外&#xff0c;如果需要在字符串中包含双引号或单引号&#xff0c;可以使用转义字符\来实现。 var str3 &quo…...

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据

一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据&#xff0c;实际使用可以成功传统图像数据。 发送&#xff1a;Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…...

CTF工具PDF隐写神器wbStego4open安装和详细使用方法

wbStego4open安装和详细使用方法 1.wbStego4open介绍&#xff1a;2.wbStego4open下载&#xff1a;3.wbStego4open原理图&#xff1a;4.wbStego4open使用教程&#xff1a;第一步&#xff1a;第二步&#xff1a;第三步&#xff1a;第四步&#xff1a;第五步&#xff1a; 5.wbSteg…...

docker镜像使用

一、查看docker版本 docker version docker默认安装目录 /var/lib/docker 目录文件如下&#xff1a; 二、查看下载的镜像 docker images 三、下载镜像 docker pull [OPTIONS] NAME[:TAG|DIGEST] option作用-a, --all-tags拉取所有 tagged 镜像–disable-content-trust…...

【Git】git的下载安装与使用

目录 目录 一.下载安装 官方下载 淘宝镜像下载 安装 二.创建本地仓库 三.git的基本操作命令 git status git add . git commit -m " " 四.gitee(码云&#xff09;的使用 配置ssh公钥 ​编辑 查看公钥 gitee创建仓库 将本地仓库的文件上传到远程仓库…...

R语言中的函数27:polynom::polynomial(), deriv(),integral(),solve()多式处理函数

文章目录 介绍polynomial()用法参数实例多项式的加减乘除等运算实例 deriv()和integral()用法参数实例solve()参数实例 介绍 R语言中的polynom包可以实现对多项式的操作&#xff0c;例如&#xff1a;加、减、乘、除、微分、积分。使用的时候先用polynomial()函数定义一个多项式…...

基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM

文章目录 前言1. 接口概述1.1 USART/UART接口1.2 串口通信参数1.3 波特率计算 2. 传输函数3. 回环测试3.1 上位机环境配置3.2 阻塞模式3.3 中断模式 4. STM32CubeMX配置4.1 时钟配置4.2 调试配置4.3 串口引脚配置4.4 工程配置 5. 测试效果6. 不借助上位机回环测试总结 前言 这…...

Spring cloud负载均衡 @LoadBalanced注解原理

接上一篇文章&#xff0c;案例代码也在上一篇文章的基础上。 在上一篇文章的案例中&#xff0c;我们创建了作为Eureka server的Eureka注册中心服务、作为Eureka client的userservice、orderservice。 orderservice引入RestTemplate&#xff0c;加入了LoadBalanced注解&#x…...

C#when关键字

在C#中&#xff0c;when关键字用于在模式匹配表达式中添加条件。它允许您在模式匹配的过程中指定额外的条件&#xff0c;以进一步过滤匹配的模式。当模式匹配和附加条件都为真时&#xff0c;相关的代码块将被执行。 以下是when关键字的详细解释以及示例说明&#xff1a; 语法…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...