跳转至内容

使用 Ultralytics YOLO 进行模型导出

Ultralytics YOLO 生态系统和集成

简介

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



观看: 如何将Ultralytics YOLO26以不同格式导出以进行部署 | ONNX, TensorRT, CoreML 🚀

为何选择YOLO26的导出模式?

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

导出模式的主要特性

以下是一些突出的功能:

  • 一键导出: 用于导出为不同格式的简单命令。
  • 批量导出: 导出支持批量推理的模型。
  • 优化推理: 导出的模型经过优化,可加快推理时间。
  • 教程视频: 深入的指南和教程,带来流畅的导出体验。

提示

  • 导出到 ONNXOpenVINO,CPU 速度提升高达 3 倍。
  • 导出到 TensorRT,GPU 速度提升高达 5 倍。

使用示例

将 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 export model=yolo26n.pt format=onnx      # export official model
yolo export model=path/to/best.pt format=onnx # export custom-trained model

参数

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

参数类型默认值描述
formatstr'torchscript'导出模型的目标格式,例如 'onnx', 'torchscript', 'engine' (TensorRT)等。每种格式都支持与不同的 部署环境.
imgszinttuple640模型输入所需的图像大小。可以是正方形图像的整数(例如, 640 对于 640x640)或元组 (height, width) 用于指定特定维度。
kerasboolFalse启用导出为 Keras 格式,用于 TensorFlow SavedModel,提供与 TensorFlow serving 和 API 的兼容性。
optimizeboolFalse导出到 TorchScript 时,应用针对移动设备的优化,可能会减小模型大小并提高 推理 性能。与 NCNN 格式或 CUDA 设备不兼容。
halfboolFalse启用FP16(半精度)量化,减小模型大小并可能加速在受支持硬件上的推理。与INT8量化或仅限CPU的导出不兼容。仅适用于某些格式,例如ONNX(见下文)。
int8boolFalse激活 INT8 量化,进一步压缩模型并加速推理,同时最大限度地减少精度损失,主要用于边缘设备。与 TensorRT 结合使用时,执行训练后量化 (PTQ)。
dynamicboolFalse允许TorchScript、ONNX、OpenVINO、TensorRT和CoreML导出支持动态输入尺寸,增强了处理不同图像尺寸的灵活性。自动设置为 True 当将TensorRT与INT8一起使用时。
simplifyboolTrue使用以下方式简化 ONNX 导出的模型图 onnxslim,从而可能提高性能以及与推理引擎的兼容性。
opsetintNone指定 ONNX opset 版本,以与不同的 ONNX 解析器和运行时兼容。如果未设置,则使用最新支持的版本。
workspacefloatNoneNone设置最大工作区大小,单位为GiB,用于 TensorRT 优化,平衡内存使用和性能。使用 None 用于 TensorRT 自动分配,最高可达设备最大值。
nmsboolFalse在支持的情况下,为导出的模型添加非极大值抑制 (NMS)(参见导出格式),从而提高检测后处理效率。不适用于端到端模型。
batchint1指定导出模型批量推理大小,或导出模型将并发处理的最大图像数量,单位为。 predict 模式。对于 Edge TPU 导出,此项会自动设置为 1。
devicestrNone指定导出设备:GPU (device=0),CPU(device=cpu),适用于 Apple 芯片的 MPS(device=mps),华为昇腾NPU (device=npudevice=npu:0),或用于 NVIDIA Jetson 的 DLA (device=dla:0device=dla:1)。TensorRT 导出自动使用 GPU。
datastr'coco8.yaml'路径指向 数据集 配置文件,对于 INT8 量化校准至关重要。如果未指定且 INT8 已启用, coco8.yaml 将用作校准的备用方案。
fractionfloat1.0指定用于 INT8 量化校准的数据集比例。允许在完整数据集的子集上进行校准,这对于实验或资源有限时非常有用。如果未在使用 INT8 启用时指定,则将使用完整数据集。
end2endboolNone覆盖支持无 NMS 推理的 YOLO 模型(YOLO26、YOLOv10)中的端到端模式。将其设置为 False 允许您导出这些模型,使其与传统的基于 NMS 的后处理管道兼容。

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

导出格式

可用的 YOLO26 导出格式如下表所示。您可以使用以下方式导出为任何格式 format 参数,即 format='onnx'format='engine'。您可以直接在导出模型上进行预测或验证,即 yolo predict model=yolo26n.onnx。导出完成后,将显示您的模型的使用示例。

