2026/4/6 5:59:54
网站建设
项目流程
网站后端开发,网站推广软件工具,代发软文,分类信息发布 wordpressYOLO26如何导出模型#xff1f;ONNX转换部署实战教程
YOLO26作为Ultralytics最新发布的高性能目标检测与姿态估计统一架构#xff0c;凭借其轻量化设计、多任务协同能力和开箱即用的工程友好性#xff0c;正快速成为工业落地新选择。但很多用户在完成训练后卡在关键一步ONNX转换部署实战教程YOLO26作为Ultralytics最新发布的高性能目标检测与姿态估计统一架构凭借其轻量化设计、多任务协同能力和开箱即用的工程友好性正快速成为工业落地新选择。但很多用户在完成训练后卡在关键一步怎么把训练好的.pt模型转成ONNX再部署到边缘设备或推理引擎上本文不讲理论、不堆参数只聚焦一个动作——手把手带你从YOLO26训练镜像出发完成模型导出、格式验证、推理测试全流程所有命令可直接复制粘贴运行连路径都帮你写好了。1. 为什么必须导出ONNX不是直接用.pt就行吗先说结论.pt是PyTorch训练专用格式不能直接部署ONNX才是跨平台推理的“通用语言”。你可能已经用model.predict()跑通了推理但那只是在GPU服务器上“玩得转”。一旦要部署到Jetson、RK3588、树莓派或者集成进C/Java生产系统甚至上云做API服务就必须把模型变成ONNX——它不依赖Python环境能被TensorRT、ONNX Runtime、OpenVINO等主流推理引擎直接加载。更重要的是YOLO26的官方代码ultralytics v8.4.2对ONNX导出做了深度适配支持动态batch、动态输入尺寸、带NMS后处理的端到端导出。这意味着你导出的ONNX文件不用自己写NMS逻辑推理时直接输出框坐标类别置信度省去90%的后处理开发工作。所以导出不是可选项而是工程落地的必经关卡。2. 准备工作确认环境与模型路径本教程基于你已启动的「YOLO26官方训练与推理镜像」我们跳过环境安装直奔核心。请按顺序执行以下三步确保基础就绪2.1 激活专属环境并进入工作目录conda activate yolo cd /root/workspace/ultralytics-8.4.2验证执行python -c import torch; print(torch.__version__)应输出1.10.0执行which python应指向/root/miniconda3/envs/yolo/bin/python。2.2 确认待导出模型位置镜像中已预置多个权重文件路径统一为yolo26n.pt—— 检测主干YOLOv8n级轻量yolo26n-pose.pt—— 检测姿态估计双任务yolo26s.pt—— 中等规模检测模型你也可以用自己训练好的模型比如runs/train/exp/weights/best.pt。只要路径正确导出流程完全一致。2.3 安装ONNX相关依赖镜像已预装仅需验证pip list | grep -i onnx应看到onnx,onnxruntime,onnx-simplifier三个包。若缺失执行pip install onnx onnxruntime onnx-simplifier3. 核心操作一行命令导出ONNX模型Ultralytics官方提供了极简导出接口无需修改源码、无需手写导出脚本。只需一条命令3.1 基础导出命令推荐新手yolo export modelyolo26n.pt formatonnx imgsz640 dynamicTrue opset17model指定输入模型路径支持.pt或.yamlformatonnx明确导出目标格式imgsz640设定默认输入分辨率YOLO26支持动态尺寸此处为基准值dynamicTrue关键开启动态轴让batch、height、width均可变适配不同场景opset17ONNX算子集版本兼容TensorRT 8.6和ONNX Runtime 1.15执行后终端会显示类似Export complete (12.4s) Saved as: /root/workspace/ultralytics-8.4.2/yolo26n.onnx导出文件将生成在当前目录同名.onnx后缀。3.2 进阶导出带姿态估计的端到端模型如果你用的是yolo26n-pose.pt导出命令完全一样但输出模型会自动包含姿态关键点分支yolo export modelyolo26n-pose.pt formatonnx imgsz640 dynamicTrue opset17导出后的ONNX模型输出节点包含output0检测结果[batch, num_boxes, 5nc]含xywhconfclsoutput1姿态关键点[batch, num_boxes, 17, 3]含x,y,conf提示17是COCO关键点数量如需自定义需在模型配置中修改kpt_shape参数。3.3 自定义导出控制输入输出行为某些场景需要更精细控制例如固定batch为1嵌入式设备常用指定输入名称便于后续绑定禁用自动NMS自己实现后处理使用Python脚本方式导出更灵活# export_onnx.py from ultralytics import YOLO if __name__ __main__: # 加载模型不加载权重仅结构 model YOLO(yolo26n.yaml) # 或 yolo26n.pt # 导出ONNX传入完整参数 model.export( formatonnx, imgsz640, dynamicTrue, opset17, simplifyTrue, # 自动优化图结构推荐 batch1, # 强制固定batch1 devicecpu, # CPU导出更稳定 halfFalse, # 不启用FP16ONNX暂不支持FP16输入 nmsTrue, # 保留NMS后处理默认True verboseTrue )运行python export_onnx.py4. 验证导出结果三步确认ONNX可用性导出成功≠能用。必须验证模型结构、输入输出、推理逻辑是否符合预期。4.1 查看模型基本信息安装ONNX可视化工具pip install netron然后在终端启动netron yolo26n.onnx浏览器会自动打开Netron界面你能清晰看到输入节点imagesshape: [1,3,640,640]dtype: float32输出节点output0检测、output1姿态若存在所有算子类型Conv, Resize, NonMaxSuppression等正常状态无红色报错NMS节点存在输入尺寸与你设置一致。4.2 用ONNX Runtime做最小化推理测试创建test_onnx.py验证前向推理是否正常import cv2 import numpy as np import onnxruntime as ort # 加载ONNX模型 session ort.InferenceSession(yolo26n.onnx, providers[CUDAExecutionProvider]) # 构造模拟输入BGR格式归一化到[0,1] img cv2.imread(./ultralytics/assets/zidane.jpg) img cv2.resize(img, (640, 640)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1)) # HWC → CHW img np.expand_dims(img, 0) # 添加batch维度 # 推理 outputs session.run(None, {images: img}) print(f检测输出形状: {outputs[0].shape}) print(f前2个框的坐标: {outputs[0][0, :2, :4]})运行后应输出类似检测输出形状: (1, 8400, 84) 前2个框的坐标: [[0.421 0.512 0.123 0.098] [0.634 0.287 0.087 0.112]]成功标志无报错、输出形状符合预期YOLO26默认8400个anchor、数值在合理范围。4.3 对比PyTorch与ONNX输出一致性最关键的验证ONNX结果是否和原生PyTorch一致# 对比脚本 compare_outputs.py import torch from ultralytics import YOLO import onnxruntime as ort import numpy as np # PyTorch推理 model_pt YOLO(yolo26n.pt) results_pt model_pt(./ultralytics/assets/zidane.jpg, verboseFalse) boxes_pt results_pt[0].boxes.xyxy.cpu().numpy() # [x1,y1,x2,y2] # ONNX推理同上 session ort.InferenceSession(yolo26n.onnx) # ...输入预处理同上 outputs_onnx session.run(None, {images: img}) # 解析ONNX输出需自行实现NMS或用onnxruntime自带后处理 # 粗略对比取前5个框的中心点距离误差 # 实际项目中建议用IoU或mAP评估注意ONNX Runtime默认不包含NMSYOLO26导出时若设nmsTrue则NMS已固化在图中输出即最终框若设nmsFalse需自己调用cv2.dnn.NMSBoxes。5. 部署实战ONNX模型在不同平台的加载方式导出只是第一步部署才是价值所在。以下是三种最常见场景的接入方式代码精简可直接复用。5.1 Python服务化部署Flask API# api_server.py from flask import Flask, request, jsonify import onnxruntime as ort import numpy as np import cv2 app Flask(__name__) session ort.InferenceSession(yolo26n.onnx) app.route(/detect, methods[POST]) def detect(): file request.files[image] img cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR) # 预处理同上 img cv2.resize(img, (640, 640)) / 255.0 img np.transpose(img, (2,0,1))[None] # 推理 outputs session.run(None, {images: img.astype(np.float32)}) boxes outputs[0][0] # [N, 5nc] # 返回JSON return jsonify({ boxes: boxes[:, :4].tolist(), scores: boxes[:, 4].tolist(), classes: boxes[:, 5:].argmax(1).tolist() }) if __name__ __main__: app.run(host0.0.0.0, port5000)启动python api_server.py用Postman发送图片即可获得JSON结果。5.2 C部署ONNX Runtime OpenCV// detect.cpp #include onnxruntime_cxx_api.h #include opencv2/opencv.hpp #include vector int main() { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, YOLO26); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED); Ort::Session session(env, Lyolo26n.onnx, session_options); // 读图、预处理OpenCV cv::Mat img cv::imread(zidane.jpg); cv::resize(img, img, cv::Size(640, 640)); img.convertScaleAbs(img, img, 1.0/255.0); std::vectorfloat input_data(3*640*640); // ...HWC→CHW转换 // 推理 Ort::Value input_tensor Ort::Value::CreateTensorfloat( memory_info, input_data.data(), input_data.size(), input_shape, 4); auto output_tensors session.Run(Ort::RunOptions{nullptr}, input_name, input_tensor, 1, output_name, 1); }编译命令Linuxg -stdc17 detect.cpp -I/usr/include/onnxruntime -L/usr/lib -lonnxruntime -lopencv_core -lopencv_imgproc -lopencv_highgui -o detect5.3 边缘设备部署Jetson Nano在Jetson上优先使用TensorRT加速# 安装TensorRTJetPack自带 # 将ONNX转为TRT引擎 trtexec --onnxyolo26n.onnx \ --saveEngineyolo26n.trt \ --fp16 \ --workspace2048 \ --minShapesimages:1x3x640x640 \ --optShapesimages:4x3x640x640 \ --maxShapesimages:8x3x640x640之后用Python加载TRT引擎推理速度可达ONNX的3倍以上。6. 常见问题与避坑指南导出过程看似简单但新手常踩以下五个坑这里一次性说清6.1 “导出失败Unsupported operator ‘Softmax’”怎么办这是ONNX Opset版本不匹配。YOLO26部分算子在低版本Opset中未定义。解决方案强制指定opset17或更高如opset18并确保onnx库版本≥1.14pip install --upgrade onnx onnxruntime6.2 “ONNX Runtime推理结果全是0”大概率是输入预处理不一致。PyTorch模型默认输入为RGB且均值方差归一化如ImageNet而YOLO26官方导出要求纯线性归一化/255.0且BGR顺序。务必检查cv2.imread()读取的是BGR不要cv2.cvtColor不要减均值、除方差YOLO26导出模型已内置6.3 “导出ONNX后体积暴涨2倍”这是dynamicTrue导致的。动态轴会增加图复杂度。如确定部署环境输入尺寸固定可关闭yolo export modelyolo26n.pt formatonnx imgsz640 dynamicFalse6.4 “如何导出不带NMS的模型自己写后处理”在导出命令中添加nmsFalseyolo export modelyolo26n.pt formatonnx nmsFalse此时输出为原始logits[1, 8400, 84]需自行实现torch.nn.functional.softmax()分类torchvision.ops.nms()去重6.5 “导出的ONNX在OpenVINO中报错”OpenVINO对ONNX支持有限。推荐先用onnx-simplifier优化python -m onnxsim yolo26n.onnx yolo26n_sim.onnx再导入OpenVINO Model Optimizer。7. 总结从导出到部署你真正需要掌握的三件事回顾整个流程YOLO26的ONNX导出不是黑盒操作而是有清晰路径的工程动作。你只需牢牢记住这三点就能应对90%的部署需求7.1 记住一个命令解决80%场景yolo export modelyolo26n.pt formatonnx imgsz640 dynamicTrue opset17这是最安全、最通用的导出命令覆盖检测、姿态、分割等所有YOLO26变体。7.2 验证必须做三件事① 用Netron看图结构确认NMS存在、输入尺寸正确② 用ONNX Runtime跑通前向确认无崩溃、输出形状合理③ 与PyTorch结果粗略比对中心点误差5像素即合格7.3 部署选型看场景快速验证/小流量API → ONNX Runtime Python高性能C服务 → ONNX Runtime C API边缘设备Jetson/RK→ TensorRT加速Intel CPU集群 → OpenVINO IR模型导出不是终点而是你掌控模型的第一步。当ONNX文件生成的那一刻你就从“模型使用者”变成了“模型掌控者”——它可以跑在任何地方被任何语言调用融入任何系统。这才是YOLO26真正释放生产力的方式。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。