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

保姆级教程:用ONNXRuntime对比YOLO11的PyTorch与ONNX输出差异

保姆级教程用ONNXRuntime对比YOLO11的PyTorch与ONNX输出差异在模型部署的实践中PyTorch到ONNX的转换是常见需求但转换后的模型输出是否与原始模型一致却容易被忽视。本文将手把手教你如何通过ONNXRuntime对比YOLO11模型在PyTorch和ONNX两种格式下的输出差异建立完整的验证流程。1. 环境准备与模型导出首先确保已安装必要的Python包pip install ultralytics onnxruntime numpy opencv-pythonYOLO11模型的导出有两种常见方式1.1 直接导出预训练模型from ultralytics import YOLO # 加载官方预训练模型 model YOLO(yolo11n.pt) # 导出为ONNX格式 model.export( formatonnx, dynamicFalse, simplifyFalse, nmsTrue, conf0.25, iou0.45 )1.2 自定义训练后导出# 训练自定义模型 model YOLO(yolo11n.pt) model.train(datacoco128.yaml, epochs10) # 导出训练好的模型 model.export( formatonnx, opset17, nmsFalse # 保留原始输出格式 )关键区别nmsTrue时输出格式为[1,N,6]False时为[1,84,8400]2. PyTorch模型推理验证在转换前必须确保原始PyTorch模型工作正常import cv2 import numpy as np from PIL import Image # 加载测试图像 img cv2.imread(bus.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized cv2.resize(img_rgb, (640, 640)) # PyTorch推理 results model.predict(img_resized, conf0.25) boxes results[0].boxes # 输出关键信息 print(f检测框数量: {len(boxes)}) print(前5个框的置信度:, boxes.conf[:5].tolist()) print(类别分布:, boxes.cls.unique(return_countsTrue))典型输出示例检测框数量: 42 前5个框的置信度: [0.92, 0.89, 0.87, 0.85, 0.82] 类别分布: (tensor([2, 5, 7]), tensor([15, 3, 24]))3. ONNX模型推理与对比3.1 基础推理设置import onnxruntime as ort # 创建推理会话 sess ort.InferenceSession(yolo11n.onnx, providers[CPUExecutionProvider]) # 准备输入数据 input_name sess.get_inputs()[0].name input_data np.expand_dims( img_resized.transpose(2,0,1).astype(np.float32)/255.0, axis0 ) # 执行推理 onnx_output sess.run(None, {input_name: input_data})[0]3.2 输出差异分析我们需要从三个维度对比差异1. 坐标差异分析# 计算框坐标的L2距离 pytorch_boxes boxes.xyxyn.cpu().numpy() onnx_boxes onnx_output[0,:,:4] coord_diff np.sqrt(np.sum((pytorch_boxes - onnx_boxes)**2, axis1)) print(f平均坐标差异: {np.mean(coord_diff):.4f}) print(f最大坐标差异: {np.max(coord_diff):.4f})2. 置信度波动分析conf_diff np.abs(boxes.conf.cpu().numpy() - onnx_output[0,:,4]) print(f置信度平均差异: {np.mean(conf_diff):.4f}) print(f差异超过0.1的比例: {np.mean(conf_diff0.1):.2%})3. 类别一致性检查cls_match (boxes.cls.cpu().numpy() onnx_output[0,:,5]).mean() print(f类别一致率: {cls_match:.2%})3.3 差异可视化import matplotlib.pyplot as plt plt.figure(figsize(12,4)) plt.subplot(131) plt.hist(coord_diff, bins50) plt.title(坐标差异分布) plt.subplot(132) plt.hist(conf_diff, bins50) plt.title(置信度差异分布) plt.subplot(133) plt.bar([匹配, 不匹配], [cls_match, 1-cls_match]) plt.title(类别一致性) plt.tight_layout() plt.show()4. 常见问题排查指南4.1 输出维度不匹配当遇到输出shape不一致时按此流程排查检查PyTorch模型的输出层结构确认ONNX导出时的nms参数设置使用Netron可视化模型结构4.2 数值差异过大若发现显著差异# 检查输入数据一致性 print(输入数据范围对比:) print(fPyTorch输入: {input_data.min():.3f}~{input_data.max():.3f}) print(fONNX输入: {img_resized.min():.3f}~{img_resized.max():.3f}) # 检查预处理是否一致 assert np.allclose( input_data, img_resized.transpose(2,0,1)[None]/255.0, atol1e-5 )4.3 典型异常案例案例1输出全零可能原因模型导出时opset版本不兼容输入数据未归一化案例2置信度异常低解决方案# 调整导出参数重新导出 model.export(conf0.01) # 降低置信度阈值5. 高级对比技巧5.1 批处理差异分析# 准备批处理数据 batch_size 4 batch_data np.stack([input_data[0]]*batch_size) # PyTorch推理 pt_output model(batch_data)[0] # ONNX推理 onnx_output sess.run(None, {input_name: batch_data})[0] # 计算批处理差异 batch_diff np.mean(np.abs(pt_output - onnx_output)) print(f批处理平均差异: {batch_diff:.6f})5.2 量化误差分析# 将模型导出为FP16 model.export(formatonnx, halfTrue) # 对比FP32与FP16结果 fp16_sess ort.InferenceSession(yolo11n_fp16.onnx, providers[CPUExecutionProvider]) fp16_output fp16_sess.run(None, {input_name: input_data})[0] quant_error np.max(np.abs(onnx_output - fp16_output)) print(fFP16量化最大误差: {quant_error:.4f})5.3 跨设备一致性验证# 在CUDA设备上运行 cuda_sess ort.InferenceSession(yolo11n.onnx, providers[CUDAExecutionProvider]) cuda_output cuda_sess.run(None, {input_name: input_data})[0] device_diff np.max(np.abs(onnx_output - cuda_output)) print(fCPU与CUDA输出差异: {device_diff:.6f})6. 自动化验证脚本以下是一个完整的验证脚本模板import json from pathlib import Path class ModelValidator: def __init__(self, model_path): self.model_path Path(model_path) self.results {} def run_validation(self, test_imagebus.jpg): # 实现完整的验证流程 self._validate_pytorch() self._export_onnx() self._validate_onnx() self._compare_results() # 保存验证结果 with open(self.model_path.parent/validation.json, w) as f: json.dump(self.results, f, indent2) # 各验证方法实现...使用方式validator ModelValidator(yolo11n.pt) validator.run_validation()在实际项目中建议将这类验证流程集成到CI/CD管道中确保每次模型更新都能自动验证输出一致性。

