了解 Ultralytics YOLO26 中的端到端检测#
YOLO26 同时训练多对一头和一对一头。默认情况下,预测和验证使用带有非极大值抑制 (NMS) 的多对一头。在使用相同训练权重的情况下,这更有利于提高准确率。设置 nms=False 以改用更快且无需 NMS 的一对一头。
nms | 预测和验证 | 导出 |
|---|---|---|
None(默认) | 多对一头;Ultralytics 运行 NMS | 原始多对一输出;消费者运行 NMS |
True | 同 None | 带有在支持的情况下嵌入的 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=None | nms=False | |
|---|---|---|
| 检测输出 | (N, nc + 4, 8400) | (N, 300, 6) |
| 框格式 | xywh | xyxy |
| 分数 | 每个候选每个类别一个分数 | 每个检测结果的置信度和类别 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=False或nms=True而言是正确的。仅凭形状无法识别导出了哪个头。默认的原始 COCO 检测导出通常在imgsz=640处具有形状(1, 84, 8400)。是的。相同的
nms参数为检测、实例分割、姿态估计和 OBB 选择可用的检测头。它不会替代掩码重建、关键点解码、旋转框处理、分类概率、语义类别图或深度解码。