Ultralytics YOLO27:

了解 Ultralytics YOLO26 中的端到端检测#

YOLO26 同时训练多对一头和一对一头。默认情况下,预测和验证使用带有非极大值抑制 (NMS) 的多对一头。在使用相同训练权重的情况下,这更有利于提高准确率。设置 nms=False 以改用更快且无需 NMS 的一对一头。

一个参数控制着预测验证追踪导出基准测试中的选择:

nms预测和验证导出
None(默认)多对一头;Ultralytics 运行 NMS原始多对一输出;消费者运行 NMS
TrueNone带有在支持的情况下嵌入的 NMS 的多对一头
False没有 IoU 抑制的一对一头在支持的情况下无需 NMS 的一对一输出

None 意味着模型中未嵌入可选的后处理。它会移除将模型输出转换为预测结果或验证指标的常规处理。分类、语义分割、深度以及没有可选检测头的模型保持其任务的本机行为。

选择输出路径
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model.predict("image.jpg")  # one-to-many + NMS
metrics = model.val(data="coco.yaml")  # one-to-many + NMS
results = model.predict("image.jpg", nms=False)  # opt into NMS-free inference
results = model.predict("image.jpg", nms=None)  # switch back to one-to-many + NMS

model.export(format="onnx")  # raw one-to-many outputs
model.export(format="onnx", nms=True)  # embed NMS
model.export(format="onnx", nms=False)  # NMS-free one-to-one outputs

端到端检测的工作原理#

两个头共享主干和颈部,并在训练期间进行优化。多对一头为每个对象提供多个候选预测;NMS 会移除重叠的检测结果。一对一头学习为每个对象生成单个预测。选择推理路径不会禁用双头监督。训练期间的验证使用所选的推理头,因此检查点选择和提前停止遵循与部署相同的预测。

深度头外部处理前的检测输出处理
多对一(默认)(N, nc + 4, 8400)置信度过滤和 NMS
一对一(N, 300, 6)置信度过滤;无 IoU 抑制

这里 N 是批量大小,nc 是类别数量,8400 是在 imgsz=640 处的候选数量。一对一检测行包含 [x1, y1, x2, y2, confidence, class_id]。其他检测任务带有额外的输出:

任务端到端输出额外数据
检测(N, 300, 6)
实例分割(N, 300, 6 + nm)(N, nm, H, W)掩码系数和原型
姿态(N, 300, 57)17 个关键点 × 3 个值
OBB(N, 300, 7)旋转角度

融合会移除未使用的推理分支并折叠 Conv 和 BatchNorm 层。如果需要切换头,请保留原始训练检查点:融合无法重建已经移除的分支。只剩下其一对一头的模型会保留该可用路径。

导出的输出#

YOLOv8、YOLO11 和 YOLO26 检测模型默认导出原始多对一预测。使用 nms=False 导出 YOLO26 以获取无需 NMS 的检测结果。

nms=Nonenms=False
检测输出(N, nc + 4, 8400)(N, 300, 6)
框格式xywhxyxy
分数每个候选每个类别一个分数每个检测结果的置信度和类别 ID
外部处理置信度过滤和 NMS置信度过滤

nms=True 也会产生处理后的检测结果,但使用的是多对一头并嵌入了传统的 NMS。当部署运行时需要接收检测结果而无需自己实现抑制时,这非常有用。

导出的模型的计算图决定了其输出。加载时传递 nms 不会重建计算图;请使用所需的 nms 值导出源检查点以选择其输出路径。Ultralytics 使用工件的元数据来避免应用两次 NMS。

导出格式兼容性#

ONNX、TensorRT、CoreML、OpenVINO 和其他几种格式支持无需 NMS 的导出。当 NCNN、RKNN、PaddlePaddle、ExecuTorch、IMX、Edge TPU 和 Qualcomm QNN 的算子不支持端到端输出时,它们会回退到多对一路径。格式警告会解释回退原因。

  • 嵌入式 NMS: nms=True 受每种格式的任务、精度和动态形状限制。不支持嵌入式 NMS 的格式会导出原生输出供外部处理。
  • CoreML: 嵌入式 NMS 支持具有静态形状的检测、分割和姿态估计。对于需要 Xcode Preview 的 NMS 流水线的检测模型,请使用 nms=True
  • MNN: 嵌入式 NMS 支持带有 dynamic=False 的检测和姿态估计。
  • IMX: 检测、实例分割和姿态估计需要嵌入式 NMS,该项会自动选择。
  • Hailo: YOLO26 默认使用带有主机 NMS 的原始张量;nms=False 选择其一对一路径。YOLOv8/YOLO11 检测使用 HailoRT NMS。
  • 量化: 8.5.0 之前的 TensorRT 版本、JetPack 6 上的 TensorRT 10.3.0 INT8 以及 LiteRT INT8 或 w8a16 会回退到多对一输出。

有关硬件要求,请参阅各个集成指南。对于完整的 FP16 输出张量,请使用 nms=None;即使模型被量化,端到端类别索引也可以将输出张量保持在 FP32 中。

精度与速度的权衡#

已发布的 YOLO26 COCO 结果表明,多对一头在五个尺度上将检测 mAP 提高了 0.6–0.8 个点:例如,YOLO26n 为 40.9 对比 40.1,YOLO26x 为 57.5 对比 56.9。一对一头避免了 NMS 遍历并倾向于降低延迟。这些结果构成了默认设置的动机;它们不保证在每个数据集上都能获得增益。

已发布的无需 NMS 的速度测量使用 nms=False。使用相同的头选择、图像大小、精度和硬件来比较准确率和延迟。

常见问题#

  • 它限制了预测和验证返回的检测结果。对于端到端和嵌入 NMS 导出,该限制是图的一部分,因此需要重新导出进行更改;CoreML 检测嵌入 NMS 是个例外,没有检测上限。当图像提供的候选对象少于 max_det 个锚点时,端到端输出可以包含较少的候选对象。

  • 是的,对于带有默认检测限制的 nms=Falsenms=True 而言是正确的。仅凭形状无法识别导出了哪个头。默认的原始 COCO 检测导出通常在 imgsz=640 处具有形状 (1, 84, 8400)

  • 是的。相同的 nms 参数为检测、实例分割、姿态估计和 OBB 选择可用的检测头。它不会替代掩码重建、关键点解码、旋转框处理、分类概率、语义类别图或深度解码。

评论