Skip to content

非极大值抑制 NMS(non maximum suppression) #67

@SihangWu

Description

@SihangWu

非极大值抑制 NMS(non maximum suppression)

非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。

  • 在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余的框,找到最佳的物体检测的位置

1

  如上图中:同一个人可能有好几个框(每一个框都带有一个分类器得分),虽然几个框都检测到了人脸,但是不需要这么多的框,只要找到一个最能表达人脸的框。这时就需要用到NMS来选取那些邻域里分数最高,并且抑制那些分数低的窗口。


抑制的过程是一个迭代-遍历-消除的过程。

step 1:

将所有框的得分降序排列,选中最高分及其对应的框:

2


step2:

遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。

3

注释:

在目标检测的评价体系中,有一个参数叫做 IOU ,简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。具体我们可以简单的理解为: 即检测结果(DetectionResult)与 Ground Truth 的交集比上它们的并集,即为检测的准确率 IOU :

iou

如下图所示:
GT=GroundTruth;
DR=DetectionResult;
黄色边框框起来的是:GT⋂DR
绿色框框起来的是:GT⋃DR

iou1

iou2


step3:

从未处理的框中继续选一个得分最高的,重复上述过程。
4


下面给出MATLAB下的快速NMS代码,并带有详细的注释:

%% NMS:non maximum suppression
function pick = nms(boxes,threshold,type)
% boxes: m x 5,表示有m个框,5列分别是[x1 y1 x2 y2 score]
% threshold: IOU阈值
% type:IOU阈值的定义类型

    % 输入为空,则直接返回
    if isempty(boxes)
      pick = [];
      return;
    end

    % 依次取出左上角和右下角坐标以及分类器得分(置信度)
    x1 = boxes(:,1);
    y1 = boxes(:,2);
    x2 = boxes(:,3);
    y2 = boxes(:,4);
    s = boxes(:,5);

    % 计算每一个框的面积
    area = (x2-x1+1) .* (y2-y1+1);

    %将得分升序排列
    [vals, I] = sort(s);

    %初始化
    pick = s*0;
    counter = 1;

    % 循环直至所有框处理完成
    while ~isempty(I)
        last = length(I); %当前剩余框的数量
        i = I(last);%选中最后一个,即得分最高的框
        pick(counter) = i;
        counter = counter + 1;  

        %计算相交面积
        xx1 = max(x1(i), x1(I(1:last-1)));
        yy1 = max(y1(i), y1(I(1:last-1)));
        xx2 = min(x2(i), x2(I(1:last-1)));
        yy2 = min(y2(i), y2(I(1:last-1)));  
        w = max(0.0, xx2-xx1+1);
        h = max(0.0, yy2-yy1+1);
        inter = w.*h;

        %不同定义下的IOU
        if strcmp(type,'Min')
            %重叠面积与最小框面积的比值
            o = inter ./ min(area(i),area(I(1:last-1)));
        else
            %交集/并集
            o = inter ./ (area(i) + area(I(1:last-1)) - inter);
        end

        %保留所有重叠面积小于阈值的框,留作下次处理
        I = I(find(o<=threshold));
    end
    pick = pick(1:(counter-1));
end

一维,3邻域情况下的NMS即判断一维数组I[W]的元素Ii是否大于其左邻元素I[i-1]和右邻元素I[i+1],算法流程如下图所示:

nms

  • a. 算法流程3-5行判断当前元素是否大于其左邻与右邻元素,如符合条件,该元素即为极大值点。对于极大值点I[i],已知I[i]>I[i+1],故无需对i+1位置元素做进一步处理,直接跳至i+2位置,对应算法流程第12行。

  • b. 若元素I[i]不满足算法流程第3行判断条件,将其右邻I[i+1]作为极大值候选,对应算法流程第7行。采用单调递增的方式向右查找,直至找到满足I[i]>I[i+1]的元素,若i<=W-1,该点即为极大值点,对应算法流程第10-11行。


部分摘取
http://blog.csdn.net/shuzfan/article/details/52711706
http://blog.csdn.net/eddy_zheng/article/details/52126641

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions