NMS(非极大值抑制)

来源:互联网 发布:淘宝大学新手开店 编辑:程序博客网 时间:2024/05/12 06:37

NMS(非极大值抑制)

  • 作用
  • MATLAB实现

1、作用

在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余的框,找到最佳的物体检测的位置。在物体检测过程中,图片中的同一个物体,可能识别出来多个选框。这时需要使用非极大值抑制进行选优,去掉重复的框。

如下图所示是它的直观表达:

这里写图片描述

如上图所示,一共有5个识别为人的框,每一个框有一个置信率。 现在需要消除多余的:

1、首先按置信率排序: 0.98, 0.83, 0.0.81, 0.75, 0.67

2、取最大0.98的框为一个物体框

3、剩余4个框中,去掉与0.98框重叠率大于0.6(可以另行设置),则保留0.81, 0.67两个框

4、重复上面的步骤,直到没有框了,0.81为一个框

5、选出来的为: 0.98, 0.81

两个矩形框重叠率的计算方法:

这里写图片描述

如上图所示,矩形的左上角坐标为x1, y1, 右下角坐标为x2, y2,两个矩形的面积分别为A, B。

1、取两个矩形左上角坐标的最大值x1_max, y1_max

2、取两个矩形右下角坐标的最小值x2_min, y2_min

3、重叠区域的宽w为max(0, x2_min - x1_max),高h为max(0, y2_min - y1_max)

4、所以重叠率为:w×hA+Bw×h

2、MATLAB实现

%% NMS:non maximum suppressionfunction 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
0 0