格式format 参数模型元数据参数
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgsz, half, dynamic, optimize, nms, batch, device
ONNXonnxyolo26n.onnximgsz, half, dynamic, simplify, opset, nms, batch, device
OpenVINOopenvinoyolo26n_openvino_model/imgsz, half, dynamic, int8, nms, batch, data, fraction, device
TensorRTengineyolo26n.engineimgsz, half, dynamic, simplify, workspace, int8, nms, batch, data, fraction, device
CoreMLcoremlyolo26n.mlpackageimgsz, dynamic, half, int8, nms, batch, device
TF SavedModelsaved_modelyolo26n_saved_model/imgsz, keras, int8, nms, batch, device
TF GraphDefpbyolo26n.pbimgsz, batch, device
TF Litetfliteyolo26n.tfliteimgsz, half, int8, nms, batch, data, fraction, device
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgsz, device
TF.jstfjsyolo26n_web_model/imgsz, half, int8, nms, batch, device
PaddlePaddlepaddleyolo26n_paddle_model/imgsz, batch, device
MNNmnnyolo26n.mnnimgsz, batch, int8, half, device
NCNNncnnyolo26n_ncnn_model/imgsz, half, batch, device
IMX500imxyolo26n_imx_model/imgsz, int8, data, fraction, device
RKNNrknnyolo26n_rknn_model/imgsz, batch, name, device
ExecuTorchexecutorchyolo26n_executorch_model/imgsz, device
Axeleraaxelerayolo26n_axelera_model/imgsz, int8, data, fraction, device

常见问题

如何将YOLO26模型导出为ONNX格式?

使用 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")
yolo export model=yolo26n.pt format=onnx      # export official model
yolo export model=path/to/best.pt format=onnx # export custom-trained model

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

使用 TensorRT 导出模型有什么好处?

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

  • 多功能性: 针对特定硬件设置优化模型。
  • 速度: 通过高级优化实现更快的推理。
  • 兼容性: 与 NVIDIA 硬件平稳集成。

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

在导出YOLO26模型时,如何启用INT8量化?

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

示例

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # Load a model
model.export(format="engine", int8=True)
yolo export model=yolo26n.pt format=engine int8=True # export TensorRT model with INT8 quantization

INT8 量化可以应用于各种格式,例如 TensorRT, OpenVINOCoreML。为了获得最佳量化结果,请提供具有代表性的 数据集 使用 data 参数。

导出模型时,为什么动态输入尺寸很重要?

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

要启用此功能,请使用 dynamic=True 导出期间的标志:

示例

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)
yolo export model=yolo26n.pt format=onnx dynamic=True

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

优化模型性能需要考虑哪些关键的导出参数?

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

  • format: 导出模型的目标格式(例如, onnx, torchscript, tensorflow)。
  • imgsz: 模型输入的所需图像大小(例如, 640(height, width))。
  • half: 启用 FP16 量化,从而减小模型大小并可能加速推理。
  • optimize: 针对移动或受限环境应用特定优化。
  • int8: 启用 INT8 量化,对以下方面非常有益 边缘AI 部署。

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

导出的 YOLO 模型中的输出 tensor 代表什么?

当您将 YOLO 模型导出为 ONNX 或 TensorRT 等格式时,输出 tensor 的结构取决于模型任务。理解这些输出对于自定义推理实现至关重要。

关于 detect 模型 (例如, yolo26n.pt),输出通常是一个形状为 (batch_size, 4 + num_classes, num_predictions) 其中通道表示边界框坐标加上每个类别的分数,并且 num_predictions 取决于导出输入分辨率(并且可以是动态的)。

关于 segment 模型 (例如, yolo26n-seg.pt),您通常会得到两个输出:第一个 tensor 的形状为 (batch_size, 4 + num_classes + mask_dim, num_predictions) (边界框、类别分数和掩码系数),第二个 tensor 的形状为 (batch_size, mask_dim, proto_h, proto_w) 其中包含用于与系数结合生成实例掩码的掩码原型。尺寸取决于导出输入分辨率(并且可以是动态的)。

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

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

为什么 output0 FP32,当导出时 half=Trueend2end=True?

当导出时 half=True (或 int8=True),大多数 tensor 会转换为低精度以减小模型大小并提高性能。然而,当 end2end=True 启用时,后处理(包括类别索引)会直接嵌入到导出图中。

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

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

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



📅 创建于 2 年前 ✏️ 更新于 6 天前
glenn-jocherBurhan-QRizwanMunawarUltralyticsAssistantambitious-octopusKayzwerShreyas-S-809raimbekovmpderrengerY-T-Gjk4eMatthewNoyce

评论