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论文链接:

arxiv.org/abs/1809.0854

Softer NMS论文代码:

github.com/yihui-he/sof

Weighted NMS论文链接:ieeexplore.ieee.org/doc

Adaptive NMS论文链接:

arxiv.org/abs/1904.0362


DIoU NMS

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


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

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

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

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


本文来源于公众号 CV技术指南 的技术总结系列。

欢迎关注公众号 CV技术指南 ,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读。

其它文章

计算机视觉中的自注意力

计算机视觉中论文创新的常见思路总结

归一化方法总结 | 又名“BN和它的后浪们“

资源分享 | 使用 FiftyOne 加快您的论文写作速度

经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷

名词解释 | 论文中的Ablation study

我们真的需要模型压缩吗

欠拟合与过拟合技术总结

人工智能会是泡沫吗?

如何看待计算机视觉未来的走向

池化技术总结

使用Dice loss实现清晰的边界检测

CNN结构演变总结(一)经典模型

CNN结构演变总结(二)轻量化模型

CNN结构演变总结(三)设计原则

CNN可视化技术总结(一)--特征图可视化

CNN可视化技术总结(二)--卷积核可视化

CNN可视化技术总结(三)--类可视化

CNN可视化技术总结(四)--可视化工具与项目

计算机视觉中的数据增强方法总结

计算机视觉中的特征金字塔技术总结

Siamese network总结

计算机视觉中的注意力机制技术总结

文字识别OCR开源框架的对比--Tesseract vs EasyOCR

计算机视觉专业术语总结(一)构建计算机视觉的知识体系

北京大学施柏鑫:从审稿人视角,谈谈怎么写一篇CVPR论文

归一化方法总结

计算机视觉的高效阅读英文文献方法总结

计算机视觉中的小样本学习综述

知识蒸馏的简要概述

损失函数技术总结

CVPR2021 | 开放世界的目标检测

CVPR2021|PVT--无卷积密集预测的多功能backbone

CVPR2021|特征金字塔的新方式YOLOF

CVPR2021 | 华为诺亚实验室提出Transformer in Transformer

CVPR2021| 继SE,CBAM后的一种新的注意力机制Coordinate Attention

经典论文系列 | 重新思考在ImageNet上的预训练

发布于 2021-07-24 14:16