非极大值抑制(NMS)算法
题目描述:
在计算机视觉的目标检测任务中,一个常见的步骤是生成大量的候选边界框(Bounding Boxes)。例如,使用滑动窗口或区域提议网络(RPN)时,模型可能会对同一个目标物体预测出多个位置和大小略有不同的边界框,并且每个边界框都带有一个置信度分数。非极大值抑制算法的目标就是从这些重叠的候选框中,筛选出最有可能代表真实目标的一个或少数几个最优的边界框,同时消除冗余的、重叠度高的重复检测框。简而言之,NMS 就是要“去粗取精”,保证对同一个物体我们只输出一个最可靠的检测结果。
解题过程:
NMS 的核心思想非常直观:在存在多个重叠的候选框时,只保留其中置信度最高的那一个,而抑制(即删除)所有其他与该高置信度框重叠度过高的框。
让我们一步步拆解这个算法的执行流程:
步骤 1:准备输入
假设我们有一组检测到的边界框集合 B,以及每个边界框对应的置信度分数集合 S。
- 每个边界框通常用其左上角和右下角的坐标表示,例如
(x1, y1, x2, y2)。 - 我们还需要设定一个阈值,称为 交并比阈值(IoU Threshold),通常用
N_t表示(例如,N_t = 0.5)。这个阈值用于判断两个框是否“重叠度过高”。
步骤 2:按置信度排序
首先,我们将所有边界框按照它们的置信度分数 S 进行降序排序。这样,我们总是从最可信的检测结果开始处理。
排序后的框列表: [Box_A(分数0.95), Box_B(分数0.90), Box_C(分数0.88), Box_D(分数0.82), ...]
步骤 3:初始化与迭代
-
选择当前最高分框:从排序后的列表中,取出置信度最高的那个边界框(也就是列表的第一个框),将它从候选列表中移除,并添加到最终的“保留结果列表”中。
- 例如,首先选择
Box_A,将其放入结果列表。
- 例如,首先选择
-
计算交并比(IoU):将这个被选中的最高分框(
Box_A)与剩余的所有候选框(Box_B,Box_C,Box_D, ...)逐一计算交并比(IoU)。- IoU 的计算公式:
IoU = (两个框的交集面积) / (两个框的并集面积)。 - IoU 的值在 0 到 1 之间。值越大,表示两个框的重叠程度越高。
- IoU 的计算公式:
-
抑制重叠框:将剩余候选框中,与当前最高分框的 IoU 值大于预设阈值
N_t的所有框删除(抑制掉)。- 逻辑:这些被删除的框被认为和当前这个最优框(
Box_A)检测的是同一个物体。由于Box_A的置信度更高,我们相信它更准确,因此删除那些冗余的、置信度较低但重叠度高的框。 - 例如,假设
Box_B和Box_C与Box_A的 IoU 都大于 0.5,那么就从候选列表中移除Box_B和Box_C。
- 逻辑:这些被删除的框被认为和当前这个最优框(
步骤 4:重复过程
经过步骤3后,候选列表中剩下的框都是与当前已选框重叠度较低(IoU < N_t)的框,它们很可能代表的是图像中其他不同的物体。
- 我们回到步骤3.1,从新的候选列表中再次选取置信度最高的框,重复上述的“选择-计算IoU-抑制”过程。
- 例如,现在候选列表里剩下
Box_D(分数0.82)和Box_E(分数0.75)。我们选择Box_D放入结果列表,然后用它去和Box_E计算 IoU。如果它们的 IoU 小于阈值,则Box_E被保留,进入下一轮;如果大于阈值,则Box_E被抑制。
步骤 5:算法终止
当候选列表中被处理得空空如也,没有任何剩余的边界框时,整个 NMS 算法结束。此时,“保留结果列表”中就是我们最终想要的、去除了冗余检测框的干净结果。
总结与要点:
- 关键参数:IoU 阈值
N_t的选择至关重要。如果N_t设得太高(如 0.8),可能会导致对同一物体保留多个检测框(抑制不够);如果N_t设得太低(如 0.2),则可能会误删掉一些实际是不同但距离较近的物体的检测框(抑制过度)。 - 核心优势:NMS 算法简单、高效,是目标检测 pipeline(如 R-CNN, YOLO, SSD 等)中一个不可或缺的后处理步骤。
- 局限性:当两个物体靠得非常近,以至于它们的候选框 IoU 很高时,NMS 可能会错误地抑制掉其中一个物体的检测框。针对这个问题,后续也有一些改进算法,如 Soft-NMS、Weighted-NMS 等。