相关文章:

保姆级教程:用ONNXRuntime对比YOLO11的PyTorch与ONNX输出差异

保姆级教程:用ONNXRuntime对比YOLO11的PyTorch与ONNX输出差异 在模型部署的实践中,PyTorch到ONNX的转换是常见需求,但转换后的模型输出是否与原始模型一致却容易被忽视。本文将手把手教你如何通过ONNXRuntime对比YOLO11模型在PyTorch和ONNX两…...

论文AI率怎么稳过知网维普?2026最新基准测试:5款实测工具教你一次定稿

知网AIGC检测2026最新攻略!亲测有效,AI率从70%压到9% 自从2026年知网AIGC检测系统全面迭代升级,全国高校几乎统一把AI写作率合格线卡死在15%以内,身边同学因为AI率超标被打回重改、延迟答辩的比比皆是。 这段时间我试遍了全网所…...

CompactGUI社区数据库:游戏压缩效果的终极共享指南

CompactGUI社区数据库:游戏压缩效果的终极共享指南 【免费下载链接】CompactGUI Transparently compress active games and programs using Windows 10/11 APIs 项目地址: https://gitcode.com/gh_mirrors/co/CompactGUI 你是否曾为电脑存储空间不足而烦恼&a…...

机器学习调参必备:5个最常用的矩阵求导公式(附PyTorch/TensorFlow代码验证)

机器学习调参必备:5个最常用的矩阵求导公式(附PyTorch/TensorFlow代码验证) 在深度学习的模型优化过程中,矩阵求导是理解梯度下降和反向传播算法的数学基础。许多工程师虽然能够熟练使用框架提供的自动微分功能,但当需…...

MiroFish群体智能引擎快速部署指南:新手友好的多场景实施方案

MiroFish群体智能引擎快速部署指南:新手友好的多场景实施方案 【免费下载链接】MiroFish A Simple and Universal Swarm Intelligence Engine, Predicting Anything. 简洁通用的群体智能引擎,预测万物 项目地址: https://gitcode.com/GitHub_Trending/…...

Langflow场景化部署指南:为不同用户定制的安装方案

Langflow场景化部署指南:为不同用户定制的安装方案 【免费下载链接】langflow ⛓️ Langflow 是 LangChain 的用户界面,使用 react-flow 设计,旨在提供一种轻松实验和原型设计流程的方式。 项目地址: https://gitcode.com/GitHub_Trending/…...

禾赛年报图解:营收30亿,经调整净利5.5亿 成激光雷达行业首家全年GAAP盈利企业

