YOLOv8模型导出ONNX的5个常见坑点及解决方案(附完整流程)

openCV调用YOLOv5 ONNX模型 导出U版YOLOv5的ONNX模型,openCV直接读取会失败,原因在于Pytorch2ONNX不支持对slice对象赋值,需要更改下列两个地方代码: yolov5/models/common.py class Focus(nn.Module): # Focus wh information into c-space def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel 阅读详情

YOLOv8模型导出ONNX的5个常见坑点及解决方案(附完整流程)

在计算机视觉领域,YOLOv8作为当前最先进的目标检测算法之一,其模型部署过程中ONNX格式导出是关键的中间环节。本文将深入剖析YOLOv8模型导出ONNX格式时可能遇到的典型问题,并提供经过实战验证的解决方案。无论您是需要快速排障的中级开发者,还是希望深入理解模型导出机制的研究者,都能从本文获得实用价值。

1. 动态轴设置失败问题

动态轴设置是ONNX导出中最常见的痛点之一。当您需要处理可变尺寸的输入时,动态轴配置显得尤为重要,但实际操作中往往会遇到导出失败的情况。

典型错误现象:

RuntimeError: Failed to export model with dynamic axes

根本原因分析:

  1. PyTorch版本与ONNX opset兼容性问题
  2. 模型结构中存在不支持动态轴的算子
  3. 动态轴参数格式不符合规范

解决方案:

# 正确的动态轴设置方式
dynamic_axes = {
    'images': {
        0: 'batch',
        2: 'height', 
        3: 'width'
    },
    'output': {
        0: 'batch',
        2: 'anchors'
    }
}

# 导出时添加dynamic_axes参数
torch.onnx.export(
    ...,
    dynamic_axes=dynamic_axes
)

验证方法:

python -c "import onnx; model = onnx.load('model.onnx'); print(model.graph.input[0].type.tensor_type.shape)"

注意:动态导出必须使用CPU模式,GPU模式下会出现不可预知的错误

2. Opset版本冲突问题

ONNX的opset版本决定了可用的算子集合,版本不匹配会导致严重的兼容性问题。

版本兼容矩阵:

YOLOv8版本推荐ONNX opset支持范围
v8.0.x1211-13
v8.1.x1514-16
v8.2+1716-18

常见错误场景:

  1. 使用过时的opset版本导致算子不支持
  2. 新版特性在旧opset中不可用
  3. 自定义算子与opset版本不匹配

最佳实践:

# 自动获取最新opset版本
import onnx
opset_version = onnx.defs.onnx_opset_version()

# 手动指定opset版本
export_params = {
    'opset_version': 17,
    # 其他参数...
}

诊断命令:

onnxruntime-tools checker -v your_model.onnx

3. 模型简化报错处理

模型简化是优化ONNX模型的重要步骤,但不当的简化操作可能导致模型功能异常。

简化流程的三大陷阱:

  1. 过度简化:移除关键节点导致精度下降

    • 解决方案:保留NMS相关节点
    skip_fusion=['NonMaxSuppression']
    
  2. 依赖缺失:缺少onnx-simplifier或onnxruntime

    • 完整依赖安装:
    pip install onnx-simplifier onnxruntime-gpu
    
  3. 版本冲突:简化工具与ONNX版本不兼容

    • 版本对应关系:
    工具版本ONNX版本要求Python版本
    0.3.6>=1.8.0>=3.6
    0.4.0+>=1.12.0>=3.8

安全简化方案:

def safe_simplify(model_path):
    import onnx
    from onnxsim import simplify
    
    model = onnx.load(model_path)
    model_simp, check = simplify(model,
                                skip_fusion=['NonMaxSuppression'],
                                perform_optimization=True)
    assert check, "Simplified model validation failed"
    onnx.save(model_simp, "simplified.onnx")

4. 后处理节点丢失问题

YOLOv8的完整部署需要包含后处理节点,但默认导出时这些关键节点可能丢失。

