一、简介
NMS(Non Maximum Suppression),又名非极大值抑制,是目标检测框架中的后处理模块,主要用于删除高度冗余的bbox,无论是在Faster R-CNN还是SSD中都有应用,作用于提取的候选框上,来得到每一类目标置信度最高且无重叠的最终检测框输入到后面的网络中,能够有效地提升检测网络的准确率和速度。
但是传统的NMS存在一些局限性:
- 当两个目标框接近时,分数更低的框就会因为与分数更高的框重叠面积过大而被删掉,但其实两个框属于不同的目标。
- NMS虽然能够提升检测网络的速度,但由于本身的运算速度很慢,往往是检测网络提升速度的瓶颈所在。
所以在这个基础上提出了一些改进版本的NMS模块,能够有效地解决这些问题,有Soft NMS和Fast NMS等。
二、传统NMS模块
其实特别简单,就是从所有proposals中先选出一个得分最高的proposal,然后计算剩余的proposals与这个得分最高proposal的IOU,高于一定的阈值的就直接舍去,这样就剩下了与被选中的proposal重叠区域不多的proposals,再重复这个操作就行。
三、Soft NMS
论文:Improving Object Detection With One Line of Code(CVPR2017)
https://arxiv.org/pdf/1704.04503.pdf
代码:https://github.com/bharatsingh430/soft-nms
- 当两个目标框接近时,分数更低的框就会因为与分数更高的框重叠面积过大而被删掉,但其实两个框属于不同的目标。
提出的动机就是为了解决这个问题,将NMS算法中的直接舍去候选框改为降低候选框的置信度,从而再通过人为设置阈值来保留那些重叠面积大但不是属于同一个目标的框,原理如下图所示:
将传统方法的直接舍去改为将置信度乘以一个权重函数f,该权重函数与计算得到的iou相关,iou越高则对置信度的衰减越大,但不至于直接舍去,给了那些重叠区域大但是属于另一个目标的候选框一个机会。
![](https://img2018.cnblogs.com/blog/1665919/201906/1665919-20190618111824731-381804137.png)
改进效果:
如上图所示,可以检测出重叠区域很大的两个目标,所以提高了mAP,并且没有具有相同的算法复杂度,不会提高运算量。
改进细节:
权重函数一般有两种形式,线性加权和高斯加权
![](https://img2018.cnblogs.com/blog/1665919/201906/1665919-20190618112111402-1606279576.png)
![](https://img2018.cnblogs.com/blog/1665919/201906/1665919-20190618112129972-361344975.png)
可能的提升:
最后仍需要人为设置阈值来进行筛选,是否可以将这个阈值也设置为动态的来得到更加优秀的性能。
四、Fast NMS
论文:YOLACT: Real-time Instance Segmentation
https://arxiv.org/abs/1904.02689
代码:https://github.com/dbolya/yolact
- NMS虽然能够提升检测网络的速度,但由于本身的运算速度很慢,往往是检测网络提升速度的瓶颈所在。
主要是为了解决速度问题,先给出效果:
可以看出无论是在YOLACT上还是在Mask上都有12ms的提升,提升很大,而且性能没有明显降低,是一个比较理想的tradeoff。
原理(论文原文):
个人理解:
- 对每一类的得分前 n 名的框互相计算 IOU,得到 C*n*n 的矩阵X,其中的行列是根据置信度对每个类别的框进行了降序排列。
- 然后将 X 的下三角和对角区域设置为 0 实现。得到批量的上三角矩阵,之后保留每一列方向上的最大值,得到了每个检测器的最大 IOU 矩阵 K。得到每一列的最大值,由于是进行降序排列的,相当于是和传统方法中的从分数高迭代到分数低的是一样的操作,但是这样就可以转化为矩阵操作,速度会快很多,而且只对IOU最大值进行筛选,没有对所以IOU值进行筛选,也可以提高速度
- 最后,利用阈值 t(K<t)来处理矩阵,对每个类别保留最优的检测器,得到最终留下来的候选框。(处理细节有待研究)