雷递网 雷建平 3月24日禾赛科技(NASDAQ:HSAI;HKEX:2525)今日公布了2025年第四季度以及全年未经审计的财务数据。财报显示,禾赛2025年营收为30.28亿元,较上年同期的20.77亿元增长45.8%。禾赛2025年运营利润为1.68亿元&a…...

高效开启AI专著撰写!揭秘让写作速度飙升的实用工具

创新与AI写专著工具的背景 创新是学术专著的核心,也是写作过程中的一大挑战。一部优秀的专著不应仅仅是把之前的研究成果堆在一起,而是要能够提出贯穿全书的新颖观点、理论结构或研究手段。在海量的学术文献中,发现未被充分探讨的研究空白并…...

面试官最爱问的JavaScript八股文,我用这5段代码给你讲明白(附手写实现)

面试官最爱问的JavaScript八股文,我用这5段代码给你讲明白(附手写实现) 1. 原型链:从代码看透JavaScript的继承本质 面试中关于原型链的问题往往以"请解释new一个对象的过程"开场。让我们用一段代码揭开这个机制的神秘面…...

Virtual-Display-Driver技术指南:Windows虚拟显示驱动解决方案

Virtual-Display-Driver技术指南:Windows虚拟显示驱动解决方案 【免费下载链接】Virtual-Display-Driver Add virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software. 项目地址: https://gitcode.c…...

Arduino MCP2515轻量CAN库:确定性时序与寄存器级控制

1. 项目概述CanBusMCP2515_asukiaaa是一款面向 Arduino 平台的轻量级 CAN 总线通信库,专为驱动 Microchip MCP2515 和 MCP25625 CAN 控制器/收发器组合而设计。该库通过标准 SPI 接口与硬件交互,完整支持 CAN 2.0B 协议规范,具备标准帧&#…...

bb_hx1230 LCD驱动:超低资源MCU的9位位操作实现

1. bb_hx1230库概述:面向超低资源MCU的HX1230 LCD驱动精要bb_hx1230是BitBank Software于2018年4月30日启动的嵌入式显示驱动项目,专为资源极度受限的微控制器(如ATtiny系列)设计。其核心工程目标极为明确:在保证功能完…...

DRV2667压电触觉驱动器原理与Arduino嵌入式实践

1. DRV2667 压电触觉驱动器深度技术解析与嵌入式集成实践 1.1 芯片级功能定位与工程价值 DRV2667 是德州仪器(TI)推出的高集成度压电触觉驱动芯片,专为需要高电压、低功耗、精准波形控制的触觉反馈系统设计。其核心价值不在于简单地“驱动压…...

Linux小白必看!VMware虚拟机添加虚拟硬盘后必须做的5件事(附常见报错解决方案)

VMware虚拟机添加虚拟硬盘后的专业运维指南 当你为Linux系统添加新的虚拟硬盘时,真正的挑战往往从挂载完成后才开始。作为系统管理员,我们需要确保这块硬盘不仅现在能用,还要在未来长期稳定运行。以下是五个关键步骤,让你的虚拟硬…...

VBA Collection对象实战:从Excel数据处理到自动化报表的5个高效技巧

VBA Collection对象实战:从Excel数据处理到自动化报表的5个高效技巧 在Excel自动化领域,VBA的Collection对象就像瑞士军刀中的主刀——看似简单却功能强大。不同于数组的刻板和字典的复杂,Collection以轻量级特性成为处理动态数据的理想选择。…...

nli-distilroberta-base惊艳案例:支持自定义label映射的灵活NLI接口设计实践

nli-distilroberta-base惊艳案例:支持自定义label映射的灵活NLI接口设计实践 1. 项目概述 自然语言推理(NLI)是理解文本语义关系的重要技术。nli-distilroberta-base基于轻量高效的DistilRoBERTa模型,提供了强大的句子对关系判断…...

企业级开源帮助台系统FreeScout快速部署与配置指南

企业级开源帮助台系统FreeScout快速部署与配置指南 【免费下载链接】freescout FreeScout — Free self-hosted help desk & shared mailbox (Zendesk / Help Scout alternative) 项目地址: https://gitcode.com/gh_mirrors/fre/freescout 如何在30分钟内搭建企业级…...

UniApp真机调试支付宝扫码,从‘报错’到‘跑通’的完整避坑指南

UniApp真机调试支付宝扫码:从报错到流畅运行的实战指南 第一次在UniApp中集成支付宝原生扫码功能时,我遇到了一个令人抓狂的问题——明明在模拟器上运行得好好的,一到真机调试就各种报错。经过反复尝试和查阅文档,终于找到了问题的…...