关键后处理节点:

  • NonMaxSuppression (NMS)
  • Score阈值过滤
  • 坐标转换

完整导出方案:

# 导出包含后处理的完整模型
model.export(
    format='onnx',
    nms=True,          # 包含NMS节点
    agnostic_nms=False, # 类别相关NMS
    topk_per_class=100, # 每类保留最多检测数
    conf_thres=0.25,    # 置信度阈值
    iou_thres=0.45      # IoU阈值
)

节点验证方法:

import onnx
model = onnx.load("yolov8n.onnx")
nodes = [n.op_type for n in model.graph.node]
print("NonMaxSuppression" in nodes)  # 应输出True

5. 批量推理支持问题

生产环境通常需要批量推理支持,但默认导出的ONNX模型可能无法正确处理批量输入。

批量导出配置:

# 显式指定动态batch维度
dynamic_axes = {
    'images': {0: 'batch'},  # 仅动态batch维度
    'output': {0: 'batch'}
}

# 导出时提供样本输入
sample_input = torch.randn(2, 3, 640, 640)  # batch=2的示例输入

torch.onnx.export(
    model,
    sample_input,
    'model.onnx',
    dynamic_axes=dynamic_axes
)

批量推理验证:

import onnxruntime as ort

# 创建支持动态batch的session
options = ort.SessionOptions()
session = ort.InferenceSession('model.onnx', options)

# 测试不同batch大小的输入
for batch in [1, 2, 4]:
    inputs = {'images': np.random.randn(batch, 3, 640, 640).astype(np.float32)}
    outputs = session.run(None, inputs)
    print(f"Batch {batch} output shape:", outputs[0].shape)

完整导出流程示例

结合上述解决方案,以下是经过实战检验的完整导出流程:

import torch
from ultralytics import YOLO

# 1. 加载预训练模型
model = YOLO('yolov8n.pt')  # 从官方仓库加载

# 2. 准备导出配置
export_params = {
    'format': 'onnx',
    'imgsz': 640,
    'dynamic': True,      # 启用动态轴
    'simplify': True,     # 启用模型简化
    'opset': 17,          # 使用最新opset
    'nms': True,          # 包含后处理
    'batch': 4            # 支持的最大batch
}

# 3. 执行导出
model.export(**export_params)

# 4. 验证导出结果
import onnx
onnx_model = onnx.load('yolov8n.onnx')
onnx.checker.check_model(onnx_model)
print("Export verification passed!")

关键参数说明:

参数类型默认值建议值作用
dynamicboolFalseTrue启用动态输入尺寸
simplifyboolTrueTrue启用模型简化
opsetint自动选择17ONNX算子集版本
nmsboolFalseTrue包含后处理节点
batchint14最大batch大小

在实际项目中遇到导出问题时,建议按照以下步骤排查:

  1. 检查PyTorch和ONNX版本兼容性
  2. 验证动态轴设置是否符合规范
  3. 确认opset版本是否支持所有算子
  4. 测试简化后的模型功能是否完整
  5. 验证不同batch大小的推理结果一致性
Yolov5 export.py实现onnx模型的导出 查了很多资料,很多用python代码写的,只需要这个库那个库的,最后都没成功。不如直接使用Yolov5里面的 export.py实现模型的转换。 阅读详情

相关推荐

【ONNX】yolov5 onnx修改

学习ONNX转换笔记。

qq_30340349的博客 3417

【yolov8】模型导出----pytorch导出为onnx模型

下表详细介绍了将YOLO 模型导出为不同格式时可用的配置和选项。这些设置对于优化导出模型的性能、大小以及在不同平台和环境中的兼容性至关重要。动态输入尺寸允许导出的模型处理不同的图像尺寸,为不同的使用案例提供灵活性并优化处理效率。在导出为ONNX 或TensorRT 等格式时,启用动态输入尺寸可确保模型能无缝适应不同的输入形状。YOLOv8 导出到TensorRT 的模型速度最高可达GPU 的 5 倍,是实时推理应用的理想选择。INT8 量化是压缩模型和加快推理速度的绝佳方法,尤其是在边缘设备上。

