Ultralytics YOLO27:

使用 Ultralytics YOLO 导出模型#

Ultralytics YOLO ecosystem and integrations

简介#

训练模型的最终目标是将其部署到实际应用中。Ultralytics YOLO26 中的导出模式提供了丰富的选项,可将训练好的模型导出为不同的格式,使其能够在各种平台和设备上部署。本综合指南旨在带你了解模型导出的细节,展示如何实现最大的兼容性和性能。

请查阅未发布的 YOLO27 预览版以了解计划中的导出支持。



Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀

为什么选择 YOLO26 的导出模式?#

  • 通用性: 可导出为多种格式,包括 ONNXTensorRTCoreML 等。
  • 性能: 使用 TensorRT 可获得高达 5 倍的 GPU 提速,使用 ONNX 或 OpenVINO 可获得高达 3 倍的 CPU 提速。
  • 兼容性: 让模型能够在众多硬件和软件环境中实现通用部署。
  • 易用性: 提供简单的 CLI 和 Python API,可快速直接地导出模型。

导出模式的核心功能#

以下是一些突出的功能:

  • 一键导出: 通过简单命令即可导出为不同格式。
  • 批量导出: 导出支持批量推理的模型。
  • 优化推理: 导出的模型经过优化,可缩短推理时间。
  • 教程视频: 提供深入的指南和教程,带来流畅的导出体验。
提示
  • 导出为 ONNXOpenVINO 可获得高达 3 倍的 CPU 提速。
  • 导出为 TensorRT 可获得高达 5 倍的 GPU 提速。

使用示例#

将 YOLO26n 模型导出为其他格式,例如 ONNX 或 TensorRT。有关导出参数的完整列表,请参阅下方的参数部分。

示例
from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load an official model
model = YOLO("path/to/best.pt")  # load a custom-trained model

# Export the model
model.export(format="onnx")

参数#

下表详细介绍了将 YOLO 模型导出为不同格式时可用的配置和选项。这些设置对于优化导出模型在各种平台和环境中的性能、大小和兼容性至关重要。正确的配置可确保模型以最佳效率准备好部署到预期的应用程序中。

