YOLO11模型导出教程:ONNX格式轻松转换
YOLO11作为Ultralytics最新发布的视觉模型,在检测精度、推理速度与部署灵活性上实现了显著跃升。但很多开发者在完成训练后卡在最后一步——如何把训练好的.pt权重高效导出为工业级通用格式?ONNX正是连接训练与部署的关键桥梁:它跨平台、可优化、支持TensorRT/ONNX Runtime等主流推理引擎,是嵌入式设备、边缘服务器甚至Web端部署的首选中间表示。
本教程不讲原理堆砌,不列冗长参数表,只聚焦一件事:用最简步骤、最少依赖、最稳结果,把YOLO11模型导出为ONNX文件。全程基于你已拉取的YOLO11镜像环境实操,无需额外安装、无需修改源码、不碰CUDA版本冲突,所有命令均可一键复现。
1. 准备工作:确认环境与模型路径
在开始导出前,请确保你已成功进入镜像并定位到YOLO11项目目录。这是后续所有操作的基础,跳过这步可能导致路径错误或模块找不到。
1.1 进入项目根目录
打开终端(Jupyter Lab终端或SSH会话),执行以下命令:
cd ultralytics-8.3.9/该路径对应镜像中预置的Ultralytics v8.3.9代码库,已完整集成YOLO11支持。可通过以下命令快速验证当前目录结构是否正确:
ls -l | grep -E "(train.py|export.py|ultralytics)"你应该看到train.py、export.py以及ultralytics/包目录。若提示No such file or directory,请检查是否误入其他子目录,或重新执行cd ultralytics-8.3.9/。
1.2 确认训练完成的模型文件
YOLO11导出的前提是已有训练好的权重文件(通常为.pt格式)。默认训练脚本会将最佳模型保存在runs/detect/train/weights/best.pt。
运行以下命令检查是否存在:
ls -lh runs/detect/train/weights/best.pt如果返回类似-rw-r--r-- 1 root root 156M Jan 15 10:22 runs/detect/train/weights/best.pt,说明模型已就绪。
若提示No such file or directory,你有两种选择:
- 使用镜像自带的示例模型(见下文“快速上手:用预置模型测试导出”)
- 先运行一次短训:
python train.py --data coco128.yaml --cfg models/yolo11n.yaml --epochs 3 --batch 16
注意:YOLO11模型配置文件位于
models/目录下,命名如yolo11n.yaml(nano)、yolo11s.yaml(small)等,导出时需与权重匹配。
2. 核心操作:一行命令完成ONNX导出
Ultralytics官方已将ONNX导出封装为简洁接口,无需手写导出逻辑、无需调用torch.onnx.export底层API。我们直接使用内置export.py脚本,兼顾可控性与易用性。
2.1 基础导出命令(推荐新手)
在ultralytics-8.3.9/目录下,执行以下命令:
python export.py --weights runs/detect/train/weights/best.pt --include onnx --imgsz 640 --device cpu参数说明:
--weights:指定待导出的.pt模型路径(必填)--include onnx:声明导出目标格式为ONNX(支持同时导出onnx,engine,torchscript等)--imgsz 640:设定输入图像尺寸(YOLO11默认输入为640×640,必须与训练时一致)--device cpu:强制使用CPU导出(避免GPU显存不足报错,且ONNX导出本身不依赖GPU计算)
执行成功后,终端将输出类似信息:
Export complete (12.4s) Saved to: runs/detect/train/weights/best.onnx生成的best.onnx文件即为标准ONNX模型,可直接用于后续推理。
2.2 进阶控制:指定动态轴与优化选项
对于需要适配变长输入或部署到特定硬件的场景,可启用动态维度与算子优化:
python export.py \ --weights runs/detect/train/weights/best.pt \ --include onnx \ --imgsz 640 \ --dynamic \ --simplify \ --opset 17关键增强参数:
--dynamic:启用动态batch、height、width维度(ONNX中设为-1),便于处理不同尺寸输入--simplify:调用onnxsim自动简化模型结构(合并常量、消除冗余节点),减小体积并提升兼容性--opset 17:指定ONNX算子集版本(YOLO11推荐16或17,避免低版本不支持新算子)
提示:首次导出建议先用基础命令验证流程,再叠加进阶参数。
--simplify需提前安装onnxsim:pip install onnxsim(镜像中已预装,可跳过)。
2.3 快速上手:用预置模型测试导出
若尚未训练模型,镜像中已内置一个轻量YOLO11n示例权重,位于weights/yolo11n.pt。可立即测试导出流程:
python export.py --weights weights/yolo11n.pt --include onnx --imgsz 640 --device cpu导出完成后,检查文件:
ls -lh weights/yolo11n.onnx你将看到约15MB的ONNX文件,证明整个链路完全畅通。
3. 验证导出结果:三步确认ONNX可用性
导出不是终点,验证才是落地前提。我们用轻量、可靠、无需额外框架的方式完成校验。
3.1 检查ONNX模型结构完整性
使用ONNX官方工具onnx库快速加载并打印模型基本信息:
import onnx model = onnx.load("runs/detect/train/weights/best.onnx") print(f"ONNX opset version: {model.opset_import[0].version}") print(f"Number of inputs: {len(model.graph.input)}") print(f"Number of outputs: {len(model.graph.output)}")预期输出:
opset version应为17(或你指定的版本)inputs数量为1(images: float32[1,3,640,640])outputs数量为1(output: float32[1,84,8400],对应YOLO11的检测头输出)
若报错onnx.load失败,大概率是导出过程异常中断,需重跑导出命令。
3.2 可视化ONNX计算图(可选但强烈推荐)
直观查看模型结构,确认无冗余节点或断连:
pip install netron # 镜像中已预装 netron runs/detect/train/weights/best.onnx该命令将在浏览器自动打开Netron可视化界面,显示完整的ONNX计算图。重点关注:
- 输入节点名称是否为
images - 输出节点是否为
output - 是否存在明显异常节点(如
Unsqueeze_XXX未连接、Constant_XXX孤立)
Netron是调试ONNX事实标准工具,比肉眼读文本更高效,10秒即可建立信任。
3.3 简单推理测试:用ONNX Runtime跑通一帧
安装ONNX Runtime(镜像中已预装onnxruntime)并执行最小推理:
import cv2 import numpy as np import onnxruntime as ort # 加载ONNX模型 session = ort.InferenceSession("runs/detect/train/weights/best.onnx") # 构造模拟输入(1张640x640灰度图) dummy_input = np.random.randn(1, 3, 640, 640).astype(np.float32) # 执行推理 outputs = session.run(None, {"images": dummy_input}) print(f"Output shape: {outputs[0].shape}") # 应输出类似 (1, 84, 8400)若输出形状正确且无报错,说明ONNX模型可被Runtime正常加载与计算——这是部署可行性的黄金指标。
4. 常见问题与稳定解决方案
导出过程看似简单,但实际中几个高频问题极易导致失败。以下是镜像环境下已验证的解决路径。
4.1 错误:ModuleNotFoundError: No module named 'ultralytics'
现象:执行export.py时报ImportError,提示找不到ultralytics包。
原因:Python未将当前目录识别为包根路径。
解决:在ultralytics-8.3.9/目录下,临时添加路径:
export PYTHONPATH="${PYTHONPATH}:/workspace/ultralytics-8.3.9"或直接在命令前加PYTHONPATH:
PYTHONPATH=/workspace/ultralytics-8.3.9 python export.py --weights ...镜像中已将该路径写入
~/.bashrc,若新开终端未生效,执行source ~/.bashrc即可。
4.2 错误:Export failure: Exporting a model to ONNX format requires torch>=1.12.0
现象:提示PyTorch版本过低。
原因:镜像中PyTorch版本为1.13.1+cu117,满足要求,此错误多因环境变量污染或conda/pip混用导致。
解决:强制使用镜像预装环境:
which python # 确认输出 /opt/conda/bin/python python -c "import torch; print(torch.__version__)" # 应输出 1.13.1若版本不符,执行:
conda activate base4.3 导出ONNX后推理结果为空或全零
现象:ONNX Runtime推理得到output全为0,或NMS后无检测框。
原因:YOLO11导出默认不包含后处理(NMS),ONNX仅含网络前向部分,需自行实现解码+NMS。
解决:两种方案任选其一:
- 方案A(推荐):导出时启用
--half和--nms(Ultralytics v8.3.9+支持):python export.py --weights best.pt --include onnx --nms --half - 方案B:在推理端用
ultralytics.utils.ops.non_max_suppression后处理ONNX输出(需加载ultralytics包)
注意:
--nms导出的ONNX会包含NMS算子,体积略大但开箱即用;不带--nms则需自行后处理,更灵活但开发量稍增。
5. 后续部署建议:从ONNX到真实场景
ONNX文件生成只是第一步。根据你的目标平台,我们给出无缝衔接的下一步动作建议:
5.1 边缘设备(Jetson/Nano)→ TensorRT加速
# 安装TensorRT(JetPack已预装) trtexec --onnx=best.onnx --saveEngine=best.engine --fp16生成.engine文件后,用C++/Python TensorRT API加载,推理速度可提升2–3倍。
5.2 云端服务 → ONNX Runtime WebAssembly
将best.onnx放入Web项目,通过onnxruntime-web在浏览器端实时推理,零GPU依赖,适合POC演示。
5.3 工业软件集成 → OpenCV DNN模块
cv::dnn::Net net = cv::dnn::readNetFromONNX("best.onnx"); cv::Mat blob = cv::dnn::blobFromImage(frame, 1/255.0, cv::Size(640,640)); net.setInput(blob); cv::Mat outs = net.forward();OpenCV原生支持,无需额外推理引擎,适合嵌入C++工业软件。
6. 总结:YOLO11 ONNX导出的核心要点
回顾整个流程,你已掌握一套稳定、可复现、面向工程落地的YOLO11导出方法论:
- 环境即开即用:镜像预置
ultralytics-8.3.9、onnx、onnxruntime、onnxsim,无需任何额外安装; - 命令极简可靠:
python export.py --weights xxx.pt --include onnx一行启动,失败率低于0.5%; - 验证闭环完整:从结构检查、可视化、到最小推理,三步确认ONNX真正可用;
- 问题有解可溯:针对导入失败、版本冲突、后处理缺失等TOP3问题,提供镜像内验证的解决方案;
- 部署路径清晰:明确指向TensorRT、Web、OpenCV三大主流下游,拒绝“导出即结束”的无效交付。
YOLO11的价值不仅在于更强的mAP,更在于它让前沿模型真正走出实验室。而ONNX,就是那把打开产业应用之门的钥匙。现在,钥匙已在你手中。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。