非极大值抑制(Non-maximum suppression, NMS)

       初次接触到非极大值抑制算法(Non-maximum suppression, NMS)是在CNN学习过程中,当时看到R-CNN   SP-NET中都用到了该方法作为最后确定目标bounding box 。常常经过图像定位算法或者深度网络学习得出的bounding box不止一个,各个box会出现重叠交叉,如图1。 为了精确的定位到目标的在图像的位置,常常有三种方法:

                【1】      选取好多候选框交集作为最后结果;

                【2】      选取好多矩形框的并集,即所有矩形框的最小外截矩作为目标区域。当然这里也不是只要相交就直接取并集,需要相交

                             的框满足交集占最小框的面积达到一定比例(也就是阈值)才合并;

                【3】      就是这里要说的非极大值抑制。

                                    


一维的非极大值抑制

     字面来看,非极大值抑制,也就是说我们感兴趣的是极大值。对的, NMS就是求局部极大值的方法。 在一维情况下,假设有数组I[1...N], 如果一个在i上的值满足I[i] >= I[i-1]  AND I[i]>=I[i+1] 则I[i]就是极大值点。一维数组的NMS算法伪代码如下:

                                    

             (1).   line 3-5  是对i是不是极大值的判定,也就是上面说的条件;

             (2).   line 7-9  在没满足3-4的条件时,则向数组更后面的元素进行判定。 如果line3的条件不满足,那么在经过line7对i重新赋值后,现在存的I[i]一定比I[i-1]大,所以只需要向

                        寻找I[i]>I[i+1]的值,也就是line8  AND后面的循环出口判断。 如果line4不满足条件,那么就是说I[i-1]>I[i]>I[i+1],在经过line8的AND判断条件和line10的判断,可以知道

                         如果line8的loop结束,i<=w-1的话,就找到了局部极大值,吐过i越界,则没找到,则进行下一轮的判断(line12)。这里的判断条件仔细想一下就很容易想清楚的 ^ - ^ !


目标检测中的NMS

        前面提到NMS在目标检测定位中主要是用来进行bounding box的大小位置判定,语言实在难以描述,我们先上代码:

     function picks = nms_multiclass(boxes, overlap)
     %%boxes为一个m*n的矩阵,其中m为boundingbox的个数,n的前4列为每个boundingbox的坐标,格式为
     %%(x1,y1,x2,y2);第5:n列为每一类的置信度。overlap为设定值,0.3,0.5 .....
     x1 = boxes(:,1);%所有boundingbox的x1坐标
     y1 = boxes(:,2);%所有boundingbox的y1坐标
     x2 = boxes(:,3);%所有boundingbox的x2坐标
     y2 = boxes(:,4);%所有boundingbox的y2坐标
     area = (x2-x1+1) .* (y2-y1+1); %每个%所有boundingbox的面积
     picks = cell(size(boxes, 2)-4, 1);%为每一类预定义一个将要保留的cell

 for iS = 5:size(boxes, 2)%每一类单独进行
    s = boxes(:,iS);
    [~, I] = sort(s);%置信度从低到高排序

    pick = s*0;
    counter = 1;
    while ~isempty(I)
      last = length(I);
      i = I(last);  
      pick(counter) = i;%无条件保留每类得分最高的boundingbox
      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;
      o = inter ./ (area(i) + area(I(1:last-1)) - inter);%计算得分最高的那个boundingbox和其余的boundingbox的交集面积
      I = I(o<=overlap);%保留交集小于一定阈值的boundingbox
    end

    pick = pick(1:(counter-1));
    picks{iS-4} = pick;%保留每一类的boundingbox
end

           输入中boxes是记录候选框的m*n矩阵,m是box的个数, n的前四列记录的是每个候选框的位置大小, 分别是box是的左上角和右下角坐标, [5:n]是每个框属于不同类别的置信度。 为了方便,这里我们假设n=5,前四列是坐标,第五列是置信度。所以boxes=[x1,y1,x2,y2,score]那么整个算法的流程:

       1.   先分别计算每个box的面积;

       2.   对置信度进行排序,每次选取置信度最大的box, 计算该box和其余boxes的交集inter,;

       3.   计算置信度最高的box和其他boxes交集与它们的面积比,如果大于预设的阈值,那么该次box讲不作为最后保留的区域。

       4    重复2-3, 最后保留的boxes进行并集操作。

【直观理解】 从只管上理解NMS在图像定位检测中,最后确定bounding box实际上是对这些boxes的交集进行判别,出掉那些已经显得不重要的boxes, 每次选取置信度最高的box,这很显然,你不可能放着更可靠的box不选,去选一个不怎么肯定的box啊,然后根据该box来判断其他boxes是否最为最后的保留区域。这一判定是根据次置信度boxes与最高置信度box的交集来判断, 如果该交集与这两个box的并集比例较大,则可以认为置信度高的box已经足够表示最后区域,那么与之相交的那个box则可以不作为最后区域,反之,则认为置信度最高的box相对两者的并集还不足够表征,则需要放入到最后的区域之中。


NMS在目标边缘的应用

       图像的边缘常常是灰度值跳跃比较大的地方,而这些跳跃比较大的区域常常范围是比较宽的,如果用这个比较宽泛的区域当做边缘,显然会有很大的不足,才用区域NMS,则可以讲边缘变成1-2像素的范围,这样的区域则足够精确。在计算边缘时,常常会考虑邻域范围内的像素,常是4N和8N。灰度值的变化可以用像素梯度来衡量。

                                                               

         如上图,蓝色的线是梯度方向,点C    dTmp1    dTmp2都用可能是局部极大值点,所以需要对这三个点进行判定,选出极大值点作为最后的边缘像素,C是已知的,dTmp1和dTmp2并不知道,常用的方法是采用插值算法求出两个点,在利用NMS算法选出最后的边缘点。当然,这样的边缘点难免会受噪声像素或其它情况干扰,所以在NMS算法后还应进行相应的处理。

        个人水平有限,理解方面难免有错误和不足,欢迎批评指正。


参考:

     http://blog.csdn.net/pb09013037/article/details/45477591

     http://www.cnblogs.com/liekkas0626/p/5219244.html

       https://www.zhihu.com/question/37172820

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值