参数类型默认值描述
formatstr'torchscript'导出模型的目标格式,例如 'onnx''torchscript''engine' (TensorRT) 或其他格式。每种格式都支持与不同部署环境的兼容性。
namestrNone需要硬件目标的格式所使用的硬件目标名称:Hailo 架构('hailo8''hailo8l''hailo10h''hailo15h''hailo15l';默认为 'hailo8l')、Rockchip RKNN 芯片(默认为 'rk3588')、华为 Ascend SoC(CANN --soc_version;默认为 'Ascend310B4')或 Qualcomm QNN HTP 目标(默认为 '73')。不同于其他模式使用的 project/name 运行命名组合。
imgszinttuple640模型输入所需的图像尺寸。可以使用整数表示正方形图像(例如,640 表示 640×640),也可以使用元组 (height, width) 指定具体尺寸。未传入该参数时,导出会复用加载的检查点中记录的训练尺寸:官方 YOLO26 检查点会为检测深度记录 768,为分类记录 224,为 OBB 记录 1024,为其他任务记录 640;而微调模型会记录其训练时使用的 imgsz。根据 YAML 构建的模型没有记录的训练尺寸,会使用 640
kerasboolFalse启用导出为 Keras 格式,以生成 TensorFlow SavedModel,并兼容 TensorFlow serving 和 API。
optimizeboolFalse为 DEEPX 启用更高级别的编译器优化,降低推理延迟,但会增加编译时间。
quantizeintstrNone量化精度:16(FP16,可减小模型大小并在支持的硬件上加快推理速度)或 8(INT8/PTQ,以极小的准确率损失进一步压缩模型,主要用于边缘设备;需要校准 data/fraction);32/未设置时为 FP32。使用 quantize=8 训练的检查点始终导出 INT8:onnxengine 无需校准即可从其携带的范围内导出,其他格式或精度将被拒绝。支持混合权重/激活精度的导出格式也接受 'w8a8'/'w16a16'/'w8a16'/'w8a32' 表示法。替代已废弃的 half/int8 标志(half=True16int8=True8,目前仍可接受但会发出废弃警告)。仅允许使用目标格式支持的精度(见下文)。
dynamicboolFalse允许 TorchScript、ONNX、OpenVINO、TensorRT 和 CoreML 导出使用动态输入尺寸,从而更灵活地处理不同的图像尺寸。
simplifyboolTrue对于会构建中间 ONNX 图的导出格式,使用 onnxslim 简化该图(参见导出格式),可能提升性能以及与推理引擎的兼容性。
opsetintNone指定会构建 ONNX 图的导出格式所使用的 ONNX opset 版本(参见导出格式),以兼容不同的 ONNX 解析器和运行时。未设置时,使用最新的受支持版本。
workspacefloatNoneNoneTensorRT 优化设置最大工作空间大小(单位为 GiB),在内存使用量与性能之间进行平衡。使用 None 可由 TensorRT 自动分配,最大不超过设备上限。
nmsbool,可选NoneNone 导出生的一对多预测以供外部 NMS 使用;True 在支持的地方嵌入 NMS;False 在可用时选择无 NMS 的头。CoreML 嵌入式 NMS 支持具有静态形状的检测、分割和姿态估计。详见端到端检测指南
conffloatNone在生成导出时 NMS 的所有场景中使用的置信度阈值:nms=True 导出;Hailo 的非端到端检测导出;以及 IMX 的检测、姿态和分割导出,它们会在内部强制使用 nms=True。未设置时默认为 0.25
ioufloat0.7在生成导出时 NMS 的所有场景中使用的 IoU 阈值:nms=True 导出;Hailo 的非端到端检测导出;以及 IMX 的检测、姿态和分割导出,它们会在内部强制使用 nms=True
max_detint300导出模型输出中保留的最大检测数量。适用于所有格式的 nms=True 导出(CoreML 检测除外,其原生 NMS 流水线没有检测上限),以及无 NMS 的端到端检测导出(YOLO26、YOLOv10,上限为可用锚点数量)和 IMX 的检测、姿态估计与分割导出。
agnostic_nmsboolFalse只要通过标准 nms=True 流程生成导出时 NMS,就启用类别无关的 NMS,包括 CoreML 自身的 NMS 阶段,抑制不同类别之间分数较低的重叠框,而不仅仅是同一类别内的重叠框。Hailo 或 IMX 自身生成的 NMS 配置不支持此选项,因此无论此标志如何设置,它们始终使用类别相关的 NMS。该选项也会内置到无 NMS 的端到端导出中(YOLO26、YOLOv10),此时仅防止同一检测结果出现在多个类别标签下(IoU=1.0 的重复项),不会对不同框执行基于 IoU 阈值的抑制。
batchint1指定导出模型的批次推理大小,或导出模型在 predict 模式下可并发处理的最大图像数量。对于 Edge TPU 导出,此值会自动设置为 1。
devicestrNone指定导出设备:GPU(device=0)、CPU(device=cpu)、Apple silicon 上的 MPS(device=mps)、华为 Ascend NPU(device=npudevice=npu:0)或 NVIDIA Jetson 上的 DLA(device=dla:0device=dla:1)。TensorRT 导出会自动使用 GPU,但 TensorRT 11.0 不支持 DLA。
verboseboolFalseformat='engine' 导出期间,将 TensorRT 构建器日志级别提升为 VERBOSE。其他导出格式会忽略该参数。
datastrNone数据集 YAML 的路径,对于 INT8 量化校准至关重要;分类任务则改为使用数据集目录或内置数据集名称。如果在启用 INT8 的情况下未指定,Ultralytics 会在需要时选择特定于任务的校准数据集,或者回退到模型任务的默认数据集。使用 quantize=8 训练的检查点带有自己的 INT8 范围,不需要校准数据。
splitstr'val'数据集划分('train''val''test'),用于从 data 构建 INT8 量化校准数据加载器。
fractionfloatintlist1.0用于 INT8 校准的数据集子集:可以是比例、图像数量或 [train, val, test] 值。1 表示完整划分;大于 1 的整数表示图像数量;只有可选的测试项接受 0/0.0 来表示无数据。包含两个元素的列表会保留 test 的完整内容。

