非极大值抑制(Non-maximum Suppression)

本文详细介绍了非极大值抑制(NMS)在目标检测中的应用。NMS是一种通过筛选重叠候选区域来提高准确性的算法,确保仅保留最可信的目标框。文中还提供了MATLAB代码实现。

非极大值抑制NMS在目标检测,定位等领域是一种被广泛使用的方法。对于目标具体位置定位过程,不管是使用sw(sliding Window)还是ss(selective search)方法,都会产生好多的候选区域。实际看到的情形就是好多区域的交叉重叠,难以满足实际的应用。非极大值抑制是一个迭代-遍历-消除的过程。如图所示。



NMS简单来说就是对于有相交的就选取其中置信度最高的一个作为最后结果,对于没相交的就直接保留下来,作为最后结果。(中间有个阈值限定,来判断是否相交)

matlab代码实现:

function pick = nms(boxes, overlap)  
%boxes表示目标检测与定位时,产生多少个矩形框,通常是m*n列,m表示为矩形框的个数,n的前4列表示x1,y1,x2,y2,(x1,y1表示左上角坐标,x2,y2表示右下角坐标),后面的n-4列表示有n-4个特征的置信度 
%overlap为设定值,来表示是否相交
if isempty(boxes)  
  pick = [];  
else  
  x1 = boxes(:,1);          %所有候选框的左上角顶点x1   
  y1 = boxes(:,2);          %所有候选框的左上角顶点y1   
  x2 = boxes(:,3);          %所有候选框的右下角顶点x2   
  y2 = boxes(:,4);          %所有候选框的右下角顶点y2  
  s = boxes(:,5);           %所有候选框的置信度,可以包含1列或者多列,用于表示不同准则的置信度,在此只考虑一种  
  area = (x2-x1+1) .* (y2-y1+1);%所有候选框的面积(若对.*不理解,请查看我上一篇博客)  
  [vals, I] = sort(s);      %将所有候选框进行从小到大排序,vals为排序后结果,I为排序后标签  
  pick = s*0;
  count=1; 
  while ~isempty(I)  
    last = length(I);       %last代表标签I的长度,即最后一个元素的位置,(matlab矩阵从1开始计数)  
    i = I(last);            %所有候选框的中置信度最高的那个的标签赋值给i  
    pick(count) =i;       %将i存入pick中(即将置信度最高的索引值传输到pick)
    count+=1
    for pos = 1:last-1      %从1到倒数第二个进行循环  
      j = I(pos);           %得到pos位置的标签,赋值给j  
      xx1 = max(x1(i), x1(j));%左上角最大的x(求两个方框的公共区域)  
      yy1 = max(y1(i), y1(j));%左上角最大的y  
      xx2 = min(x2(i), x2(j));%右下角最小的x  
      yy2 = min(y2(i), y2(j));%右下角最小的y  
      w = xx2-xx1+1;          %公共区域的宽度  
      h = yy2-yy1+1;          %公共区域的高度  
      if w > 0 && h > 0     %w,h全部>0,证明2个候选框相交  
        o = w * h / area(j);%计算overlap比值,即交集占候选框j的面积比例  
        if o<overlap      %如果大于设置的阈值就去掉候选框j,因为候选框i的置信度最高  
           k=1;
	    I(k)=I(pos);
	    k+=1;
        end  
      end  
    end  
  end
  pick=pick(1:count-1)   
end  


