目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS

  • 1、NMS
  • 2、Soft-NMS
  • 3、Softer-NMS
  • 4、总结

1、NMS

非最大抑制(NMS)主要用于基于深度学习的目标检测模型输出的后处理,从而去除冗余的检测框,获得正确的检测结果。示意图如下:

算法流程:

  1. 将网络输出框集合 BBB 按照置信度分数 SSS 从高到低的顺序排序,定义 DDD 为最终检测框集合,NtN_tNt​ 为 NMSNMSNMS 阈值。
  2. 当 BBB 不为空集时:
    • mmm 为置信度分数最高的框,将 mmm 放入 DDD,并将它从 BBB 中删除
    • 对于 BBB 中余下的每个框 bib_ibi​:
      如果 iou(m,bi)≥Ntiou(m, b_i)\ge N_tiou(m,bi​)≥Nt​,则将 bib_ibi​ 从 BBB 中删除
  3. 返回检测结果 DDD

通过分析可以发现 NMSNMSNMS 存在以下几个缺陷:

  1. 稠密场景下漏检多:如下图 111 所示,当两个目标距离较近存在部分重叠时,置信度较小的目标漏检的可能性较大。
    图 1: 红色框的置信度比绿色框的置信度高,两个框重叠较多,NMS 会将绿色框过滤
  2. NMSNMSNMS 默认置信度分数较高的框,定位更精确,由于分类和回归任务没有直接相关性,因此这个条件并不总是成立。比如图 222 中,置信度分数高的边界框并不总是比置信度低的框更可靠。
    图 2: (a)(a)(a) 中两个边界框位置都不够精确;(b)(b)(b) 中置信度较高的边界框的左边界精确度较低
  3. GroundTruthGround~TruthGround Truth 的标注可能并不可靠。
    代码:
import numpy as npdef nms(dets, Nt):x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]order = scores.argsort()[::-1]#计算面积areas = (x2 - x1 + 1)*(y2 - y1 + 1)#保留最后需要保留的边框的索引keep = []while order.size > 0:# order[0]是目前置信度最大的,肯定保留i = order[0]keep.append(i)#计算窗口i与其他窗口的交叠的面积xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])#计算相交框的面积,不相交时用0代替w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * h#计算IOU:相交的面积/相并的面积ovr = inter / (areas[i] + areas[order[1:]] - inter)inds = np.where(ovr < thresh)[0]order = order[inds + 1]return keep# test
if __name__ == "__main__":dets = np.array([[30, 20, 230, 200, 1],[50, 50, 260, 220, 0.9],[210, 30, 420, 5, 0.8],[430, 280, 460, 360, 0.7]])thresh = 0.35keep_dets = nms(dets, thresh)print(keep_dets)print(dets[keep_dets])

时间复杂度:O(n2)O(n^2)O(n2),其中 nnn 为待筛选检测框数量


2、Soft-NMS

针对 NMSNMSNMS 存在的第一个问题,通过分析发现主要是因为在 NMSNMSNMS 算法中每次直接将与 mmm 的 iouiouiou 大于等于 NtN_tNt​ 的检测框直接删除导致的。 因此基于 NMSNMSNMS 算法,Soft−NMSSoft-NMSSoft−NMS 进行了如下改进:

将于 mmm 重叠的检测框置信度降低,而不是直接删除。