调整这些参数可以自定义导出过程以满足特定要求,例如部署环境、硬件限制和性能目标。选择适当的格式和设置对于在模型大小、速度和准确率之间实现最佳平衡至关重要。

导出格式#

可用的 YOLO26 导出格式如下表所示。你可以使用 format 参数导出到任何格式,即 format='onnx'format='engine'。你可以直接对导出的模型进行预测或验证,即 yolo predict model=yolo26n.onnx。模型导出完成后,会显示你的模型的使用示例。模型也可以直接在 Ultralytics 平台的浏览器中导出,无需任何本地设置。

格式format 参数模型元数据参数
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgszquantizedynamicnmsbatchdevice
ONNXonnxyolo26n.onnximgszquantizedynamicsimplifyopsetnmsbatchdatafractiondevice
OpenVINOopenvinoyolo26n_openvino_model/imgszquantizedynamicnmsbatchdatafractiondevice
TensorRTengineyolo26n.engineimgszquantizedynamicsimplifyopsetworkspacenmsbatchdatafractiondevice
CoreMLcoremlyolo26n.mlpackageimgszdynamicquantizenmsbatchdevice
TF SavedModelsaved_modelyolo26n_saved_model/imgszkerasquantizeopsetnmsbatchdatafractiondevice
TF GraphDefpbyolo26n.pbimgszopsetbatchdevice
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgszquantizeopsetdatafractiondevice
PaddlePaddlepaddleyolo26n_paddle_model/imgszbatchdevice
MNNmnnyolo26n.mnnimgszbatchdynamicquantizesimplifyopsetnmsdevice
NCNNncnnyolo26n_ncnn_model/imgszquantizebatchdevice
IMX500imxyolo26n_imx_model/imgszquantizedatafractionnmsdevice
RKNNrknnyolo26n_rknn_model/imgszbatchnamequantizesimplifyopsetdatafractiondevice
ExecuTorchexecutorchyolo26n_executorch_model/imgszbatchdevice
Axeleraaxelerayolo26n_axelera_model/imgszbatchquantizedatafractiondevice
DEEPXdeepxyolo26n_deepx_model/imgszquantizesimplifyopsetdataoptimizedevice
Qualcomm QNNqnnyolo26n_qnn.onnximgszbatchnamequantizesimplifyopsetdatafractiondevice
LiteRTlitertyolo26n.tfliteimgszquantizebatchdatafractiondevice
Hailohailoyolo26n_hailo_model/imgsznamequantizedatafractionsimplifyconfiou
Huawei Ascendascendyolo26n_ascend_model/imgszbatchnamequantizeopsetsimplifynms
Apple Core AIcoreaiyolo26n.aimodelimgszbatchquantize

nms=None 默认对外部 NMS 使用原始输出。设置 nms=False 以选择可用的无 NMS 检测头;不支持的格式将回退到其本机输出路径。上面的 nms 条目标识了可以通过 nms=True 嵌入 NMS 的格式。

自动安装导出依赖项

大多数格式需要未随 ultralytics 一起安装的软件包。当缺少某个软件包时,导出会在运行时通过 uvpip 安装它,在 Linux 上则通过 apt 安装系统软件包,例如 Edge TPU 编译器或用于 IMX 的 Java。若要保持环境固定(例如在容器镜像、CI 作业或生产服务中),请设置 YOLO_AUTOINSTALL=False。随后,导出仍会检查缺少的软件包并报告它们,但会保持环境不变并在这些软件包安装完成之前失败。

export YOLO_AUTOINSTALL=False

量化选项#

使用 quantize 参数来请求导出精度。字符串值不区分大小写,Ultralytics 在导出前会规范化接受的别名:

请求值规范值含义
8"8""int8""w8a8"8INT8 权重和激活值
16"16""fp16""w16a16"16FP16 权重和激活值
32"32""fp32""w32a32"32FP32 导出;与未设置相同,但 CoreML NMS ML 程序默认使用 FP16
"w8a16""w8a16"带 16 位激活值的 INT8 权重(FP16;在 LiteRT 上为 INT16)
"w8a32""w8a32"带 FP32 激活值的 INT8 权重(LiteRT 动态 INT8,无需校准)

旧版 half=Trueint8=True 标志仍然被接受,但会带有弃用警告,并会转发给 quantize=16quantize=8

并非每个导出格式都支持所有精度。明确的 quantize 请求要么生成该精度,要么在导出前失败:

格式FP32(32 / 未设置)FP16(16INT8(8W8A16("w8a16"备注
PyTorch不适用不适用不适用原生训练/检查点格式。
TorchScript✅ 仅限 GPUFP16 TorchScript 导出需要 device=0;CPU 导出为 FP32。
ONNXINT8 使用 ONNX Runtime 静态量化和校准数据。
OpenVINOINT8 使用 NNCF 训练后量化。
TensorRTINT8 需要代表性校准数据。
CoreML✅¹CoreML INT8 是权重量化;W8A16 使用带 FP16 激活值的 INT8 权重。¹未设置的 NMS ML 程序默认使用 FP16。
TF SavedModelINT8 导出使用 TensorFlow 校准。
TF GraphDef无导出时精度转换。
Edge TPU✅ 自动Edge TPU 需要 INT8;未设置时会自动启用。
PaddlePaddle无导出时精度转换。
MNNINT8 是通过 MNN 转换进行的权重量化。
NCNN移动端/嵌入式运行时格式。
IMX500✅ 自动IMX500 需要量化;未设置时会自动启用 INT8。
RKNN✅ 依赖芯片RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126B 支持 FP16 或 INT8;RV1103/RV1106 变体仅支持 INT8。
ExecuTorch无导出时精度转换。
Axelera✅ 自动Axelera 导出需要 INT8;未设置时会自动启用。
DEEPX✅ 自动DEEPX 导出需要 INT8;未设置时会自动启用。
Qualcomm QNN✅ 自动QNN HTP 导出固定为带 16 位激活值的 INT8 权重。
LiteRT静态 INT8(8)和 "w8a16"(int8 权重 + int16 激活值)使用校准数据;还支持 "w8a32" 动态 INT8(无需校准)。quantize=16 不是一个单独的导出;FP32 模型在运行时通过 GPU 代理以 FP16 运行。
Hailo✅ 自动Hailo 导出需要 INT8;未设置时会自动启用。
华为昇腾✅ 自动昇腾 AI 核心卷积仅接受 FP16/INT8 输入,因此 ATC 编译 FP16;未设置时会自动启用。
Core AI默认情况下为 FP32 或带有 quantize=16 的 FP16 .aimodel 资产;没有 INT8 路径。

对于 INT8 和 W8A16 导出,请使用 data 提供代表性校准数据(例如 data="coco8.yaml"),除非目标集成文档规定了默认或自动启用的行为。LiteRT "w8a32"(动态 INT8)方案不需要校准数据。

量化感知训练#

上面的 INT8 导出属于训练后量化(PTQ):通过对 data 进行单次校准遍历来观察取值范围。相比之下,量化感知训练(QAT)通过在循环中使用伪量化进行微调,来学习能够容忍 INT8 的权重,从而恢复仅靠校准所丢失的准确率。传入 quantize=8train 来微调预训练检查点,然后像往常一样进行导出:

示例
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(
    data="coco.yaml",
    quantize=8,
    epochs=5,
    batch=64,
    optimizer="AdamW",
    lr0=0.00001,
    lrf=0.1,
    warmup_epochs=0.5,
    cos_lr=True,
    mosaic=0.0,
)
model.export(format="engine", quantize=8)  # ranges travel with the checkpoint, no calibration data needed

微调预训练检查点时使用较小的学习率。量化感知训练最初可能会降低精度,它相对于训练后量化的优势取决于模型、数据集和训练预算。根据原始检查点和训练后量化导出验证导出的模型;训练期间的伪量化得分不能确立部署精度。

QAT 的实际价值取决于导出后端自身的校准处理该模型的表现。以下数值是在 imgsz=640 和批次大小为 1 的条件下、使用 TensorRT 10.16 引擎在 COCO val2017 上测得的 mAP50-95,其中每个 QAT 检查点均使用 epochs=20 patience=3 进行训练:

模型FP32 引擎PTQ INT8 引擎QAT INT8 引擎
yolo26n0.40320.39340.3935
yolo26s0.47940.44120.4711
yolo26m0.52690.46960.5137
yolo26l0.54400.48890.5307
yolo26x0.57010.51380.5527

在整个范围内,QAT 相比 FP32 损失了 0.008 到 0.017 的 mAP50-95,而训练后量化在 yolo26n 上损失了 0.010,在较大模型上损失了 0.038 到 0.057。因此,QAT 在校准本来就已经表现很好的最小模型上几乎没有带来提升,但在其余模型上带来了 0.030 到 0.044 的提升。在不同的数据集、导出格式或 TensorRT 版本上,你可能会得到不同的数据,请自行进行测量。

量化感知训练模型需要 compile=False;ModelOpt 的量化模块不支持 torch.compile

头部模型的最终输出卷积特意保留在 float 类型以限制 INT8 精度损失;TensorRT 为其未量化层启用了 FP16 混合精度。QAT 通过 NVIDIA TensorRT Model Optimizer 运行,该工具在首次使用时会自动安装,加载生成的检查点时也需要安装它。这些范围会随检查点一同保存,并且 onnxengine 导出会将它们输出为 Q/DQ 节点;其他格式则会读取校准数据并拒绝 QAT 检查点。

接下来做什么#

查找部署目标的集成指南 — ONNXTensorRTCoreML 等内容位于完整集成列表中 — 了解如何运行导出的模型。

常见问题#

  • 使用 Ultralytics 将 YOLO26 模型导出为 ONNX 格式非常简单。它同时提供了用于导出模型的 Python 和 CLI 方法。

    示例
    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo26n.pt")  # load an official model
    model = YOLO("path/to/best.pt")  # load a custom-trained model
    
    # Export the model
    model.export(format="onnx")

    有关该过程的更多详细信息(包括处理不同输入大小等高级选项),请参阅 ONNX 集成指南

  • 使用 TensorRT 进行模型导出可带来显着的性能提升。导出到 TensorRT 的 YOLO26 模型可以实现高达 5 倍的 GPU 提速,使其成为实时推理应用的理想选择。

    • 通用性: 为特定的硬件设置优化模型。
    • 速度: 通过高级优化实现更快的推理。
    • 兼容性: 与 NVIDIA 硬件顺利集成。

    要了解有关集成 TensorRT 的更多信息,请参阅 TensorRT 集成指南

  • INT8 量化是压缩模型和加速推理(尤其是在边缘设备上)的绝佳方法。以下是如何启用 INT8 量化的方法:

    示例
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")  # Load a model
    model.export(format="onnx", quantize=8, data="coco8.yaml")

    INT8 量化可应用于诸如 ONNXTensorRTOpenVINOCoreMLRockchip RKNN 等格式。为了获得最佳量化结果,请使用 data 参数提供代表性数据集。有关接受的 quantize 值和支持的格式,请参阅量化选项

  • 动态输入大小允许导出的模型处理不同的图像尺寸,从而针对不同的用例提供灵活性并优化处理效率。导出到 ONNXTensorRT 等格式时,启用动态输入大小可确保模型能够无缝适应不同的输入形状。

    要启用此功能,请在导出过程中使用 dynamic=True 标志:

    示例
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="onnx", dynamic=True)

    动态输入大小调整对于输入尺寸可能变化的应用程序特别有用,例如视频处理或处理来自不同来源的图像。

  • 理解和配置导出参数对于优化模型性能至关重要:

    • format: 导出模型的目标格式(例如 onnxtorchscriptsaved_model)。
    • imgsz: 模型输入的期望图像大小(例如 640(height, width))。
    • quantize: 量化精度,例如 8/"int8"16/"fp16"32/"fp32",或者在受支持格式上的混合权重/激活方案 "w8a16""w8a32"(LiteRT 动态 INT8)。请参阅量化选项
    • optimize: 为 DEEPX 导出启用更高的编译器优化。

    要在特定的硬件平台上部署,请考虑使用专门的导出格式,例如用于 NVIDIA GPU 的 TensorRT、用于 Apple 设备的 CoreML 或用于 Google Coral 设备的 Edge TPU

  • 当你将 YOLO 模型导出为 ONNX 或 TensorRT 等格式时,输出张量结构取决于模型任务。理解这些输出对于自定义推理实现非常重要。

    对于使用 nms=False 导出的 YOLO26 检测模型(例如 yolo26n.pt),支持的格式会产生形状类似 (batch_size, max_detections, 6) 且带有 [x1, y1, x2, y2, confidence, class_id] 值的无 NMS 输出。在使用默认的 max_det=300 时,这通常是 (batch_size, 300, 6)。当不支持端到端算子时,某些受限的格式会自动回退到传统的输出布局。

    默认情况下(nms=None),包括 YOLO26 在内的检测模型会导出原始的一对多预测结果:输出通常是一个形状为 (batch_size, 4 + num_classes, num_predictions) 的单个张量,其中通道代表边界框坐标外加每个类别的得分,并且 num_predictions 取决于导出输入分辨率(并且可以是动态的)。End-to-End Detection guide 涵盖了哪些格式会保留端到端输出。

    对于分割模型(例如 yolo26n-seg.pt),你通常会得到两个输出:形状类似于 (batch_size, 4 + num_classes + mask_dim, num_predictions) 的第一个张量(包含边界框、类得分和掩码系数),以及形状类似于 (batch_size, mask_dim, proto_h, proto_w) 的第二个张量,其中包含与系数一起用于生成实例掩码的掩码原型。大小取决于导出输入分辨率(并且可以是动态的)。

    对于姿态模型(例如 yolo26n-pose.pt),输出张量的形状通常类似于 (batch_size, 4 + num_classes + keypoint_dims, num_predictions),其中 keypoint_dims 取决于姿态规范(例如关键点数量以及是否包含置信度),而 num_predictions 取决于导出输入分辨率(并且可以是动态的)。

    ONNX 推理示例中的示例演示了如何为每种模型类型处理这些输出。

  • Ultralytics 目前不提供用于 YOLO 模型的专用 C++ 推理 API。对于 C++ 部署,请将模型导出为运行时格式,例如 ONNXTensorRTTorchScriptMNN,然后使用该运行时的原生 C++ API 加载导出的工件。

    例如,使用 yolo export model=yolo26n.pt format=onnx 导出检测模型并用 ONNX Runtime C++ 运行 .onnx 文件,或者使用 format=engine 导出并从 TensorRT C++ 应用程序运行 TensorRT 引擎。当你使用自定义的 C++ 后处理时,请匹配针对你的任务和导出设置的输出张量布局;默认的 YOLO26 检测导出返回的是需要外部 NMS 的原始预测张量。使用 nms=False 导出可获得形状为 (batch, max_det, 6) 的无 NMS 检测结果,或者使用 nms=True 在支持的格式中嵌入 NMS。

  • 当使用 quantize=16(FP16)或 quantize=8(INT8)导出时,大多数张量都会转换为较低精度,以减小模型大小并提高性能。但是,当启用 nms=False 时,后处理(包括类索引)会直接嵌入到导出的图中。

    output0 张量包含类索引,这些索引在内部表示为浮点值。由于其有限的尾数精度,FP16 无法可靠地表示大于 2048 的整数值。为避免潜在的精度损失或不正确的类 ID,output0 被故意保持为 FP32。

    此行为是预期的,并且也适用于必须保留类索引保真度的低精度或量化导出。

    如果需要完整的 FP16 输出,请使用 nms=None 进行导出并在外部执行后处理。

评论