qq_43755954的博客 1万+

YOLOv8模型量化实战:从ONNX导出到INT8转换的完整避坑指南

本文详细介绍了YOLOv8模型量化的完整流程,从ONNX导出到INT8转换的实战指南。涵盖动态量化与静态量化的关键技术,包括环境配置、校准数据集准备、量化参数调优等核心环节,并解决量化后精度骤降等常见问题,帮助开发者在边缘计算设备上实现高效目标检测。

dropout6artist的博客 936

【YOLOv8模型onnx部署详解】YOLOv8模型转onnx格式并使用onnxruntime 进行推理部署

【YOLOv8模型onnx部署详解】YOLOv8模型转onnx格式并使用onnxruntime 进行推理部署

阿旭的博客 1万+

超详细YOLOv8模型导出参数、说明详解

YOLO 模型的导出设置是指用于在其他环境或平台中使用模型时保存或导出模型的各种配置和选项。一些常见的 YOLO 导出设置包括导出的模型文件格式(例如 ONNX、TensorFlow SavedModel)、模型将在哪个设备上运行(例如 CPU、GPU)以及是否包含附加功能,如遮罩或每个框多个标签。Ultralytics YOLOv8 的导出模式提供了多种选项,用于将您训练好的模型导出到不同的格式,从而可以在各种平台和设备上部署。本综合指南旨在带您逐步了解模型导出的细节,展示如何实现最大的兼容性和性能。

CDBmax的博客 4754

地平线RDK-X5实战:YOLOv11模型转ONNX踩坑记录(附完整代码)

本文详细记录了在地平线RDK-X5开发板上将YOLOv11模型转换为ONNX格式的全流程,包括环境配置、模型结构改造、ONNX导出及地平线工具链实战。特别针对转换过程中的常见问题和优化技巧提供了实用解决方案,帮助开发者高效完成边缘计算部署。

qsc9012345的博客 850

YOLOv8不同模型对比和onnx部署详解

(1)`如何将YOLOv8模型转为其他不同的部署文件格式`,并且比较了`YOLOv8n.pt`的5种不同部署方式:包括`原生yolov8n.pt的Pytorch格式、ONNX、OpenVINO-FP32、OpenVINO-int8、TensorRT`在CPU和GPU下的推理速度对比; (2)如何将YOLOv8模型`.pt`转为`onnx格式`。然后使用`onnxruntime`进行目标检测模型的图像推理。

qq_44231797的博客 5863

YOLO模型ONNX导出踩坑记:10个常见错误+解决方案,TensorRT部署一次过

使用自定义模块(如添加CBAM注意力的YOLO)时,导出报错“Could not export module xxx”。导出前确认模型无自定义算子(或已适配ONNX);统一预处理(RGB转换、归一化、尺寸);选择合适opset(TRT版本+1)。ONNX导出启用简化模型;动态维度明确指定轴范围;用Netron检查输出节点数量与格式。TensorRT转换先用FP16验证功能,再尝试INT8;工作空间workspace≥4096(大模型需更大);保存校准缓存(INT8量化复用)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 884

YOLOv5导出onnx、TrensorRT部署(LINUX)

yolov5转TensorRT部署

qq_40198848的博客 7180

YOLOv5系列(2)——YOLOv5导出jit,onnx,engine

文章目录一、YOLOv5导出jit二、YOLOv5导出onnx三、使用onnx四、YOLOv5导出engine(tensorrt/trt)五、总结所有代码5.1 models/common.py5.2 models/yolo.py5.3 test00.py5.4 onnx_export.py(test01.py)5.5 models/yolov5s.yaml5.6 pkg/common.py5.7 engine_export.py(test03.py) 做个YOLOv5的专题,这部分写一些YOLOv5的工程

wa1tzy的博客 8615

如何导出YOLOv11模型(ONNX/TensorRT格式):详解模型转换命令及常见问题解决

