非极大值抑制(NMS)算法
字数 1793 2025-10-27 00:33:54

非极大值抑制(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:初始化与迭代

  1. 选择当前最高分框:从排序后的列表中,取出置信度最高的那个边界框(也就是列表的第一个框),将它从候选列表中移除,并添加到最终的“保留结果列表”中。

    • 例如,首先选择 Box_A,将其放入结果列表。
  2. 计算交并比(IoU):将这个被选中的最高分框(Box_A)与剩余的所有候选框(Box_B, Box_C, Box_D, ...)逐一计算交并比(IoU)。

    • IoU 的计算公式IoU = (两个框的交集面积) / (两个框的并集面积)
    • IoU 的值在 0 到 1 之间。值越大,表示两个框的重叠程度越高。
  3. 抑制重叠框:将剩余候选框中,与当前最高分框的 IoU 值大于预设阈值 N_t 的所有框删除(抑制掉)。

    • 逻辑:这些被删除的框被认为和当前这个最优框(Box_A)检测的是同一个物体。由于 Box_A 的置信度更高,我们相信它更准确,因此删除那些冗余的、置信度较低但重叠度高的框。
    • 例如,假设 Box_BBox_CBox_A 的 IoU 都大于 0.5,那么就从候选列表中移除 Box_BBox_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 等。
非极大值抑制(NMS)算法 题目描述: 在计算机视觉的目标检测任务中,一个常见的步骤是生成大量的候选边界框(Bounding Boxes)。例如,使用滑动窗口或区域提议网络(RPN)时,模型可能会对同一个目标物体预测出多个位置和大小略有不同的边界框,并且每个边界框都带有一个置信度分数。非极大值抑制算法的目标就是从这些重叠的候选框中,筛选出最有可能代表真实目标的一个或少数几个最优的边界框,同时消除冗余的、重叠度高的重复检测框。简而言之,NMS 就是要“去粗取精”,保证对同一个物体我们只输出一个最可靠的检测结果。 解题过程: NMS 的核心思想非常直观: 在存在多个重叠的候选框时,只保留其中置信度最高的那一个,而抑制(即删除)所有其他与该高置信度框重叠度过高的框。 让我们一步步拆解这个算法的执行流程: 步骤 1:准备输入 假设我们有一组检测到的边界框集合 B ,以及每个边界框对应的置信度分数集合 S 。 每个边界框通常用其左上角和右下角的坐标表示,例如 (x1, y1, x2, y2) 。 我们还需要设定一个阈值,称为 交并比阈值(IoU Threshold) ,通常用 N_t 表示(例如, N_t = 0.5 )。这个阈值用于判断两个框是否“重叠度过高”。 步骤 2:按置信度排序 首先,我们将所有边界框按照它们的置信度分数 S 进行 降序排序 。这样,我们总是从最可信的检测结果开始处理。 步骤 3:初始化与迭代 选择当前最高分框 :从排序后的列表中,取出置信度最高的那个边界框(也就是列表的第一个框),将它从候选列表中移除,并添加到最终的“保留结果列表”中。 例如,首先选择 Box_A ,将其放入结果列表。 计算交并比(IoU) :将这个被选中的最高分框( Box_A )与 剩余的所有 候选框( Box_B , Box_C , Box_D , ...)逐一计算交并比(IoU)。 IoU 的计算公式 : IoU = (两个框的交集面积) / (两个框的并集面积) 。 IoU 的值在 0 到 1 之间。值越大,表示两个框的重叠程度越高。 抑制重叠框 :将剩余候选框中,与当前最高分框的 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 等。