首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >解释 NMS (Non Maximum Suppression) 算法的原理

解释 NMS (Non Maximum Suppression) 算法的原理

原创
作者头像
代码小李
发布2025-01-23 09:11:47
发布2025-01-23 09:11:47
5480
举报

NMS(Non-Maximum Suppression,非极大值抑制)是目标检测中常用的一种后处理技术,用于消除冗余的检测框,保留最有可能的检测结果。其主要目的是解决多个边界框重叠的问题,确保每个目标只有一个边界框。

NMS 的原理

  1. 输入:NMS 的输入是一组候选边界框及其对应的置信度分数(confidence scores)。每个边界框通常包含四个坐标值(x, y, w, h),表示边界框的中心点坐标、宽度和高度,或者左上角和右下角的坐标。
  2. 排序:首先根据置信度分数对所有候选边界框进行降序排序。置信度分数越高,表示该边界框越可能是真实的目标。
  3. 选择最高分的边界框:选择置信度分数最高的边界框作为当前的最佳检测框,并将其加入最终的检测结果列表中。
  4. 计算IoU:计算当前最佳检测框与剩余候选边界框之间的交并比(Intersection over Union, IoU)。IoU 是两个边界框交集面积与并集面积的比值,范围在0到1之间。
  5. 抑制重叠的边界框:设定一个阈值(例如0.5),如果某个候选边界框与当前最佳检测框的IoU大于这个阈值,则认为这两个边界框重叠过多,将该候选边界框从候选列表中移除。
  6. 重复步骤3-5:从剩余的候选边界框中再次选择置信度分数最高的边界框,重复上述过程,直到所有候选边界框都被处理完毕。

代码示例

以下是一个简单的 NMS 算法的 Python 实现:

代码语言:python
复制
def non_max_suppression(boxes, scores, iou_threshold):
    # boxes: (N, 4) array of [x1, y1, x2, y2] coordinates
    # scores: (N,) array of confidence scores
    # iou_threshold: IoU threshold for suppression

    # 获取按置信度分数降序排列的索引
    order = scores.argsort()[::-1]
    keep = []

    while order.size > 0:
        # 选择置信度分数最高的边界框
        i = order[0]
        keep.append(i)

        # 计算当前最佳检测框与其他候选框的IoU
        xx1 = np.maximum(boxes[i, 0], boxes[order[1:], 0])
        yy1 = np.maximum(boxes[i, 1], boxes[order[1:], 1])
        xx2 = np.minimum(boxes[i, 2], boxes[order[1:], 2])
        yy2 = np.minimum(boxes[i, 3], boxes[order[1:], 3])

        w = np.maximum(0.0, xx2 - xx1)
        h = np.maximum(0.0, yy2 - yy1)
        inter = w * h

        area = (boxes[order[1:], 2] - boxes[order[1:], 0]) * (boxes[order[1:], 3] - boxes[order[1:], 1])
        iou = inter / (area + (boxes[i, 2] - boxes[i, 0]) * (boxes[i, 3] - boxes[i, 1]) - inter)

        # 抑制IoU超过阈值的边界框
        inds = np.where(iou <= iou_threshold)[0]
        order = order[inds + 1]

    return keep

解释

  • boxes: 输入的候选边界框,形状为 (N, 4),其中 N 是候选框的数量,每个框包含4个坐标值。
  • scores: 每个候选框的置信度分数,形状为 (N,)。
  • iou_threshold: IoU 阈值,用于判断两个边界框是否重叠过多。
  • order: 按置信度分数降序排列的索引。
  • keep: 保存最终保留的边界框的索引。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NMS 的原理
  • 代码示例
  • 解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档