YOLOv4的Tricks解读三--- 目标检测后处理(Soft-NMS/DIoU-NMS)


YOLOv4中采用了DIoU-NMS 非极值抑制方法,本文就YOLOv4中涉及的Soft-NMS和DIoU-NMS方法做解读学习。

Soft-NMS

论文:https://arxiv.org/abs/1704.04503
代码:https://github.com/bharatsingh430/soft-nms
Pytorch版本:https://github.com/DocF/Soft-NMS

NMS是目标检测中必备的后处理步骤,目的是用来去除重复框,留下最准确的box,如下图所示。
在这里插入图片描述

NMS的伪代码算法流程如下:
在这里插入图片描述
其中B是预测的框list,S是对应预测box的score分数list,N_t是IoU阈值。

  • 找出score分数最高的M
  • 将M从B中删除
  • 将删除的M添加进最后的集合D(D和M合并)
  • 将B中所有的box与M进行IoU计算,删除B中 IoU > N_t的所有对应box
  • 重复上面的步骤

最后D中的框就是保留下来的。s_i可表述为:
在这里插入图片描述
在最后留下的框中,删除掉低于score阈值的框,剩下的就是最终的预测框了。

可以看到,NMS的处理方法过于粗暴,即将与M的IoU大于某个阈值的box直接置其score为0,这不是抹掉了这个box框柱其它物体的可能性了吗(漏检,召回率低)?

那能不能温柔一点,不是直接置0而是降低分数呢?
Soft-NMS即是这样的操作。Soft-NMS的伪代码流程如下:
在这里插入图片描述

可以看到,Soft-NMS与传统NMS的区别在于对score分数调整的处理。如果是传统的NMS操作,那么当B中的b_i和M的IoU值大于阈值N_t,那么就从B和S中去除该box;对于Soft-NMS而言是先计算M与b_i的IoU,然后IoU经过一个函数输出最后与s_i相乘最终得到box的分数。

其中s_i的score遵循IoU越大,分数越低的原则(IoU越大,越可能是背景),所以s_i定义如下:
在这里插入图片描述
考虑到上式是不连续的,并且当达到N_t的NMS阈值时会施加突然的惩罚, 如果惩罚函数是连续的,那将是理想的,否则它可能导致检测结果的排序列表的突然改变(集合D中的score出现断层跳跃现象)。所以s_i的更新公式修改为如下:
在这里插入图片描述
这样就避免了检测结果中的score会出现突然间的跳跃现象。

参考:
https://blog.csdn.net/Gentleman_Qin/article/details/84448155
https://arxiv.org/pdf/1704.04503.pdf

DIoU-NMS

论文:https://arxiv.org/pdf/1911.08287.pdf
代码:https://github.com/Zzh-tju/DIoU-darknet

DIoU-NMS需要了解DIoU,它两在同一篇论文被提出,关于DIoU知识请移步:目标检测中的回归损失函数系列四:DIoU Loss / CIoU Loss

在传统NMS中,IoU指标常用于抑制冗余检测盒,其中重叠区域是唯一因素,对于遮挡情况经常产生错误抑制。 DIoU-NMS将DIoU作为NMS的准则,因为在抑制准则中不仅应考虑重叠区域,而且还应考虑两个box之间的中心点距离,而DIoU就是同时考虑了重叠区域和两个box的中心距离。 对于score最高的预测box M,可以将DIoU-NMS的s_i更新公式正式定义为:
在这里插入图片描述
其中通过同时考虑IoU和两个box的中心点之间的距离来删除box B_i,s_i是分类得分,ε是NMS阈值。DIoU-NMS建议两个中心点较远的box可能位于不同的对象上,不应将其删除(这就是DIoU-NMS的与NMS的最大不同之处)

在这里插入图片描述
如图所示,对于每个阈值,DIoU-NMS都比传统NMS更好。 此外,值得注意的是,即使DIoU-NMS的性能最差,也至少可以与原始NMS的性能相媲美或更好。 也就是说,即使不小心调整阈值ε,DIoU-NMS通常也可以比原始NMS更好(最差的也比你最好的好)。
参考:
https://blog.csdn.net/c2250645962/article/details/106071294
https://cloud.tencent.com/developer/article/1596428

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章