NMS后处理相关
介绍
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素。在目标检测任务,例如行人检测中,滑动窗口经过特征提取和分类器识别后,每个窗口都会得到一个分数。但滑动窗口会导致很多窗口和其它窗口存在包含大部分交叉的情况。这个时候就需要用到NMS来选取那些邻域里分数最高,同时抑制那些分数低的窗口。
原理
在目标检测任务中,定义最后的候选框集合为$B$,每个候选框对应的置信度是$S$,IOU阈值设为$T$,然后NMS的算法过程可以表示如下:
选择具有最大score的候选框$M$
将$M$从集合$B$中移除并加入到最终的检测结果$D$中
将$B$中剩余检测框中和$M$的交并比(IOU)大于阈值$T$的框从$B$中移除
重复上面的步骤,直到$B$为空
代码实现
rgb大神实现Faster-RCNN中的单类别物体nms代码解释如下:
1 | -------------------------------------------------------- |
效果

Soft-NMS
上面说的NMS算法有一个缺点就是当两个候选框的重叠度很高时,NMS会将具有较低置信度的框去掉,也就是将其置信度变成0,如下图所示,红色框和绿色框是当前的检测结果,二者的得分分别是0.95和0.80。如果按照传统的NMS进行处理,首先选中得分最高的红色框,然后绿色框就会因为与之重叠面积过大而被删掉。

因此为了改善这个缺点,Soft-NMS被提出,核心思路就是不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。这个方法的论文地址为:https://arxiv.org/pdf/1704.04503.pdf 。算法伪代码如下:

正如作者所说,改一行代码就OK了。这里的$f$函数可以是线性函数,也可以是高斯函数。我们来对比一下:
线性函数:
高斯函数:
代码实现
作者的代码如下:
1 | def cpu_soft_nms(np.ndarray[float, ndim=2] boxes, float sigma=0.5, float Nt=0.3, float threshold=0.001, unsigned int method=0): |
效果

左边是使用了NMS的效果,右边是使用了Soft-NMS的效果
论文的实验结果

可以看到在MS-COCO数据集上mAP[0.5:0.95]可以获得大约1%的提升,如果应用到训练阶段的proposal选取过程理论上也能获得提升。顺便说一句,soft-NMS在不是基于Proposal的方法如SSD,YOLO中没什么提升。这里猜测原因可能是因为YOLO和SSD产生的框重叠率较低引起的。

