使用 Ultralytics YOLO 导出模型#
简介#
训练模型的最终目标是将其部署到实际应用中。Ultralytics YOLO26 中的导出模式提供了丰富的选项,可将训练好的模型导出为不同的格式,使其能够在各种平台和设备上部署。本综合指南旨在带你了解模型导出的细节,展示如何实现最大的兼容性和性能。
请查阅未发布的 YOLO27 预览版以了解计划中的导出支持。
Watch: How to Export Ultralytics YOLO26 in different formats for Deployment | ONNX, TensorRT, CoreML 🚀
为什么选择 YOLO26 的导出模式?#
- 通用性: 可导出为多种格式,包括 ONNX、TensorRT、CoreML 等。
- 性能: 使用 TensorRT 可获得高达 5 倍的 GPU 提速,使用 ONNX 或 OpenVINO 可获得高达 3 倍的 CPU 提速。
- 兼容性: 让模型能够在众多硬件和软件环境中实现通用部署。
- 易用性: 提供简单的 CLI 和 Python API,可快速直接地导出模型。
导出模式的核心功能#
以下是一些突出的功能:
- 一键导出: 通过简单命令即可导出为不同格式。
- 批量导出: 导出支持批量推理的模型。
- 优化推理: 导出的模型经过优化,可缩短推理时间。
- 教程视频: 提供深入的指南和教程,带来流畅的导出体验。
使用示例#
将 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 模型导出为不同格式时可用的配置和选项。这些设置对于优化导出模型在各种平台和环境中的性能、大小和兼容性至关重要。正确的配置可确保模型以最佳效率准备好部署到预期的应用程序中。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
format | str | 'torchscript' | 导出模型的目标格式,例如 'onnx'、'torchscript'、'engine' (TensorRT) 或其他格式。每种格式都支持与不同部署环境的兼容性。 |
name | str | None | 需要硬件目标的格式所使用的硬件目标名称:Hailo 架构('hailo8'、'hailo8l'、'hailo10h'、'hailo15h'、'hailo15l';默认为 'hailo8l')、Rockchip RKNN 芯片(默认为 'rk3588')、华为 Ascend SoC(CANN --soc_version;默认为 'Ascend310B4')或 Qualcomm QNN HTP 目标(默认为 '73')。不同于其他模式使用的 project/name 运行命名组合。 |
imgsz | int 或 tuple | 640 | 模型输入所需的图像尺寸。可以使用整数表示正方形图像(例如,640 表示 640×640),也可以使用元组 (height, width) 指定具体尺寸。未传入该参数时,导出会复用加载的检查点中记录的训练尺寸:官方 YOLO26 检查点会为检测深度记录 768,为分类记录 224,为 OBB 记录 1024,为其他任务记录 640;而微调模型会记录其训练时使用的 imgsz。根据 YAML 构建的模型没有记录的训练尺寸,会使用 640。 |
keras | bool | False | 启用导出为 Keras 格式,以生成 TensorFlow SavedModel,并兼容 TensorFlow serving 和 API。 |
optimize | bool | False | 为 DEEPX 启用更高级别的编译器优化,降低推理延迟,但会增加编译时间。 |
quantize | int 或 str | None | 量化精度:16(FP16,可减小模型大小并在支持的硬件上加快推理速度)或 8(INT8/PTQ,以极小的准确率损失进一步压缩模型,主要用于边缘设备;需要校准 data/fraction);32/未设置时为 FP32。使用 quantize=8 训练的检查点始终导出 INT8:onnx 和 engine 无需校准即可从其携带的范围内导出,其他格式或精度将被拒绝。支持混合权重/激活精度的导出格式也接受 'w8a8'/'w16a16'/'w8a16'/'w8a32' 表示法。替代已废弃的 half/int8 标志(half=True → 16,int8=True → 8,目前仍可接受但会发出废弃警告)。仅允许使用目标格式支持的精度(见下文)。 |
dynamic | bool | False | 允许 TorchScript、ONNX、OpenVINO、TensorRT 和 CoreML 导出使用动态输入尺寸,从而更灵活地处理不同的图像尺寸。 |
simplify | bool | True | 对于会构建中间 ONNX 图的导出格式,使用 onnxslim 简化该图(参见导出格式),可能提升性能以及与推理引擎的兼容性。 |
opset | int | None | 指定会构建 ONNX 图的导出格式所使用的 ONNX opset 版本(参见导出格式),以兼容不同的 ONNX 解析器和运行时。未设置时,使用最新的受支持版本。 |
workspace | float 或 None | None | 为 TensorRT 优化设置最大工作空间大小(单位为 GiB),在内存使用量与性能之间进行平衡。使用 None 可由 TensorRT 自动分配,最大不超过设备上限。 |
nms | bool,可选 | None | None 导出生的一对多预测以供外部 NMS 使用;True 在支持的地方嵌入 NMS;False 在可用时选择无 NMS 的头。CoreML 嵌入式 NMS 支持具有静态形状的检测、分割和姿态估计。详见端到端检测指南。 |
conf | float | None | 在生成导出时 NMS 的所有场景中使用的置信度阈值:nms=True 导出;Hailo 的非端到端检测导出;以及 IMX 的检测、姿态和分割导出,它们会在内部强制使用 nms=True。未设置时默认为 0.25。 |
iou | float | 0.7 | 在生成导出时 NMS 的所有场景中使用的 IoU 阈值:nms=True 导出;Hailo 的非端到端检测导出;以及 IMX 的检测、姿态和分割导出,它们会在内部强制使用 nms=True。 |
max_det | int | 300 | 导出模型输出中保留的最大检测数量。适用于所有格式的 nms=True 导出(CoreML 检测除外,其原生 NMS 流水线没有检测上限),以及无 NMS 的端到端检测导出(YOLO26、YOLOv10,上限为可用锚点数量)和 IMX 的检测、姿态估计与分割导出。 |
agnostic_nms | bool | False | 只要通过标准 nms=True 流程生成导出时 NMS,就启用类别无关的 NMS,包括 CoreML 自身的 NMS 阶段,抑制不同类别之间分数较低的重叠框,而不仅仅是同一类别内的重叠框。Hailo 或 IMX 自身生成的 NMS 配置不支持此选项,因此无论此标志如何设置,它们始终使用类别相关的 NMS。该选项也会内置到无 NMS 的端到端导出中(YOLO26、YOLOv10),此时仅防止同一检测结果出现在多个类别标签下(IoU=1.0 的重复项),不会对不同框执行基于 IoU 阈值的抑制。 |
batch | int | 1 | 指定导出模型的批次推理大小,或导出模型在 predict 模式下可并发处理的最大图像数量。对于 Edge TPU 导出,此值会自动设置为 1。 |
device | str | None | 指定导出设备:GPU(device=0)、CPU(device=cpu)、Apple silicon 上的 MPS(device=mps)、华为 Ascend NPU(device=npu 或 device=npu:0)或 NVIDIA Jetson 上的 DLA(device=dla:0 或 device=dla:1)。TensorRT 导出会自动使用 GPU,但 TensorRT 11.0 不支持 DLA。 |
verbose | bool | False | 在 format='engine' 导出期间,将 TensorRT 构建器日志级别提升为 VERBOSE。其他导出格式会忽略该参数。 |
data | str | None | 数据集 YAML 的路径,对于 INT8 量化校准至关重要;分类任务则改为使用数据集目录或内置数据集名称。如果在启用 INT8 的情况下未指定,Ultralytics 会在需要时选择特定于任务的校准数据集,或者回退到模型任务的默认数据集。使用 quantize=8 训练的检查点带有自己的 INT8 范围,不需要校准数据。 |
split | str | 'val' | 数据集划分('train'、'val' 或 'test'),用于从 data 构建 INT8 量化校准数据加载器。 |
fraction | float、int 或 list | 1.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 | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz、quantize、dynamic、nms、batch、device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz、quantize、dynamic、simplify、opset、nms、batch、data、fraction、device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz、quantize、dynamic、nms、batch、data、fraction、device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz、quantize、dynamic、simplify、opset、workspace、nms、batch、data、fraction、device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz、dynamic、quantize、nms、batch、device |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz、keras、quantize、opset、nms、batch、data、fraction、device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz、opset、batch、device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz、quantize、opset、data、fraction、device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz、batch、device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz、batch、dynamic、quantize、simplify、opset、nms、device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz、quantize、batch、device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz、quantize、data、fraction、nms、device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz、batch、name、quantize、simplify、opset、data、fraction、device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz、batch、device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz、batch、quantize、data、fraction、device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz、quantize、simplify、opset、data、optimize、device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz、batch、name、quantize、simplify、opset、data、fraction、device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz、quantize、batch、data、fraction、device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz、name、quantize、data、fraction、simplify、conf、iou |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz、batch、name、quantize、opset、simplify、nms |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz、batch、quantize |
nms=None 默认对外部 NMS 使用原始输出。设置 nms=False 以选择可用的无 NMS 检测头;不支持的格式将回退到其本机输出路径。上面的 nms 条目标识了可以通过 nms=True 嵌入 NMS 的格式。
大多数格式需要未随 ultralytics 一起安装的软件包。当缺少某个软件包时,导出会在运行时通过 uv 或 pip 安装它,在 Linux 上则通过 apt 安装系统软件包,例如 Edge TPU 编译器或用于 IMX 的 Java。若要保持环境固定(例如在容器镜像、CI 作业或生产服务中),请设置 YOLO_AUTOINSTALL=False。随后,导出仍会检查缺少的软件包并报告它们,但会保持环境不变并在这些软件包安装完成之前失败。
export YOLO_AUTOINSTALL=False量化选项#
使用 quantize 参数来请求导出精度。字符串值不区分大小写,Ultralytics 在导出前会规范化接受的别名:
| 请求值 | 规范值 | 含义 |
|---|---|---|
8、"8"、"int8"、"w8a8" | 8 | INT8 权重和激活值 |
16、"16"、"fp16"、"w16a16" | 16 | FP16 权重和激活值 |
32、"32"、"fp32"、"w32a32" | 32 | FP32 导出;与未设置相同,但 CoreML NMS ML 程序默认使用 FP16 |
"w8a16" | "w8a16" | 带 16 位激活值的 INT8 权重(FP16;在 LiteRT 上为 INT16) |
"w8a32" | "w8a32" | 带 FP32 激活值的 INT8 权重(LiteRT 动态 INT8,无需校准) |
旧版 half=True 和 int8=True 标志仍然被接受,但会带有弃用警告,并会转发给 quantize=16 和 quantize=8。
并非每个导出格式都支持所有精度。明确的 quantize 请求要么生成该精度,要么在导出前失败:
| 格式 | FP32(32 / 未设置) | FP16(16) | INT8(8) | W8A16("w8a16") | 备注 |
|---|---|---|---|---|---|
| PyTorch | ✅ | 不适用 | 不适用 | 不适用 | 原生训练/检查点格式。 |
| TorchScript | ✅ | ✅ 仅限 GPU | ❌ | ❌ | FP16 TorchScript 导出需要 device=0;CPU 导出为 FP32。 |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8 使用 ONNX Runtime 静态量化和校准数据。 |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8 使用 NNCF 训练后量化。 |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8 需要代表性校准数据。 |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreML INT8 是权重量化;W8A16 使用带 FP16 激活值的 INT8 权重。¹未设置的 NMS ML 程序默认使用 FP16。 |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | INT8 导出使用 TensorFlow 校准。 |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | 无导出时精度转换。 |
| Edge TPU | ❌ | ❌ | ✅ 自动 | ❌ | Edge TPU 需要 INT8;未设置时会自动启用。 |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | 无导出时精度转换。 |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8 是通过 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=8 到 train 来微调预训练检查点,然后像往常一样进行导出:
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 引擎 |
|---|---|---|---|
yolo26n | 0.4032 | 0.3934 | 0.3935 |
yolo26s | 0.4794 | 0.4412 | 0.4711 |
yolo26m | 0.5269 | 0.4696 | 0.5137 |
yolo26l | 0.5440 | 0.4889 | 0.5307 |
yolo26x | 0.5701 | 0.5138 | 0.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 运行,该工具在首次使用时会自动安装,加载生成的检查点时也需要安装它。这些范围会随检查点一同保存,并且 onnx 和 engine 导出会将它们输出为 Q/DQ 节点;其他格式则会读取校准数据并拒绝 QAT 检查点。
接下来做什么#
查找部署目标的集成指南 — ONNX、TensorRT、CoreML 等内容位于完整集成列表中 — 了解如何运行导出的模型。
常见问题#
使用 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 量化可应用于诸如 ONNX、TensorRT、OpenVINO、CoreML 和 Rockchip RKNN 等格式。为了获得最佳量化结果,请使用
data参数提供代表性数据集。有关接受的quantize值和支持的格式,请参阅量化选项。理解和配置导出参数对于优化模型性能至关重要:
format:导出模型的目标格式(例如onnx、torchscript、saved_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++ 部署,请将模型导出为运行时格式,例如 ONNX、TensorRT、TorchScript 或 MNN,然后使用该运行时的原生 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进行导出并在外部执行后处理。