NMS(非极大值抑制)

NMS(非极大值抑制)

  • 作用
  • MATLAB实现

1、作用

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

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

NMS(非极大值抑制)_第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

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

NMS(非极大值抑制)_第2张图片

如上图所示,矩形的左上角坐标为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 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

你可能感兴趣的:(机器学习,NMS,非极大值抑制)