对于检测任务,NMS是一个必需的部件,其为对检测结果进行冗余去除操作的后处理算法。标准的NMS为手工设计的,基于一个固定的距离阈值进行贪婪聚类,(greedily accepting local maxima and discarding their neighbours)即贪婪地选取得分高的检测结果并删除那些超过阈值的相邻结果,使得在recall和precision之间取得权衡。之前的相关工作大多都是利用NMS作为后处理操作。
1、原理
对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空。
2、实现
在torchvision中已经集成了这个操作,所以我们也不需要自己去编写可以很轻松调用。
Soft-NMS来自ICCV 2017《Improving Object Detection With One Line of Code》,考虑因为在一些密集场景中NMS会直接将两个重叠度很高的GT直接去掉其中置信度较低的,这会带来漏检。为此的对其做出了改进。
1、原理
改进方法在于将置信度改为IoU的函数:f(IoU),具有较低的值而不至于从排序列表中删去。
时间复杂度同传统的greedy-NMS,为O(N2)。
对其原理做简单复述就是在做N^2次遍历时会将置信度较低的框的置信度用上式的高斯函数去做一个衰减,起到抑制作用,最后通过阈值来筛选置信度较高的结果。这样做虽然不至于直接去除了重叠的物体,但是在密集程度高的场景实际上还是很容易就直接将置信度衰减到很小造成漏检。
论文:https://arxiv.org/abs/1704.04503
实现可参考github:https://github.com/DocF/Soft-NMS
Weighted NMS出现于ICME Workshop 2017《Inception Single Shot MultiBox Detector for object detection》一文中。论文认为Traditional NMS每次迭代所选出的最大得分框未必是精确定位的,冗余框也有可能是定位良好的。那么与直接剔除机制不同,Weighted NMS顾名思义是对坐标加权平均,加权平均的对象包括 M 自身以及IoU≥NMS阈值的相邻框。
论文:https://ieeexplore.ieee.org/document/8026312/
DIOU-NMS来自于AAAI2020的《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》研究者认为若相邻框的中心点越靠近当前最大得分框 MMM 的中心点,则其更有可能是冗余框。也就是说,考虑IoU相同的情况,如下所示:
第一种相比于第三种越不太可能是冗余框。基于该观点,研究者使用所提出的DIoU替代IoU作为NMS的评判准则。
从直观的角度来说,加入了距离的信息有利于在密集的场景中做更好的nms。
论文:https://arxiv.org/abs/1911.08287
实现可参考github:https://github.com/Zzh-tju/DIoU
Cluster NMS来自于《Enhancing Geometric Factors in Model Learning and Inference for Object Detection and Instance Segmentation》研究者主要旨在弥补Fast NMS的性能下降,期望也利用pytorch的GPU矩阵运算进行NMS,但同时又使得性能保持与Traditional NMS相同,此外作者在这其中加入了很多其他的操作,如得分惩罚机制(SPM),加中心点距离(DIOU),框的加权平均法(Weighted NMS)
具体的数学推导可以参考论文和github上的代码,这里提出在实验中发现的一些有趣的问题,cluster NMS在使用的时候效果和torchvision中封装的NMS获得了相同的性能,其推理速度近乎一模一样,但是与用c编程的torchvision中的NMS相比,cluster NMS基于python的矩阵运算,更加容易阅读,在上面做出改进也更为简单。
理论上通过cluster分类可以减少迭代次数,提高整体的推理速度,尤其在一张图中实际检测目标越多的时候,但是由于目前这部分循环仍然用python进行编写,期待有工程加速的后续工作。
论文:https://arxiv.org/abs/2005.03572
实现可参考github:https://github.com/Zzh-tju/CIoU
ConvNMS来自ICLR 2016《A Convnet for Non-maximum Suppression》,其主要考虑IoU阈值设定得高一些,则可能抑制得不够充分,而将IoU阈值设定得低一些,又可能多个ture positive被merge到一起。其设计一个卷积网络组合具有不同overlap阈值的greedyNMS结果,通过学习的方法来获得最佳的输出。基础框架如下:
想通过网络学习来获得一种泛化性能,是一种不错的思路,但是对于不同的场景要能起到作用应该需要重新训练及调参。
论文:https://arxiv.org/pdf/1511.06437.pdf
Pure NMS Network来自于CVPR 2017的《Learning Non-Maximum Suppression》,考虑目标间具有高遮挡的密集场景,其提出一个新的网络架构来执行NMS。经分析,检测器对于每个目标仅产生一个检测结果有两个关键点是必要的,一是一个loss惩罚double detections以告诉检测器我们对于每个目标仅需一个检测结果,二是相邻检测结果的joint processing以使得检测器具有必要的信息来分辨一个目标是否被多次检测。论文提出Gnet,其为第一个“pure”NMS网络。Gnet图示如下:
从本质来看其实这个工作在于通过搭建网络来从检测的结果中来做二次打分,而且要使得这个二次打分的效果比传统的NMS的效果更佳。
论文:https://arxiv.org/abs/1705.02950
IoU-Net来自于ECCV 2018的《Acquisition of Localization Confidence for Accurate Object Detection》,它主要要解决的问题传统NMS确实定位置信度信息而带来的缺点:在抑制重复检测时,由于定位置信度的缺失,分类分数通常被用作给检测框排名的指标,这样是不准确的,会带来分类置信度和定位置信度不匹配的问题。所以文中提出了IOU-guided NMS,也就是在NMS阶段引入定位得分(localization confidence)作为排序指标而不是采用传统的分类得分。
网络结构如下:
和传统的NMS相比,这个方法实际上就是用网络预测的IOU替代了原来计算的IOU,作者认为通过上述网络训练出来的的IOU是包含了定位信息的,可以缓解冲突iou的定位信息确实问题。
论文:https://arxiv.org/abs/1807.11590
实现可参考github:https://github.com/vacancy/PreciseRoIPooling
Adaptive-NMS来自于CVPR2019的《Adaptive NMS: Refining Pedestrian Detection in a Crowd》,针对crowd中的行人检测这一特殊的应用场景,对Soft-NMS又进行了优化,使得在人群密集的地方,NMS阈值较大,而人群稀疏的地方NMS阈值较小。而如何来判定密集程度呢?是通过一个附属的网络来学习density,文中对训练集中的第i个物体处的密度定义如下:
网络结构如下:
通过学习获得一张图的密集表示,有了密度之后,对Greedy-NMS做了如下修改,通过密度值和阈值的对比来实时修改NMS的实现。
论文:https://arxiv.org/abs/1904.03629
参考文献:
【1】https://www.cnblogs.com/makefile/p/nms.html
【2】https://zhuanlan.zhihu.com/p/28129034
【3】https://blog.csdn.net/elaine_bao/article/details/50458463
【4】https://blog.csdn.net/qq_37014750/article/details/89222334
【5】https://blog.csdn.net/weixin_43900320/article/details/107329453
【6】https://blog.csdn.net/weixin_43900320/article/details/107048094