问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

非极大值抑制(NMS)及其变体详解

创作时间:
作者:
@小白创作中心

非极大值抑制(NMS)及其变体详解

引用
CSDN
1.
https://blog.csdn.net/2401_89898861/article/details/145911797

非极大值抑制(NMS)是目标检测算法中的关键步骤,用于去除冗余预测框并保留高置信度的预测结果。本文将详细介绍NMS的基本原理、步骤以及具体实现方法。

非极大值抑制(NMS)及其变体

非极大值抑制(Non-Maximum Suppression, NMS)是目标检测算法中一个非常关键的步骤,常用于去除冗余的预测框,并且保留具有最高置信度的预测框。它通过抑制那些与其他框重叠度较高的低置信度框,来确保最终输出的框是最优的。

1. NMS(Non-Maximum Suppression)的定义

NMS 的基本思想是:对于每个目标类别的所有预测框,首先根据置信度对预测框进行排序,然后选出置信度最高的框,接着去掉与这个框重叠度(IoU)较高的框,最后继续选出下一个置信度最高的框,重复此过程,直到所有预测框都处理完。

NMS 的步骤

  1. 排序:根据框的置信度对预测框进行排序,从置信度最高的框开始。
  2. 选择:选择排序后的第一个框作为最终结果。
  3. 计算 IOU(Intersection over Union):计算当前框与所有其他框的 IOU 值。
  4. 抑制:如果当前框与其他框的 IOU 大于预设的阈值,则抑制该框(即删除)。
  5. 重复:重复上述步骤,直到所有框都被处理完。

NMS 算法公式

IoU (Intersection over Union):用于衡量两个矩形框的重叠度。公式如下:

其中:

  • Area of Intersection:两个框交集区域的面积。
  • Area of Union:两个框并集区域的面积。
  • 置信度:每个框都有一个置信度分数,代表该框是目标的可能性。

标准 NMS 伪代码

def nms(boxes, scores, iou_threshold):
    """
    :param boxes: 一个形状为 [N, 4] 的 numpy 数组,表示 N 个边界框 [x1, y1, x2, y2]。
    :param scores: 一个形状为 [N] 的 numpy 数组,表示每个框的置信度。
    :param iou_threshold: IoU 阈值,决定是否去除一个框。
    :return: 保留的边界框索引。
    """
    # 对预测框按置信度排序
    idxs = np.argsort(scores)[::-1]  # 降序排序,返回索引
    
    selected_boxes = []
    
    while len(idxs) > 0:
        # 选择置信度最高的框
        current_idx = idxs[0]
        selected_boxes.append(current_idx)
        
        # 计算剩余框与当前框的 IoU
        ious = compute_iou(boxes[current_idx], boxes[idxs[1:]])
        
        # 去除与当前框 IoU 大于阈值的框
        remaining_idx = np.where(ious <= iou_threshold)[0]
        
        # 更新索引
        idxs = idxs[remaining_idx + 1]
    
    return selected_boxes

def compute_iou(box1, boxes):
    """
    计算单个框与多个框的 IoU
    :param box1: 单个框 [x1, y1, x2, y2]
    :param boxes: 多个框的列表 [[x1, y1, x2, y2], ...]
    :return: IoU 数组
    """
    x1 = np.maximum(box1[0], boxes[:, 0])
    y1 = np.maximum(box1[1], boxes[:, 1])
    x2 = np.minimum(box1[2], boxes[:, 2])
    y2 = np.minimum(box1[3], boxes[:, 3])
    
    inter_area = np.maximum(0, x2 - x1) * np.maximum(0, y2 - y1)
    box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])
    boxes_area = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])
    
    union_area = box1_area + boxes_area - inter_area
    iou = inter_area / union_area
    
    return iou

代码说明

  • nms:该函数实现了标准的非极大值抑制算法。它接收预测框 boxes、对应的置信度 scores 以及 IoU 阈值 iou_threshold。最终返回保留的框的索引。
  • compute_iou:计算一个框与多个框之间的 IoU。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号