CosyVoice模型怎么选?300M、0.5B、SFT、Instruct版本差异与实战效果对比

CosyVoice模型选型指南:从参数规模到微调版本的深度解析 当你成功安装CosyVoice后,打开pretrained_models目录可能会被琳琅满目的模型文件搞得一头雾水——300M、0.5B、SFT、Instruct这些后缀究竟意味着什么?作为一款新兴的开源语音合成系统&…...

如何快速定制Windows界面:高效工作环境的终极指南

如何快速定制Windows界面:高效工作环境的终极指南 【免费下载链接】ExplorerPatcher 提升Windows操作系统下的工作环境 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 你是否厌倦了Windows 11的默认界面?想要恢复熟悉的操作…...

DS3231/DS3232高精度RTC驱动设计与工业时间同步实践

1. DS323x_Generic 库深度技术解析:面向工业级时间同步的嵌入式RTC驱动设计1.1 高精度时间基准的工程必要性在嵌入式系统中,时间戳的准确性直接决定系统可靠性。传统MCU内置RTC(如STM32的BKP域RTC)在-40℃~85℃工业温度范围内月漂…...

软件安装包极致压缩与分发加速指南

软件安装包极致压缩与分发加速指南 【免费下载链接】romm A beautiful, powerful, self-hosted rom manager 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 副标题:技术选型全解析 90%效率提升实践 自动化工具包 开发者痛点场景:当…...

5个维度解析pymatgen:高效实用的材料科学计算与分析工具

5个维度解析pymatgen:高效实用的材料科学计算与分析工具 【免费下载链接】pymatgen Python Materials Genomics (pymatgen) is a robust materials analysis code that defines classes for structures and molecules with support for many electronic structure c…...

嵌入式C语言核心技术与经典书籍推荐

C语言学习必读经典书籍推荐与核心知识点解析1. C语言在嵌入式开发中的核心地位C语言作为嵌入式系统开发的基石语言,具有直接操作硬件、执行效率高、可移植性强等显著优势。在资源受限的嵌入式环境中,熟练掌握C语言是开发高效可靠嵌入式系统的必备技能。1…...

FreeRTOS任务管理与调度机制详解

FreeRTOS任务管理深度解析1. 实时操作系统任务基础1.1 任务基本概念在实时操作系统(RTOS)中,任务是最基本的执行单元。每个实时应用可以作为一个独立的任务运行,具有以下特性:独立运行环境:每个任务拥有自己的运行上下文&#xff…...

RC5红外协议底层实现与嵌入式集成指南

1. RC5协议底层实现技术解析RC5是一种由Philips(现NXP)于1980年代设计的红外遥控通信协议,广泛应用于电视、机顶盒、音响等消费电子设备。与通用异步收发器(UART)或IC等同步总线不同,RC5采用双相曼彻斯特编…...

CompactGUI社区数据库:协作优化游戏压缩的智慧共享平台

CompactGUI社区数据库:协作优化游戏压缩的智慧共享平台 【免费下载链接】CompactGUI Transparently compress active games and programs using Windows 10/11 APIs 项目地址: https://gitcode.com/gh_mirrors/co/CompactGUI 💡 知识卡片&#xf…...

当Pwn题遇上Seccomp沙箱:手把手教你用SROP绕过LilCTF ret2all的write限制

突破Seccomp沙箱:SROP技术在CTF Pwn题中的高阶应用 在CTF竞赛中,Pwn题目常常会设置各种限制条件来增加挑战难度,其中Seccomp沙箱是最常见的防护手段之一。当遇到禁用关键系统调用(如write)的沙箱环境时,传统…...

为 GraphRAG 准备语料库

经典 RAG 专注于找到正确的段落,而 GraphRAG 帮助你看到段落、实体和主题在整个文档集合中是如何连接的。原始 GraphRAG 论文指出,标准 RAG 常常在处理宽泛问题时遇到困难,比如"这个数据集中的主要主题是什么?"为了解决…...

别再只盯着顶刊了!这5本AI领域的SCI期刊,投稿友好、审稿快,适合你的第一篇论文

5本AI领域高性价比SCI期刊:避开顶刊内卷的投稿策略 在人工智能研究领域,发表SCI论文是衡量学术成果的重要指标。然而,Nature Machine Intelligence、IEEE TPAMI等顶刊的投稿竞争异常激烈,审稿周期动辄半年以上,对创新性…...