zoukankan      html  css  js  c++  java
  • NMS总结

    导言:

        Non-Maximum Suppression(NMS)非极大值抑制,也有个别地方称之为非最大值抑制。个人认为前者更为贴切,因为其具体实现原理是找到所有局部最大值,并抑制非局部最大值,而不是找全局最大值,后文会介绍代码。从字面意思理解,抑制那些非极大值的元素,保留极大值元素。其主要用于目标检测,目标跟踪,3D重建,数据挖掘等。

        目前NMS常用的有标准NMS, Soft  NMS, DIOU NMS等。后续出现了新的Softer NMS,Weighted NMS等改进版。

    标准NMS

        标准NMS(左图1维,右图2维)算法伪代码如下:

    图片

    图片

    左边是只计算邻域范围为3的算法伪代码。

    实际应用

    图片

        以目标检测为例,目标检测推理过程中会产生很多检测框(A,B,C,D,E,F等),其中很多检测框都是检测同一个目标,但最终每个目标只需要一个检测框,NMS选择那个得分最高的检测框(假设是C),再将C与剩余框计算相应的IOU值,当IOU值超过所设定的阈值(普遍设置为0.5,目标检测中常设置为0.7,仅供参考),即对超过阈值的框进行抑制,抑制的做法是将检测框的得分设置为0,如此一轮过后,在剩下检测框中继续寻找得分最高的,再抑制与之IOU超过阈值的框,直到最后会保留几乎没有重叠的框。这样基本可以做到每个目标只剩下一个检测框。

    实现代码:(以pytorch为例)

    def NMS(boxes,scores, thresholds):
        x1 = boxes[:,0]
        y1 = boxes[:,1]
        x2 = boxes[:,2]
        y2 = boxes[:,3]
        areas = (x2-x1)*(y2-y1)
     
        _,order = scores.sort(0,descending=True)
        keep = []
        while order.numel() > 0:
            i = order[0]
            keep.append(i)
            if order.numel() == 1:
                break
            xx1 = x1[order[1:]].clamp(min=x1[i])
            yy1 = y1[order[1:]].clamp(min=y1[i])
            xx2 = x2[order[1:]].clamp(max=x2[i])
            yy2 = y2[order[1:]].clamp(max=y2[i])
     
            w = (xx2-xx1).clamp(min=0)
            h = (yy2-yy1).clamp(min=0)
            inter = w*h
     
            ovr = inter/(areas[i] + areas[order[1:]] - inter)
            ids = (ovr<=thresholds).nonzero().squeeze()
            if ids.numel() == 0:
                break
            order = order[ids+1]
        return torch.LongTensor(keep)
    

      

    根据前面对目标检测中NMS的算法描述,易得出标准NMS容易出现的几个问题:当阈值过小时,如下图所示,绿色框容易被抑制;当过大时,容易造成误检,即抑制效果不明显。因此,出现升级版soft NMS。

    图片

    Soft NMS

    Soft NMS算法伪代码如下:

    图片

    标准的NMS的抑制函数如下:

    图片

        

        IOU超过阈值的检测框的得分直接设置为0,而soft NMS主张将其得分进行惩罚衰减,有两种衰减方式,第一种惩罚函数如下:

    图片

        

        这种方式使用1-Iou与得分的乘积作为衰减后的值,但这种方式在略低于阈值和略高于阈值的部分,经过惩罚衰减函数后,很容易导致得分排序的顺序打乱,合理的惩罚函数应该是具有高iou的有高的惩罚,低iou的有低的惩罚,它们中间应该是逐渐过渡的。因此提出第二种高斯惩罚函数,具体如下:

    图片

        这样soft NMS可以避免阈值设置大小的问题。

    其他相关NMS

        为了避免阈值设置大小、目标太密集等问题,还有一些其他方法使用神经网络去实现NMS,但并不常用,这里只提一笔,感兴趣的读者请自行了解。如:

    ConvNMS:A Convnet for Non-maximum Suppression

    Pure NMS Network:Learning non-maximum suppression

    Yes-Net: An effective Detector Based on Global Information

        Soft NMS还有后续改进版Softer-NMS,其主要解决的问题是:当所有候选框都不够精确时该如何选择,当得分高的候选框并不更精确,更精确的候选框得分并不是最高时怎么选择 。论文值得一看,本文不作更多的详解。

     此外,针对这一阈值设置问题而提出的方式还有Weighted NMS和Adaptive NMS。

        Weighted NMS主要是对坐标进行加权平均,实现函数如下:

    图片

    其中Wi = Si *IoU(M,Bi),表示得分与IoU的乘积。

        Adaptive NMS在目标分布稀疏时使用小阈值,保证尽可能多地去除冗余框,在目标分布密集时采用大阈值,避免漏检。

    Softer NMS论文链接:

    https://arxiv.org/abs/1809.08545

    Softer NMS论文代码:

    https://github.com/yihui-he/softer-NMS

    Weighted NMS论文链接:https://ieeexplore.ieee.org/document/8026312/

    Adaptive NMS论文链接:

    https://arxiv.org/abs/1904.03629

    DIoU NMS

    图片

        当IoU相同时,如上图所示,当相邻框的中心点越靠近当前最大得分框的中心点,则可认为其更有可能是冗余框。第一种相比于第三种更不太可能是冗余框。因此,研究者使用所提出的DIoU替代IoU作为NMS的评判准则,公式如下:

    图片

        DIoU定义为DIoU=IoU-d²/c²,其中c和d的定义如下图所示

    图片

        在DIoU实际应用中还引入了参数β,用于控制对距离的惩罚程度。

    图片

        当 β趋向于无穷大时,DIoU退化为IoU,此时的DIoU-NMS与标准NMS效果相当。

        当 β趋向于0时,此时几乎所有中心点与得分最大的框的中心点不重合的框都被保留了。

    如有错误或疑问,欢迎留言指出。

    本文来源于微信公众号“ CV技术指南 ” 。更多内容与最新技术动态尽在公众号发布。

    欢迎扫描下方二维码关注公众号“CV技术指南”,主要进行计算机视觉方向的论文解读,最新技术跟踪,以及CV技术的总结。

    原创文章第一时间在公众号中更新,博客只在有空时间才更新少量公众号文章

  • 相关阅读:
    poj 3321 Apple Tree
    hdu 1520 Anniversary party
    Light OJ 1089 Points in Segments (II)
    Timus 1018 Binary Apple Tree
    zoj 3299 Fall the Brick
    HFUT 1287 法默尔的农场
    Codeforces 159C String Manipulation 1.0
    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
  • 原文地址:https://www.cnblogs.com/wxkang/p/14128379.html
Copyright © 2011-2022 走看看