了解非最大抑制(NMS)如何消除目标检测中的重复边界框。Ultralytics 如何提供原生端到端NMS。
非最大抑制(NMS)是一种用于目标检测的后处理技术,用于优化模型生成的原始预测结果。 当目标检测模型分析图像时,常会为单个目标生成多个重叠的边界框,每个边界框都关联着相应的置信度评分。这种冗余预测的产生源于模型可能在略有差异的尺度或位置detect 。NMS 仅保留每个目标最精确的边界框并舍弃其余预测NMS 输出结果,确保最终输出清晰、精准且无重复项。
NMS 候选边界框列表及其对应的置信度分数进行操作。其目标是为目标选择最佳边界框,并抑制(移除)与其显著重叠的其他边界框,因为这些框很可能是对同一目标的重复检测。该过程通常遵循以下步骤:
在精度至关重要且重复检测可能导致下游系统混乱的场景中,NMS 。
尽管许多现代框架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 强制性的"清理"步骤,独立于主神经网络之外运行,从而增加了推理延迟。然而,该领域正朝着端到端架构方向发展。