NMS 非极大值抑制

NMS 非极大值抑制


Reference:

  1. NMS——非极大值抑制
  2. 非极大值抑制(nonMaximumSuppression)

NMS(Non-maximum Suppression),即非极大值抑制,用以获取局部最大值,在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。

对于目标在图像中具体位置定位,不管是使用 滑动窗口(Sliding Window) 还是 选择性搜索(Slective Search) 方法,都会产生好多的候选区域。实际看到的情形就是好多区域的交叉重叠,难以满足实际的应用:
在这里插入图片描述针对这种问题有 3 3 3 种传统解决思路:

  1. 选取好多矩形框的交集,即公共区域作为最后的目标区域,如热图(Heat-map);
  2. 选取好多矩形框的并集,即所有矩形框的最小外截矩作为目标区域。当然这里也不是只要相交就直接取并集,需要相交的框满足交集占最小框的面积达到一定比例(也就是阈值)才合并;
  3. 也就是本文介绍的 NMS,简单的说,对于有相交的就选取其中置信度最高的一个作为最后结果,对于没相交的就直接保留下来,作为最后结果。

以下图人脸为例,同一个人可能会有好几个框,每一个框都带有一个分类器得分,这个得分通常是由检测框架得到的,比如 YOLO 的最终得分为分类得分和检测框得分的乘积。
在这里插入图片描述
我们的目标是一个人只保留一个最优的框,于是就要用到非极大值抑制,来抑制那些冗余的框:

  1. 将所有框的得分排序,选中最高分及其对应的框:
    在这里插入图片描述
  2. 遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除:
    在这里插入图片描述
  3. 从未处理的框中继续选一个得分最高的,重复上述过程:
    在这里插入图片描述

下面给出 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泠山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值