论文链接: https://arxiv.org/abs/1704.04503
传统的NMS首先会对预测出来的bounding box进行排序,然后选择一个最大值与所设置的阈值进行比较,从而删除那些重叠度较高的bounding box。但是会有下图所示的问题:
传统的NMS会把相邻的检测框的置信度变为0。因此一个目标如果真的出现在重叠的阈值范围内,它很有可能被遗漏,导致一个精度的下降。
作者考虑如果我们降低检测的分数,而不是直接置为0,这个检测框依旧在排序的队列之中。也就是说,如果一个bounding box 与最大值的bounding box有很高的重叠度,它应该被赋予一个较低的值。如果它与最大值的bounding box有非常低的重叠度,它就维持原来的值。
传统的NMS:
s i = { s i , i o u ( M , b i ) < N t 0 , i o u ( M , b i ) ≥ N t s_i = \{ \begin{aligned} s_i, \quad iou(M,b_i) < N_t \\ 0, \quad iou(M,b_i) \geq N_t \end{aligned} si={si,iou(M,bi)<Nt0,iou(M,bi)≥Nt
N t N_t Nt是阈值, s i s_i si为分数, M M M是最大值。然而,NMS需要考虑下列条件:
因此作者重新设计rescoring function for Soft-NMS,如下:
s i = { s i , i o u ( M , b i ) < N t s i ( 1 − i o u ( M , b i ) ) , i o u ( M , b i ) ≥ N t s_i = \{ \begin{aligned} s_i, \quad iou(M,b_i) < N_t \\ s_i(1-iou(M,b_i)), \quad iou(M,b_i) \geq N_t \end{aligned} si={si,iou(M,bi)<Ntsi(1−iou(M,bi)),iou(M,bi)≥Nt
也就是说,如果大于NMS阈值的话,只是减少它的分数,而非置为0。作者更进一步考虑,如果这个penalty不是连续的,可能会导致检测框ranked list改变的很大。理想状态下应该是:如果没有重叠区域,应该是没有penalty的,反之,IoU越大,penalty越大。而且,如果IoU小,应该逐渐增大penalty。最后如果bounding box b i b_i bi与 M M M的IoU接近1, b i b_i bi应该有很大的penalty。
所以作者最后使用了Gaussian penalty。
s i = s i e − i o u ( M , b i ) 2 σ , ∀ b i ∉ D s_i = s_ie^{-\frac{iou(M,b_i)^2}{\sigma}}, \quad \forall b_i \notin D si=sie−σiou(M,bi)2,∀bi∈/D
σ \sigma σ在本论文中使用0.5。具体的伪代码如下:
Soft-NMS改进了传统的NMS算法,而没有增加额外的参数,容易拓展到其他检测网络中。