Non-Maximum Suppression (NMS)
了解非极大值抑制(NMS)如何消除目标检测中的重复边界框。探索 Ultralytics YOLO26 如何提供原生端到端 NMS。
非极大值抑制 (NMS) 是目标检测中使用的一种后处理技术,用于优化模型生成的原始预测结果。当目标检测模型分析图像时,通常会为同一个对象生成多个相互重叠的边界框,每个边界框都对应一个置信度分数。这些冗余预测的出现,是因为模型可能会在略有不同的尺度或位置检测到同一特征。NMS 会过滤这些输出,为每个对象仅保留最准确的边界框并丢弃其他框,从而确保最终输出整洁、精确且没有重复项。
非极大值抑制的工作原理#
NMS 算法处理的是候选边界框及其对应置信度分数的列表。其目标是为一个对象选出最佳边界框,并抑制(移除)与其显著重叠的其他边界框,因为这些边界框很可能是对同一对象的重复检测。该过程通常遵循以下步骤:
-
过滤: 消除所有置信度分数低于特定阈值(例如 0.25)的边界框,以便立即移除较弱的预测结果。
-
排序: 根据置信度分数,按降序排列剩余边界框。
-
选择: 将置信度分数最高的边界框选为有效检测结果。
-
比较: 使用交并比 (IoU) 将选中的边界框与所有其他剩余边界框进行比较。交并比是用于衡量两个边界框重叠程度的指标。
-
抑制: 如果选中边界框与另一个边界框之间的 IoU 超过预定义阈值(例如 0.45),则将分数较低的边界框视为重复项并移除。
-
迭代: 使用尚未被抑制或选中的下一个最高分边界框重复该过程,直到处理完所有边界框。
实际应用#
在精度至关重要且重复检测可能干扰下游系统的场景中,NMS 不可或缺。
- 自动驾驶: 在自动驾驶汽车系统中,摄像头会检测行人、其他车辆和交通标志。模型可能会为同一个行人预测出三个略有不同的边界框。NMS 可确保车辆的规划系统仅接收到该行人的一个坐标,从而避免由“幽灵”障碍物导致的异常制动或路径规划错误。
- 零售库存管理: 使用计算机视觉统计货架上的商品时,商品通常摆放得很紧密。如果没有 NMS,同一罐汽水可能会因预测结果重叠而被计数两次,导致库存水平不准确。NMS 会优化这些检测结果,确保库存数量与实际情况相符。
使用 PyTorch 实现 NMS#
尽管许多现代框架会在内部处理 NMS,但了解其实现方式有助于调节参数。以下示例演示了如何使用 PyTorch 库应用 NMS:
import torch
import torchvision.ops as ops
# Example bounding boxes: [x1, y1, x2, y2]
boxes = torch.tensor(
[
[100, 100, 200, 200], # Box A
[105, 105, 195, 195], # Box B (High overlap with A)
[300, 300, 400, 400], # Box C (Distinct object)
],
dtype=torch.float32,
)
# Confidence scores for each box
scores = torch.tensor([0.9, 0.8, 0.95], dtype=torch.float32)
# Apply NMS with an IoU threshold of 0.5
# Boxes with IoU > 0.5 relative to the highest scoring box are suppressed
keep_indices = ops.nms(boxes, scores, iou_threshold=0.5)
print(f"Indices to keep: {keep_indices.tolist()}")
# Output will likely be [2, 0] corresponding to Box C (0.95) and Box A (0.9),
# while Box B (0.8) is suppressed due to overlap with A.NMS 与端到端检测的对比#
传统上,NMS 一直是位于主神经网络之外的必需“清理”步骤,会增加推理延迟。不过,该领域正逐步转向端到端架构。
- 标准 NMS: 一种需要手动调节 IoU 阈值的启发式过程。如果阈值过低,彼此接近的有效对象可能会被漏检(召回率低)。如果阈值过高,则会保留重复项(精确率低)。
- 端到端模型: YOLO26 等新一代模型经过设计,可原生实现端到端处理。它们会在训练期间学习为每个对象准确预测一个边界框,从而有效地将 NMS 过程内置于模型中。这样无需外部后处理,既能提升推理速度,也能简化在 Ultralytics Platform 上的部署流程。









