NMS 非极大值抑制 Python

本文深入探讨了非极大值抑制(NMS)的概念,它是计算机视觉领域目标检测中用于去除重复检测的重要技术。通过Python代码示例,详细解释了如何应用NMS来减少检测框的数量,同时保留关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#coding:utf-8  
import numpy as np  
#nms 非极大值抑制
#输入为bbox数据,包含[ymin,xmin,ymax,xmax];每个bbox的评分;每个bbox的标签,如果没有标签就注释掉
def py_cpu_nms(dets,socres,label, thresh=0.4):  
    x1 = dets[:, 0]  
    y1 = dets[:, 1]  
    x2 = dets[:, 2]  
    y2 = dets[:, 3]  
    scores = socres  #bbox打分
  
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)  
#打分从大到小排列,取index  
    order = scores.argsort()[::-1]  
#keep为最后保留的边框  
    keep = []  
    while order.size > 0:  
#order[0]是当前分数最大的窗口,肯定保留  
        i = order[0]  
        keep.append(i)  
#计算窗口i与其他所有窗口的交叠部分的面积
        xx1 = np.maximum(x1[i], x1[order[1:]])  
        yy1 = np.maximum(y1[i], y1[order[1:]])  
        xx2 = np.minimum(x2[i], x2[order[1:]])  
        yy2 = np.minimum(y2[i], y2[order[1:]])  
        
#         print xx1.shape
        
        w = np.maximum(0.0, xx2 - xx1 + 1)  
        h = np.maximum(0.0, yy2 - yy1 + 1)  
        inter = w * h  
#交/并得到iou值 
        ovr = inter / (areas[i] + areas[order[1:]] - inter)  
#         print ovr
        inds=[]
#         print label[0] 
        b=order[0]
#inds为所有与窗口i的iou值小于threshold值的窗口的index,其他窗口此次都被窗口i吸收
#只有在标签一致的情况下才会判断是否被窗口吸收,如果没有标签的话就使用下面注释的代码
        for j in range(len(order)-1):
            a=order[j+1]
            if label[a]==label[b]:
                if ovr[j]<=thresh:
                    inds.append(j+1) 
            else:
                inds.append(j+1)
#order里面只保留与窗口i交叠面积小于threshold的那些窗口,由于ovr长度比order长度少1(不包含i),所以inds+1对应到保留的窗口
        order = order[inds]  
    
#           inds = np.where(ovr <= thresh)[0]  
#           order = order[inds + 1]  


    return keep

 

 

 

 