这样可能存在另一个问题,同一目标的其他检测框也可能被保留下来。因此需要设计合适的策略,既保留相近的其他目标,又删除重复检测的目标。直觉上可以发现通常重复的检测框具有更高的重叠,因此可以根据 iouiouiou 大小来设计置信度分数下降的程度。置信度修正策略如下:
si={si,iou⁡(M,bi)&lt;Ntsi(1−iou⁡(M,bi)),iou⁡(M,bi)≥Nts_{i}=\left\{\begin{array}{ll}{s_{i},} &amp; {\operatorname{iou}\left(\mathcal{M}, b_{i}\right)&lt;N_{t}} \\ {s_{i}\left(1-\operatorname{iou}\left(\mathcal{M}, b_{i}\right)\right),} &amp; {\operatorname{iou}\left(\mathcal{M}, b_{i}\right) \geq N_{t}}\end{array}\right. si​={si​,si​(1−iou(M,bi​)),​iou(M,bi​)<Nt​iou(M,bi​)≥Nt​​
该策略为 iouiouiou 的线性函数,同样可以使用高斯惩罚函数
si=si∗e−iou (M,bi)2σ,∀bi∉Ds_{i}=s_{i}*e^{-\frac{\mathrm{i} \text { ou }\left(\mathcal{M}, b_{i}\right)^{2}}{\sigma}}, \forall b_{i} \notin \mathcal{D} si​=si​∗e−σi ou (M,bi​)2​,∀bi​∈/​D
算法流程如下图所示:

图 3: 红色框中的代码是 NMS 的方法,绿色框中的代码为 Soft-NMS 的实现—NMS等价于Soft-NMS的特殊情况(使用0/1惩罚项代替线性或高斯惩罚函数)

代码:

# -*- coding:utf-8 -*-
import numpy as np
def py_cpu_softnms(dets, Nt=0.3, sigma=0.5, thresh=0.5, method=2):"""py_cpu_softnms:param dets:   boexs 坐标矩阵 format [x1, y1, x2, y2, score]:param Nt:     iou 交叠阈值:param sigma:  使用 gaussian 函数的方差:param thresh: 最后的分数阈值:param method: 使用的方法,1:线性惩罚;2:高斯惩罚;3:原始 NMS:return:       留下的 boxes 的 index"""N = dets.shape[0]# the order of boxes coordinate is [x1,y1,x2,y2]x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]areas = (x2 - x1 + 1) * (y2 - y1 + 1)for i in range(N):# intermediate parameters for later parameters exchangetB = dets[i, :4]ts = dets[i, 4]ta = areas[i]pos = i + 1if i != N-1:maxscore = np.max(dets[:, 4][pos:])maxpos = np.argmax(dets[:, 4][pos:])else:maxscore = dets[:, 4][-1]maxpos = -1if ts < maxscore:dets[i, :] = dets[maxpos + i + 1, :]dets[maxpos + i + 1, :4] = tBdets[:, 4][i] = dets[:, 4][maxpos + i + 1]dets[:, 4][maxpos + i + 1] = tsareas[i] = areas[maxpos + i + 1]areas[maxpos + i + 1] = ta# IoU calculatexx1 = np.maximum(dets[i, 0], dets[pos:, 0])yy1 = np.maximum(dets[i, 1], dets[pos:, 1])xx2 = np.minimum(dets[i, 2], dets[pos:, 2])yy2 = np.minimum(dets[i, 3], dets[pos:, 3])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (areas[i] + areas[pos:] - inter)# Three methods: 1.linear 2.gaussian 3.original NMSif method == 1:  # linearweight = np.ones(ovr.shape)weight[ovr > Nt] = weight[ovr > Nt] - ovr[ovr > Nt]elif method == 2:  # gaussianweight = np.exp(-(ovr * ovr) / sigma)else:  # original NMSweight = np.ones(ovr.shape)weight[ovr > Nt] = 0dets[:, 4][pos:] = weight * dets[:, 4][pos:]# select the boxes and keep the corresponding indexesinds = np.argwhere(dets[:, 4] > thresh)keep = inds.astype(int).T[0]return keep

算法时间复杂度:O(n2)O(n^2)O(n2),其中 nnn 为待筛选检测框数量

注意:

通过对比可以看出,原始 NMSNMSNMS 与 Soft−NMSSoft-NMSSoft−NMS 算法中的模式 333 等价,也就是说,删除 iouiouiou 过高的重叠框等价于将该重叠框置信度分数置 000 。


3、Softer-NMS

Soft−NMSSoft-NMSSoft−NMS 只解决了三个问题中的第一个问题。对于第二个问题,分类置信度分数和框的 iouiouiou 不是强相关,因此需要一种新的方法来衡量框的位置置信度

作者假设边界框的 444 个坐标值之间相互独立,并使用单变量高斯分布来预测位置置信度。
PΘ(x)=12πσ2e−(x−xe)22σ2P_{\Theta}(x)=\frac{1}{\sqrt{2 \pi \sigma^{2}}} e^{-\frac{\left(x-x_{e}\right)^{2}}{2 \sigma^{2}}} PΘ​(x)=2πσ2​1​e−2σ2(x−xe​)2​
其中 Θ\ThetaΘ 为可学习参数的集合,xex_exe​ 为被估计的边界框位置。标准差 σ\sigmaσ 衡量预测的不确定性,当 σ→0\sigma \rightarrow0σ→0 时,表示网络对预测的位置的置信度很高。

GTGTGT 边界框置信度也可以使用高斯分布来表示,当 σ→0\sigma \rightarrow0σ→0 时,变成 DiracdeltaDirac~deltaDirac delta 函数:
PD(x)=δ(x−xg)P_{D}(x)=\delta\left(x-x_{g}\right) PD​(x)=δ(x−xg​)
其中,xgx_gxg​ 为 GTGTGT 边界框位置。


KL 损失函数

目标定位的目标是估计参数 Θ^\hat{\Theta}Θ^,使 NNN 个样本的 PΘ(x)P_{\Theta}(x)PΘ​(x) 和 PD(x)P_{D}(x)PD​(x) 之间的 KLKLKL 散度最小。
Θ^=arg⁡min⁡Θ1N∑DKL(PD(x)∥PΘ(x))\hat{\Theta}=\underset{\Theta}{\arg \min } \frac{1}{N} \sum D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) Θ^=Θargmin​N1​∑DKL​(PD​(x)∥PΘ​(x))
使用 KLKLKL 散度作为回归损失函数,对于单个样本:
Lreg=DKL(PD(x)∥PΘ(x))=∫PD(x)log⁡PD(x)dx−∫PD(x)log⁡PΘ(x)dx=(xg−xe)22σ2+log⁡(σ2)2+log⁡(2π)2−H(PD(x))\begin{aligned} L_{r e g} &amp;=D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) \\ &amp;=\int P_{D}(x) \log P_{D}(x) \mathrm{d} x-\int P_{D}(x) \log P_{\Theta}(x) \mathrm{d} x \\ &amp;=\frac{\left(x_{g}-x_{e}\right)^{2}}{2 \sigma^{2}}+\frac{\log \left(\sigma^{2}\right)}{2}+\frac{\log (2 \pi)}{2}-H\left(P_{D}(x)\right) \end{aligned} Lreg​​=DKL​(PD​(x)∥PΘ​(x))=∫PD​(x)logPD​(x)dx−∫PD​(x)logPΘ​(x)dx=2σ2(xg​−xe​)2​+2log(σ2)​+2log(2π)​−H(PD​(x))​
分析可知,当 xex_exe​ 预测不准确时,网络预测更大的 σ2\sigma^2σ2 使 LregL_{reg}Lreg​ 更小。log(2π)2\frac{log(2\pi)}{2}2log(2π)​ 和 H(PD(x))H(P_D(x))H(PD​(x)) 与估计参数 Θ\ThetaΘ 无关,因此
Lreg∝(xg−xe)22σ2+12log⁡(σ2)L_{r e g} \propto \frac{\left(x_{g}-x_{e}\right)^{2}}{2 \sigma^{2}}+\frac{1}{2} \log \left(\sigma^{2}\right) Lreg​∝2σ2(xg​−xe​)2​+21​log(σ2)

图 4: 灰色曲线为估计的分布,橙色曲线为 GTGTGT 的 DiracdeltaDirac~deltaDirac delta 分布。当位置 xex_exe​ 估计不准确时,网络预测更大的 σ2\sigma^2σ2 使 LregL_{reg}Lreg​ 更小,蓝色曲线。

由于 σ\sigmaσ 位于分母,为了防止梯度爆炸,网络预测 α=log(σ2)\alpha=log(\sigma^2)α=log(σ2) 代替直接预测 σ\sigmaσ。
Lreg∝e−α2(xg−xe)2+12αL_{r e g} \propto \frac{e^{-\alpha}}{2}\left(x_{g}-x_{e}\right)^{2}+\frac{1}{2} \alpha Lreg​∝2e−α​(xg​−xe​)2+21​α
对于 ∣xg−xe∣&gt;1|x_g-x_e|&gt;1∣xg​−xe​∣>1 使用类似于 smoothL1smooth~L_1smooth L1​ 损失。
Lreg=e−α(∣xg−xe∣−12)+12αL_{r e g}=e^{-\alpha}\left(\left|x_{g}-x_{e}\right|-\frac{1}{2}\right)+\frac{1}{2} \alpha Lreg​=e−α(∣xg​−xe​∣−21​)+21​α


方差投票

获取预测框位置方差后,根据相邻边界框位置方差来对候选框投票。softer−NMSsofter-NMSsofter−NMS 算法如下。

图 5: Softer-NMS 算法。蓝色和绿色分别为 Soft−NMSSoft-NMSSoft−NMS 和 Softer−NMSSofter-NMSSofter−NMS
位置更新规则如下:
pi=e−(1−IoU(bi,b))2/σtx=∑ipixi/σx,i2∑ipi/σx,i2subject to IoU⁡(bi,b)&gt;0\begin{aligned} p_{i} &amp;=e^{-\left(1-I o U\left(b_{i}, b\right)\right)^{2} / \sigma_{t}} \\ x &amp;=\frac{\sum_{i} p_{i} x_{i} / \sigma_{x, i}^{2}}{\sum_{i} p_{i} / \sigma_{x, i}^{2}} \\ &amp; \text { subject to } \operatorname{IoU}\left(b_{i}, b\right)&gt;0 \end{aligned} pi​x​=e−(1−IoU(bi​,b))2/σt​=∑i​pi​/σx,i2​∑i​pi​xi​/σx,i2​​ subject to IoU(bi​,b)>0​

通过分析发现,有两类邻近框权重较低:

  1. 位置方差较大的检测框
  2. 和选中框的 iouiouiou 小的框

由于分类分数较低的框可能有较高的位置置信度,因此分类置信度不参与位置投票。


4、总结

本文主要介绍了 NMSNMSNMS、Soft−NMSSoft-NMSSoft−NMS 和 Softer−NMSSofter-NMSSofter−NMS 算法,及其主要改进的方向。

  1. NMSNMSNMS 主要用于去除重复的检测框。
  2. Soft−NMSSoft-NMSSoft−NMS 在 NMSNMSNMS 的基础上,不再直接去除重叠较高的检测框,而是将重叠的检测框的分类置信度分数降低。最终去除重复的检测框,而保留存在一定程度重叠的不同目标的检测框,该方法比较适用于稠密目标的检测。
  3. 在前两者的基础上,Softer−NMSSofter-NMSSofter−NMS 算法对检测框的位置概率分布进行建模。对于重叠的检测框,根据重叠程度和位置不确定性进行投票,重叠程度高,位置分布方差小的检测框权重大,从而获得更精确的检测框

目标检测(后处理):从 NMS 到 Soft-NMS 到 Softer NMS相关推荐

  1. 目标检测后处理:从nms到softer nms

    文章目录 1 NMS 1.1 动机 1.2 步骤 2 Soft-NMS 2.1 动机 2.2 算法思想 2.3 步骤 3 Softer-NMS 3.1 动机 3.1.1 现有方法的问题 3.1.2 本 ...

  2. 【目标检测】56、目标检测超详细介绍 | Anchor-free/Anchor-based/Backbone/Neck/Label-Assignment/NMS/数据增强

    文章目录 1.双阶段和单阶段目标检测器 1.1 双阶段目标检测器 1.1.1 R-CNN 1.1.2 SPP 1.1.3 Fast R-CNN 1.1.4 Faster R-CNN 1.2 单阶段目标 ...

  3. 传统目标检测后处理问题

    一.处理逻辑 背景建模得到前景 ----> 二值化标记 ---> 合并重叠框 由于二值化标记的局限,导致出现了很多的重叠框: 重叠框过多,在合并重叠框Merge这一步的时候举步维艰.时间消 ...

  4. 目标检测的Tricks | 【Trick9】nms非极大值抑制处理(包括变体merge-nms、and-nms、soft-nms、diou-nms等介绍)

    如有错误,恳请指出. 用这篇博客记录一下nms,也就是非极大值抑制处理,算是目标检测后处理的一个难点. 在训练阶段是不需要nms处理的,只有在验证或者是测试阶段才需要将预测结果进行非极大值抑制处理,来 ...

  5. 地平线机器人提出Anchor free、NMS free的3D目标检测算法 | CVPR2020 Workshop

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 这是一篇由地平线机器人发表在CVPR2020 Workshop的文章,主要是将Anchor Free的 ...

  6. 一文打尽目标检测NMS——效率提升篇

    在笔者上一篇文章<一文打尽目标检测NMS--精度提升篇>中,总结了近几年出现的一些可以提升NMS精度的方法.可以看到,NMS由于顺序处理的原因,运算效率较为低下.在笔者的实际项目中,NMS ...

  7. CVPR 2021 | 论文大盘点:3D目标检测

    作者丨我爱计算机视觉@知乎 来源丨https://zhuanlan.zhihu.com/p/389319123 编辑丨3D视觉工坊 本篇汇总 3D 目标检测相关论文,包含基于单目.基于深度图.基于激光 ...

  8. 基于python的HOG+SVM目标检测算法实现

    目录 一.场景需求解读 二.HOG算法简介 三.SVM算法简介 四.基于HOG的目标检测算法训练流程 五.目标检测代码实现 六.非极大值抑制(NMS)简介及代码实现 七.NMS效果展示与分析 八.思维 ...

  9. CVPR2022目标检测文章汇总+创新点简要分析

    大概总结了一下CVPR2022目标检测领域的文章,并未包括跨域和3D目标检测. 个人总结,难免有疏漏,大家参考一下就好. CVPR 2022 一.常规目标检测 1. MViTv2: Improved ...

  10. 万字长文详解目标检测算法,超大超全(2022最新)

    摘要 1 概述 2 目标检测回顾 2.1 two-stage 2.2 one-stage 3 目标检测配方 3.1 基础概念 3.1.1 损失函数 3.1.2 Anchor-based 和 Keypo ...

最新文章

  1. python进阶:switch语句、推导式与None类型
  2. 关于 \8 为56问题解答
  3. php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问
  4. ALIN10129-自查方案
  5. windbg调试HEAP
  6. ubuntu mysql数据储存在哪里_如何更改在Ubuntu下的MySQL数据库存储位置?
  7. 总结(5)--- Numpy和Pandas库常用函数
  8. 利用LFW对人脸识别模型进行精度评测
  9. IT项目实施管理办法
  10. Excel序号自动填充
  11. 新一代XSS平台(送邀请码)
  12. Python之温度换算
  13. 计算机408考试题库百度云,2017年计算机408考研真题.pdf
  14. logback 配置总结
  15. LuoguP1637 三元上升子序列
  16. Android破解过程-滚动的天空
  17. 前景好过富士康?苹果订单助台积电股价创新高
  18. 《深入分布式缓存:从原理到实践》
  19. 机器学习-Sklearn-02(随机森林)
  20. C++11 FAQ中文版

热门文章

  1. 如何在坐地铁的时候与别人拉开差距?
  2. 刀头剑首!产品经理是个危险的职业!
  3. python数字转换成中文大写_python初学者笔记(2):阿拉伯数字转换成中文大写
  4. veiw pad 7寸 android4.2,全国首款Android+Win7双系统平板电脑ViewPad 10登场
  5. 学习java过程之内部类
  6. 算法与数据结构实验题 7.4 玩游戏的亚索 (最小支撑树)
  7. 终极解决-office应用商店打不开!!!
  8. Ubuntu 10.04环境下载编译Android-2.2.1 (froyo) 源代码 1/2
  9. AOJ-proble-807
  10. 充电IC和电量计的驱动调试