<think>好的,我现在需要回答用户关于非极大值抑制(NMS)算法在后处理中的具体应用和实现步骤的问题。用户特别提到了NMS的后处理、实现过程和作用,我需要确保回答结构清晰,涵盖这些方面,并参考提供的引用资料。 首先,我得回顾NMS的基本原理。根据引用[4],NMS是抑制非极大值的元素,搜索局部极大值,常用于目标检测中处理重叠框。用户提供的引用[2]提到NMS在遮挡情况下的问题,而引用[3]则涉及YOLO中的应用。我需要整合这些信息。 接下来,作用部分。需要说明NMS的主要目的是消除冗余检测框,保留最佳结果。引用[2]和[4]都提到了这一点,尤其是处理滑动窗口产生的重叠框。这部分应该放在回答的前面,明确作用。 然后是具体应用场景。根据引用[3],YOLO中使用NMS处理检测结果,生成最终的边界框。引用[1]提到目标检测和边缘检测中的应用,可能需要提到这些例子,比如目标检测中的边界框抑制,边缘检测中的非极大值抑制。 实现步骤是关键部分。根据引用[4],步骤包括按置信度排序、选择最高分框、计算IOU、抑制重叠框,循环处理。需要详细描述每一步,可能结合引用中的例子,比如YOLOv9的处理过程(引用[3])。同时,引用[1]中的C++实现可以辅助说明步骤,但用户可能需要更通用的步骤而非代码细节。 还需要注意阈值的作用,如置信度阈值和IOU阈值,引用[3]提到阈值过滤,这也是实现步骤中的一部分。此外,用户的问题是关于后处理,所以需要强调NMS是在模型输出后的处理阶段应用,如引用[3]中YOLOv9的后处理。 可能还需要提到NMS的变体,比如Soft-NMS(引用[2]),但用户主要问的是基础实现,所以可以简要提及作为扩展,但重点在标准NMS。 最后,生成相关问题,需根据内容提出,比如步骤优化、不同方法的比较、参数影响等。 需要检查是否符合系统级指令:使用正确LaTeX格式,独立公式用$$,行内用$。例如,IOU的计算可能需要公式,但用户的问题中没有明确提到公式,所以可能不需要。如果有公式的话,用正确格式。 确保回答结构清晰,分点说明作用、应用、实现步骤,可能用序号或小标题。同时引用资料在适当位置标注,如[^1]、[^2]等。 现在组织内容: 1. 作用:消除冗余框,保留最佳检测结果,提升检测精度。[^4][^2] 2. 应用场景:目标检测后处理(YOLO[^3],C++实现[^1]),边缘检测中的特征点处理[^1] 3. 实现步骤: a. 按置信度排序 b. 选最高分框,加入结果集 c. 计算与其他框的IOU,超过阈值则抑制 d. 循环处理剩余框 e. 重复直至处理完所有框[^4][^3] 4. 参数:IOU阈值、置信度阈值的影响[^3][^4] 5. 问题与改进:遮挡情况下的问题,Soft-NMS[^2] 确保每个部分都有引用支持,自然添加引用标识。例如,在说明步骤时,提到YOLOv9的处理引用,或者在IOU计算时引用[^4]。 最后,生成相关问题,如优化方法、参数选择、与Soft-NMS比较等。</think>非极大值抑制(NMS)是目标检测后处理中的核心算法,主要用于消除冗余检测框并保留最佳结果。以下是其具体作用、应用场景和实现步骤的详细说明: --- ### **一、NMS的作用** 1. **消除冗余检测框**:在滑动窗口或密集预测模型中,同一目标可能生成多个重叠的边界框。NMS通过抑制低置信度的框,保留局部最高分的检测结果[^4]。 2. **提升检测精度**:避免重复检测导致的结果混乱,确保每个目标仅对应一个最优边界框[^2]。 --- ### **二、应用场景** 1. **目标检测后处理**:如YOLO系列模型对预测框进行筛选(例如YOLOv9处理后得到尺寸为$torch.Size([5, 6])$的张量)。 2. **边缘检测**:抑制非极大值点,保留边缘的清晰度[^1]。 3. **特征点匹配**:在特征描述子中筛选关键点。 --- ### **三、实现步骤** 1. **按置信度排序** 将所有检测框按置信度(score)从高到低排序,生成列表$B = \{b_1, b_2, ..., b_n\}$。 2. **初始化结果集** 创建空列表$keep$用于存储保留的检测框。 3. **迭代筛选过程** ```plaintext while B不为空: a. 选择B中最高分的框b_max,加入keep b. 计算b_max与B中剩余框的IOU(交并比) c. 从B中删除所有与b_max的IOU超过阈值(如0.5)的框 ``` **IOU计算公式**: $$ \text{IOU} = \frac{\text{Area}(b_{\text{max}} \cap b_i)}{\text{Area}(b_{\text{max}} \cup b_i)} $$ 若IOU > 阈值,则认为两框检测同一目标,需抑制低分框[^4][^3]。 4. **输出最终结果** 返回列表$keep$作为最终的检测框集合。 --- ### **四、关键参数与优化** - **IOU阈值**:通常设为0.3~0.7,值越大保留的框越多,反之越严格[^3]。 - **置信度阈值**:预过滤低置信度检测框,减少NMS计算量。 - **Soft-NMS改进**:通过降低重叠框的置信度而非直接删除,缓解目标遮挡导致的漏检问题[^2]。 --- ### **五、代码示例(Python伪代码)** ```python def nms(boxes, scores, iou_threshold=0.5): sorted_indices = sorted(range(len(scores)), key=lambda k: scores[k], reverse=True) keep = [] while sorted_indices: current = sorted_indices.pop(0) keep.append(current) # 计算IOU并筛选 sorted_indices = [i for i in sorted_indices if iou(boxes[current], boxes[i]) < iou_threshold] return keep ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值