YOLOv11模型导出是实现跨平台部署的关键步骤,支持多种格式以适应不同应用场景。ONNX作为开放标准,具有跨平台兼容性,适合模型交换;而TensorRT专为NVIDIA GPU优化,能显著提升推理性能。两者各有优势:ONNX适用于多平台部署,TensorRT则针对NVIDIA硬件实现极致优化。实际应用中常采用"PyTorch→ONNX→TensorRT"的转换流程,兼顾灵活性与性能。环境配置需确保Python 3.8+、PyTorch 1.9+及CUDA 11.4+等核心依赖,为后续导

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 2608

YOLOv5的pytorch模型文件转换为ONNX文件

YOLOv5YOLOv5下载与测试运行导出ONNX格式文件ONNX转为为IR中间格式 OpenVINO从2020R02以后版本开始支持直接读取ONNX格式文件,所以我们既可以通过脚本直接导出onnx格式文件,直接给OpenVINO调用,也可以对得到ONNX文件通过OpenVINO的模型转换脚本做进一步转换生成IR中间格式(.bin文件与.xml文件)。 环境: Windows 10 Anaconda 2.0.4 OpenVINO 工具包 2020.2 Python 3.6.13 torch 1.9.0 o

꧁༺ʚvv༒catɞ༻꧂的博客 2万+

零基础玩转华为AP 4050DN-HD:FAT模式家庭无线网络配置实战

本文为零基础用户提供华为AP 4050DN-HD从FIT模式转换为FAT模式的完整实战教程。详细介绍了固件升级、模式转换以及配置家庭无线网络(包括路由、DHCP、Wi-Fi和NAT)的每一步操作,帮助用户将企业级瘦AP改造为高性能家庭胖AP,打造稳定可靠的家庭网络环境。

weixin_29196613的博客 634

YoloV7:基于自己训练的模型如何导出正确的ONNX

前面我们说到了如何基于自己数据集训练,感兴趣的小伙伴可以去看下。。。我们得到了pt文件之后需要将他转换为ONNX,之后在对ONNX进行相应的部署,能完整的部署的前提是我们需要导出完整的ONNX。.........

qianxun 1万+

道岔故障监测系统设计(源码+开题)

通过实时监控道岔的工作状态,系统能够及时发现异常情况,预防潜在的安全隐患,从而减少事故发生的概率。此外,监测系统还能够为维护人员提供详细的数据支持,帮助他们更准确地判断道岔的磨损程度和故障类型,优化维修计划,延长道岔的使用寿命。随着智能化、自动化技术的发展,道岔故障监测系统的设计与应用也将推动铁路行业的技术进步,为实现智能铁路和未来交通系统的构建奠定基础。因此,开展道岔故障监测系统的设计研究,不仅具有重要的工程实践价值,也有助于推动铁路运输行业向更高水平的发展。

灵军程序设计 771

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1005

YOLOv5模型转换实战:从.pt到ONNX的完整避坑指南(附常见错误排查)

本文详细介绍了将YOLOv5模型从.pt格式转换为ONNX格式的完整流程,包括环境准备、标准转换步骤、常见错误排查及高级优化技巧。通过实战指南和常见问题解决方案,帮助开发者高效完成模型转换,提升跨平台部署效率。特别关注了ONNX格式转换中的动态维度处理和模型简化技术。

cream的博客 946

从医疗成像到工业检测:CMOS图像传感器NIR技术的最新应用案例解析

本文深入解析了CMOS图像传感器NIR技术在医疗成像和工业检测中的最新应用案例。通过提升量子效率至70%,NIR技术实现了血管可视化、材料缺陷检测等突破性进展,显著提高了医疗诊断精度和工业质检效率。文章还探讨了系统集成关键考量和前沿发展趋势。

weixin_30879169的博客 92

ONNX模型导出避坑大全:以YOLOv8为例详解动态轴/算子集版本选择

本文详细解析了YOLOv8模型导出为ONNX格式的关键技术,包括动态轴配置、算子集版本选择及模型简化优化。通过对比不同导出配置的性能差异,为开发者提供实用指南,帮助实现高效模型部署,特别适用于计算机视觉和边缘计算场景。

