07 非极大值抑制(Non-Max Suppression, NMS)
07 非极大值抑制(Non-Max Suppression, NMS)
07 非极大值抑制(Non-Max Suppression, NMS)
一、问题背景
在基于网格(grid cell)的对象检测算法(如 YOLO)中,每个网格单元都会独立预测是否存在目标及其边界框(bounding box)。
但由于目标可能跨越多个网格,多个相邻网格可能都预测了同一个目标,导致对同一对象产生多个重复的检测结果。
💡 目标:确保每个真实对象只被检测一次。
二、非极大值抑制(NMS)的核心思想
保留置信度最高的检测框,抑制与其高度重叠的其他检测框。
- “非极大值”:不保留局部最大值以外的相近高分预测。
- “抑制”:通过交并比(IoU)判断重叠程度,移除冗余框。
三、NMS 算法步骤(单类别情况)
假设我们只检测一种对象(如“汽车”),每个网格输出:
- $p_c$:该网格包含对象的概率(confidence score)
- $(b_x, b_y, b_h, b_w)$:边界框的中心坐标与宽高(相对于网格或图像)
步骤 1:过滤低置信度框
设定阈值 $\tau$(例如 $\tau = 0.6$),丢弃所有满足:
\[p_c \leq \tau\]的边界框。
✅ 保留高置信度候选框集合 $B = { \text{bbox}_i \mid p_c^{(i)} > \tau }$
步骤 2:迭代选择最优框并抑制重叠框
1
2
3
4
5
6
7
8
9
10
while B 非空:
1. 选出置信度最高的框 $ \text{bbox}_{\text{max}} = \arg\max_{\text{bbox} \in B} p_c $
2. 将 $ \text{bbox}_{\text{max}} $ 加入最终输出列表
3. 对 B 中其余每个框 $ \text{bbox}_j $:
计算 IoU(交并比):
$$
\text{IoU}(\text{bbox}_{\text{max}}, \text{bbox}_j) =
\frac{|\text{bbox}_{\text{max}} \cap \text{bbox}_j|}{|\text{bbox}_{\text{max}} \cup \text{bbox}_j|}
$$
若 $ \text{IoU} > \text{IoU}_{\text{threshold}} $(如 0.5),则从 B 中移除 $ \text{bbox}_j $
🔁 重复直到所有候选框被处理完毕。
四、多类别检测中的 NMS
当检测多个类别(如行人、汽车、摩托车)时:
- 每个边界框会输出多个类别概率:$p_c \cdot P(\text{class}_k)$,其中 $k = 1,2,\dots,K$
对每个类别独立执行 NMS:
- 分别提取属于该类别的所有边界框(使用该类别的置信度)
- 在该类别内部运行上述 NMS 流程
✅ 这样可避免不同类别的框互相抑制(例如汽车框不会抑制行人框)。
五、关键概念与公式
1. 置信度(Confidence Score)
通常定义为:
\[\text{score} = p_c \cdot P(\text{class} \mid \text{object})\]但在单类别检测中简化为 $p_c$。
2. 交并比(Intersection over Union, IoU)
给定两个边界框 $A$ 和 $B$:
\[\text{IoU}(A, B) = \frac{\text{Area of Overlap}(A \cap B)}{\text{Area of Union}(A \cup B)}\]- IoU ∈ [0, 1]
- IoU 越高,重叠越严重
- 常用阈值:0.5(严格场景可用 0.3~0.7)
六、NMS 的作用与意义
| 作用 | 说明 |
|---|---|
| ✅ 去除重复检测 | 同一目标不再被多个框重复报告 |
| ✅ 提升检测精度 | 输出更干净、更准确的边界框 |
| ✅ 适用于 YOLO、Faster R-CNN 等 | 是现代目标检测 pipeline 的标准后处理步骤 |
七、注意事项
- NMS 是后处理步骤,不参与网络训练。
- 在密集目标场景(如人群)中,标准 NMS 可能过度抑制,可考虑 Soft-NMS 等改进方法(课程未涉及,但值得了解)。
- 实际实现中需注意边界框坐标的表示方式(中心点+宽高 vs 左上右下)。
八、小结(一句话)
非极大值抑制(NMS)通过保留高置信度检测框并移除与其高 IoU 重叠的其他框,有效解决同一目标被多次检测的问题,是目标检测中不可或缺的后处理技术。
本文由作者按照 CC BY 4.0 进行授权