Link to this section使用 Ultralytics YOLO 进行模型导出#
Link to this section简介#
训练模型的最终目标是将其部署到现实世界的应用程序中。Ultralytics YOLO26 中的导出模式提供了一系列通用的选项,用于将训练好的模型导出为不同格式,使其能够部署在各种平台和设备上。本综合指南旨在带你了解模型导出的细节,展示如何实现最大的兼容性和性能。
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
Link to this section为什么要选择 YOLO26 的导出模式?#
- 多功能性: 支持导出为多种格式,包括 ONNX、TensorRT、CoreML 等。
- 性能: 使用 TensorRT 可获得高达 5 倍的 GPU 加速,使用 ONNX 或 OpenVINO 可获得 3 倍的 CPU 加速。
- 兼容性: 使你的模型能够在众多的硬件和软件环境中实现通用部署。
- 易用性: 提供简单的 CLI 和 Python API,实现快速直接的模型导出。
Link to this section导出模式的主要功能#
以下是一些出色的功能:
- 一键导出: 用于导出为不同格式的简单命令。
- 批量导出: 导出支持批量推理的模型。
- 优化推理: 导出的模型针对更快的推理时间进行了优化。
- 教程视频: 提供深入的指南和教程,带来顺畅的导出体验。
Link to this section使用示例#
将 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")Link to this section参数#
此表格详细说明了将 YOLO 模型导出为不同格式时可用的配置和选项。这些设置对于优化导出模型的性能、大小以及在各种平台和环境下的兼容性至关重要。正确的配置可确保模型能够以最佳效率准备好在预期的应用程序中进行部署。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
format | str | 'torchscript' | 导出模型的目标格式,例如 'onnx'、'torchscript'、'engine' (TensorRT) 或其他。每种格式都能与不同的 部署环境 兼容。 |
imgsz | int 或 tuple | 640 | 模型输入所需的图像大小。可以是代表正方形图像的整数(例如 640 代表 640×640),或者是用于指定特定尺寸的元组 (height, width)。 |
keras | bool | False | 启用导出为 TensorFlow SavedModel 的 Keras 格式,从而提供与 TensorFlow 服务和 API 的兼容性。 |
optimize | bool | False | 导出为 TorchScript 时应用针对移动设备的优化,可减小模型大小并提升 推理 性能。与 NCNN 格式或 CUDA 设备不兼容。对于 DEEPX,启用更高级的编译器优化以降低推理延迟并增加编译时间。 |
half | bool | False | 启用 FP16(半精度)量化,减小模型大小并可能在支持的硬件上加速推理。与 INT8 量化或仅 CPU 导出不兼容。仅适用于特定格式,例如 ONNX(见下文)。 |
int8 | bool | False | 激活 INT8 量化,进一步压缩模型并在最小化 准确度 损失的情况下加速推理,主要针对 边缘设备。当与 TensorRT 一起使用时,执行训练后量化 (PTQ)。 |
dynamic | bool | False | 允许 TorchScript、ONNX、OpenVINO、TensorRT 和 CoreML 导出支持动态输入大小,从而在处理不同图像尺寸时增强灵活性。 |
simplify | bool | True | 使用 onnxslim 简化 ONNX 导出的模型图,从而提高性能以及与推理引擎的兼容性。 |
opset | int | None | 指定用于与不同 ONNX 解析器和运行时兼容的 ONNX opset 版本。如果不设置,则使用最新支持的版本。 |
workspace | float 或 None | None | 设置 TensorRT 优化的最大工作空间大小(以 GiB 为单位),以平衡内存使用和性能。使用 None 可让 TensorRT 根据设备最大值自动分配。 |
nms | bool | False | 在支持的情况下将非极大值抑制 (NMS) 添加到导出模型(参阅 导出格式),提高检测后处理效率。不适用于端到端模型。 |
batch | int | 1 | 指定导出模型的批量推理大小,或者导出模型在 predict 模式下将同时处理的最大图像数量。对于 Edge TPU 导出,此项会自动设置为 1。 |
device | str | None | 指定用于导出的设备:GPU (device=0)、CPU (device=cpu)、Apple 芯片的 MPS (device=mps)、华为昇腾 NPU (device=npu 或 device=npu:0),或 NVIDIA Jetson 的 DLA (device=dla:0 或 device=dla:1)。TensorRT 导出会自动使用 GPU。 |
data | str | 'coco8.yaml' | 数据集配置文件的路径,对于 INT8 量化校准至关重要。如果启用 INT8 但未指定此项,将使用 coco8.yaml 作为校准的后备选项。 |
fraction | float | 1.0 | 指定用于 INT8 量化校准的数据集比例。允许在完整数据集的子集上进行校准,这对于实验或资源有限时非常有用。如果启用 INT8 但未指定此项,将使用完整数据集。 |
end2end | bool | None | 覆盖支持无 NMS 推理(YOLO26、YOLOv10)的 YOLO 模型中的端到端模式。将其设置为 False 可让你导出这些模型,以兼容传统的基于 NMS 的后处理流水线。详情请参阅 端到端检测指南。 |
Adjusting these parameters allows for customization of the export process to fit specific requirements, such as deployment environment, hardware constraints, and performance targets. Selecting the appropriate format and settings is essential for achieving the best balance between model size, speed, and accuracy.
Link to this section导出格式#
可用的 YOLO26 导出格式如下表所示。你可以使用 format 参数导出为任何格式,例如 format='onnx' 或 format='engine'。你可以直接在导出的模型上进行预测或验证,例如 yolo predict model=yolo26n.onnx。导出完成后,会显示你模型的使用示例。模型也可以直接在 Ultralytics Platform 浏览器中导出,无需任何本地设置。
| 格式 | format 参数 | 模型 | 元数据 | 参数 |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, half, dynamic, optimize, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, half, int8, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, half, dynamic, int8, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, half, dynamic, simplify, workspace, int8, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, half, int8, nms, batch, device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, keras, int8, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, batch, device |
| TF Lite | tflite | yolo26n.tflite | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, int8, data, fraction, device |
| TF.js | tfjs | yolo26n_web_model/ | ✅ | imgsz, half, int8, nms, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, int8, half, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, half, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, int8, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, int8, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, int8, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, int8, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn_model/ | ✅ | imgsz, batch, name, int8, data, fraction, device |
Link to this section常见问题解答#
Link to this section如何将 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")有关该过程的更多详细信息,包括处理不同输入大小等高级选项,请参阅 ONNX 集成指南。
Link to this section使用 TensorRT 进行模型导出的好处是什么?#
使用 TensorRT 进行模型导出可带来显著的性能提升。导出为 TensorRT 的 YOLO26 模型可实现高达 5 倍的 GPU 加速,非常适合实时推理应用。
- 多功能性: 针对特定硬件配置优化模型。
- 速度: 通过高级优化实现更快的推理。
- 兼容性: 与 NVIDIA 硬件无缝集成。
要了解有关集成 TensorRT 的更多信息,请参阅 TensorRT 集成指南。
Link to this section在导出 YOLO26 模型时,如何启用 INT8 量化?#
INT8 量化是压缩模型和加速推理的绝佳方式,特别是在边缘设备上。以下是你如何启用 INT8 量化的方法:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # Load a model
model.export(format="onnx", int8=True, data="coco8.yaml")INT8 quantization can be applied to various formats, such as ONNX, TensorRT, OpenVINO, CoreML, and Rockchip RKNN. For optimal quantization results, provide a representative dataset using the data parameter.
Link to this section为什么导出模型时动态输入大小很重要?#
动态输入大小允许导出的模型处理不同的图像尺寸,从而在不同用例中提供灵活性并优化处理效率。当导出为 ONNX 或 TensorRT 等格式时,启用动态输入大小可确保模型能够无缝适应不同的输入形状。
要启用此功能,请在导出期间使用 dynamic=True 标志:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export(format="onnx", dynamic=True)动态输入大小对于输入尺寸可能会变化的应用程序特别有用,例如视频处理或处理来自不同来源的图像时。
Link to this section优化模型性能时需要考虑哪些关键导出参数?#
理解和配置导出参数对于优化模型性能至关重要:
format:导出模型的目标格式(例如onnx、torchscript、tensorflow)。imgsz:模型输入所需的图像大小(例如640或(height, width))。half:启用 FP16 量化,减小模型大小并可能加速推理。optimize:为移动设备或受限环境应用特定优化。int8:启用 INT8 量化,这对 边缘 AI 部署非常有益。
对于在特定硬件平台上的部署,请考虑使用专门的导出格式,例如用于 NVIDIA GPU 的 TensorRT、用于 Apple 设备的 CoreML,或用于 Google Coral 设备的 Edge TPU。
Link to this section导出的 YOLO 模型中的输出张量代表什么?#
当你将 YOLO 模型导出为 ONNX 或 TensorRT 等格式时,输出张量结构取决于模型任务。理解这些输出对于自定义推理实现很重要。
对于 检测模型(例如 yolo26n.pt),输出通常是一个形状为 (batch_size, 4 + num_classes, num_predictions) 的张量,其中通道代表边界框坐标加上每类分数,而 num_predictions 取决于导出的输入分辨率(并且可以是动态的)。
对于 分割模型(例如 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 推理示例中的示例展示了如何针对每种模型类型处理这些输出。
Link to this sectionWhy is output0 FP32 when exporting with half=True and end2end=True?#
当使用 half=True(或 int8=True)导出时,大多数张量被转换为较低精度以减小模型大小并提高性能。但是,当启用 end2end=True 时,后处理(包括类索引)被直接嵌入到导出的图中。
output0 张量包含类索引,这些索引在内部表示为浮点值。由于 FP16 尾数精度有限,它无法可靠地表示 2048 以上的整数值。为了避免潜在的精度损失或错误的类别 ID,output0 被故意保留为 FP32。
此行为是预期的,也适用于必须保持类索引保真度的低精度或量化导出。
如果需要完整的 FP16 输出,请使用 end2end=False 进行导出并在外部执行后处理。