<think>好的,用户现在问的是NMS非极大值抑制,需要我来详细解释一下。首先,我需要回想一下NMS的基本概念和作用。NMS全称是Non-Maximum Suppression,中文是非极大值抑制,主要用于目标检测中处理重叠的候选框,保留最合适的那个。用户之前已经问过深度学习中的CNN、RNN和GAN,可能现在在学习目标检测相关的内容,所以需要了解后处理技术中的NMS。 接下来,我得确定用户的背景和需求。用户可能是学生、研究者,或者刚入门深度学习的爱好者。他们可能已经了解目标检测的基本模型,比如YOLO或Faster R-CNN,但在实际应用中遇到了重复框的问题,所以想了解如何解决这个问题。这时候,NMS就是关键步骤之一。 需要解释NMS的原理,分步骤说明其流程。首先,目标检测模型会生成很多候选框,每个框都有置信度分数。这些框之间可能有大量重叠,尤其是当检测同一个物体时。NMS的作用就是筛选出最有可能正确的框,抑制掉其他重叠的框。 接下来要详细描述NMS的具体步骤。通常的步骤包括:根据置信度排序候选框,选择最高分的框,然后计算其他框与这个框的重叠程度(如IoU),如果超过设定的阈值,就抑制这些框。重复这个过程直到所有框都被处理。需要给出IoU的计算公式,以及NMS的伪代码或流程说明,这样用户能更直观地理解。 还要注意可能存在的问题,比如当两个物体靠得很近时,NMS可能会错误地抑制掉正确的框。这时候可能需要改进方法,比如Soft-NMS或其他的变体,可以简要提及这些改进,但不需要深入,因为用户可能只需要基础的理解。 另外,用户可能需要知道NMS的应用场景,比如在YOLO、Faster R-CNN等模型中的具体应用,这能帮助用户联系实际。同时,给出一个例子,比如检测图像中的多个物体时,NMS如何工作,会有助于理解。 需要检查是否需要使用LaTeX格式,用户之前的对话中有系统级指令,要求数学表达式用$...$,独立公式用$$...$$,所以IoU公式和NMS步骤中的计算需要用正确的格式。比如IoU的计算公式应该用$$包围,变量用斜体。 最后,确保回答结构清晰,分步骤说明,帮助用户逐步理解。可能的结构包括概述、原理、步骤、问题与改进、应用场景。同时,使用中文口语化的表达,避免过于学术化的术语,但保持准确性。 现在需要组织这些内容,先定义NMS,然后讲为什么需要它,接着详细步骤,可能的问题,改进方法,应用场景,最后总结。确保每个部分简洁明了,重点突出,符合用户的需求。同时,注意使用例子和公式来增强解释的清晰度。</think>以下是关于非极大值抑制NMS)的逐步解释: --- ### **1. NMS的作用** **非极大值抑制(Non-Maximum Suppression, NMS)** 是目标检测中的关键后处理技术,用于**消除冗余的检测框**。 - **问题背景**:目标检测模型(如YOLO、Faster R-CNN)会针对同一物体生成多个重叠的候选框(Bounding Box),需筛选出最准确的框。 - **核心目标**:保留置信度最高的框,抑制与其高度重叠的低置信度框。 --- ### **2. NMS的原理** #### **输入与输出** - **输入**:一组候选框及其置信度得分,例如: $$ \text{Boxes} = \{B_1, B_2, \dots, B_N\}, \quad \text{Scores} = \{s_1, s_2, \dots, s_N\} $$ - **输出**:筛选后无冗余的候选框集合。 #### **关键指标:IoU(交并比)** IoU(Intersection over Union)衡量两个框的重叠程度,计算公式为: $$ \text{IoU}(B_i, B_j) = \frac{\text{Area}(B_i \cap B_j)}{\text{Area}(B_i \cup B_j)} $$ 若IoU超过阈值(如0.5),则认为两框检测了同一物体。 --- ### **3. NMS的步骤** 1. **按置信度排序**:将所有候选框按置信度从高到低排序。 2. **迭代筛选**: - 选取当前最高得分的框,加入最终结果集。 - 计算该框与剩余所有框的IoU,**删除IoU超过阈值**的框。 3. **重复**:对剩余框重复步骤2,直至无候选框剩余。 #### **伪代码示例** ```python def NMS(boxes, scores, threshold): sorted_indices = sorted(range(len(scores)), key=lambda k: scores[k], reverse=True) selected = [] while sorted_indices: current = sorted_indices.pop(0) selected.append(current) # 计算当前框与剩余框的IoU to_remove = [] for idx in sorted_indices: if IoU(boxes[current], boxes[idx]) > threshold: to_remove.append(idx) # 删除重叠框 sorted_indices = [i for i in sorted_indices if i not in to_remove] return selected ``` --- ### **4. NMS的局限性及改进** #### **局限性** - **密集物体漏检**:若两个物体距离过近,IoU超过阈值时,正确框可能被误删。 - **阈值敏感**:阈值设置依赖经验,过高导致漏检,过低导致冗余。 #### **改进方法** - **Soft-NMS**:不直接删除重叠框,而是根据IoU降低其置信度。 - **DIoU-NMS**:考虑框中心点距离,优化IoU计算方式。 - **自适应阈值**:根据场景动态调整阈值。 --- ### **5. 应用场景** - **目标检测**:YOLO系列、Faster R-CNN等模型均依赖NMS后处理。 - **实例分割**:过滤重叠的掩膜区域。 - **关键点检测**:消除重复的关键点预测。 --- ### **示例说明** 假设检测到同一物体的三个框,置信度分别为0.9、0.8、0.7,IoU阈值设为0.5: 1. 保留0.9的框,删除与它IoU>0.5的框(假设0.8的框被删除)。 2. 剩余0.7的框若与0.9的框IoU≤0.5,则保留。 最终输出:**置信度0.9的框**和可能的**0.7的框**(若IoU未超阈值)。 --- ### **总结** NMS通过**抑制冗余检测框**,提升目标检测的精度与效率,但其性能受阈值和场景影响。改进算法(如Soft-NMS)可缓解密集场景的漏检问题,是实际工程中的重要优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值