cream的博客 993

FPGA/IC 秋招笔试/面试题总结(续)

FPGA/IC 秋招笔试/面试题总结(续)来啦… 文章目录二十七、状态机1. Moore/Mealy状态机2.一、二、三段式状态机 二十七、状态机 1. Moore/Mealy状态机 (1)Moore状态机: 输出只由当前状态决定,即次态=f(现态。输入),输出=f(现态) Moore型状态机的输出信号是直接由状态寄存器译码得到的。 Moore型状态机检测序列1101如下 Moore型状态机输出函数只由状态变量决定,想要输出Z=1,必须S4状态形成,即寄存器中的1101都打进去后才可以。输出Z=1会在

Crazzy_M的博客 2万+

AMBA-CHI协议详解(十五)

Write transactions事务描述以及请求属性,cache line状态转换。

Crazzy_M的博客 651

yolov5 pt 模型 导出 onnx

在训练好的yolov5 pt 模型 可以 通过 export.py 进行导出 onnx导出流程在 export.py 设置模型和数据源的yaml在官方的文档中 说明了可以导出的具体的类型。 在 添加导出的类型, 不同的 类型的 环境要求不一样,建议虚拟环境,比如onnx 和 openvino 的numpy 版本要求不一只,一个要求高配,一个要求低配 如何测试和验证推理 在模型导出的中onnx 和 openvino 不需要GPU进行推理,但是tensorRT 需要 GPU 进行推理...

微信号:RunsenLiu 1万+

图文教程本地部署开源扣子Coze Studio工作流并接入 Gemini 大模型(windows亲测) Coze Studio 本地部署、Gemini 模型接入、开源 AI 工具平台、大模型工作流搭建

本文介绍了在Windows系统本地部署开源AI工具平台Coze Studio并接入Google Gemini大模型的完整教程。主要内容包括:1) 环境准备要求(Docker等);2) 获取源码和配置Gemini模型(需API密钥);3) 通过Docker Compose部署服务;4) 浏览器访问验证。文章指出该平台适合私有化部署,支持智能体和工作流搭建,但也存在插件系统不完善等局限。最后提供了相关资源链接,为开发者实现本地AI解决方案提供了实用指南。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2782

用ATC转换你的第一个YOLOv5模型:从ONNX到昇腾OM的完整流程

YOLOv5作为当前最流行的目标检测模型之一,在昇腾AI处理器上部署能获得显著的推理加速。但这个过程需要将PyTorch训练的模型转换为昇腾专用的离线模型(.om文件)。性能提升:相比CPU/GPU,在昇腾芯片上有10倍以上的推理加速部署简化:.om文件可直接用于边缘设备(如Atlas 200DK)资源优化:支持INT8量化,大幅降低内存占用。

Kenji_Shinji的博客 1721

计算机视觉入门:从像素到理解的旅程

计算机视觉入门:从像素到理解的旅程,计算机视觉是人工智能领域的核心方向之一,旨在让计算机具备理解和解释视觉信息的能力。本文以系统化的知识框架,结合 Python 代码与经典案例,带您从像素级操作逐步掌握计算机视觉核心技术。涵盖图像处理、特征工程、传统机器学习到深度学习模型,助您构建从基础到进阶的完整能力体系。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

YOLOv5系列官方模型导出为.onnx文件

通过上述步骤,PyTorch 模型可转换为 ONNX 格式,并在支持 ONNX 的推理框架中部署。)可以通过官方 GitHub 仓库或直接点击下文链接下载。先切换到下载好的yolov5文件夹里,里边有export.py脚本文件。YOLOv5 的预训练权重文件(

2401_88048787的博客 3130

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Kafka安全认证实战:Kerberos+Java集成避坑指南(附完整配置脚本)
下一篇: Oracle安装报错别慌!手把手教你调整cvu_prereq.xml绕过PATH限制(Win10/11通用)
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值