soft NMS

部署运行你感兴趣的模型镜像

转自:https://www.sohu.com/a/135469270_642762

用一行代码提升目标检测准确率

论文摘要

非最大抑制(Non-maximum suppression, NMS)是物体检测流程中重要的组成部分。它首先基于物体检测分数产生检测框,分数最高的检测框M被选中,其他与被选中检测框有明显重叠的检测框被抑制。该过程被不断递归的应用于其余检测框。根据算法的设计,如果一个物体处于预设的重叠阈值之内,可能会导致检测不到该待检测物体。因此,我们提出了Soft-NMS算法,该连续函数对非最大检测框的检测分数进行衰减而非彻底移除。它仅需要对传统的NMS算法进行简单的改动且不增额外的参数。该Soft-NMS算法在标准数据集PASCAL VOC2007(较R-FCN和Faster-RCNN提升1.7%)和MS-COCO(较R-FCN提升1.3%,较Faster-RCNN提升1.1%)上均有提升。此外,Soft-NMS具有与传统NMS相同的算法复杂度,使用高效。Soft-NMS也不需要额外的训练,并易于实现,它可以轻松的被集成到任何物体检测流程中。Soft-NMS的源代码请参加Github: http://bit.ly/2nJLNMu.

NMS算法介绍

物体检测是计算机视觉领域的一个经典问题,它为特定类别的物体产生检测边框并对其分类打分。传统的物体检测流程常常采用多尺度滑动窗口,根据每个物体类别的前景/背景分数对每个窗口计算其特征。然而,相邻窗口往往具有相关的分数,这会增加检测结果的假阳性。为了避免这样的问题,人们会采用非最大抑制的方法对检测结果进行后续处理来得到最终的检测结果。目前为止,非最大抑制算法仍然是流行的物体检测处理算法并能有效的降低检测结果的假阳性。

在现有的物体检测框架(如图一所示)中,每一个检测框均会产生检测分数,那么对于图片中的一个物体可能对应多个检测分数。在这种情况下,除了最正确(检测分数最高)的一个检测框,其余的检测框均产生假阳性结果。非最大抑制算法针对特定物体类别分别设定重叠阈值来解决这个问题。

图一采用NMS的物体检测流程

传统的非最大抑制算法首先在被检测图片中产生一系列的检测框B以及对应的分数S。当选中最大分数的检测框M,它被从集合B中移出并放入最终检测结果集合D。于此同时,集合B中任何与检测框M的重叠部分大于重叠阈值Nt的检测框也将随之移除。非最大抑制算法中的最大问题就是它将相邻检测框的分数均强制归零。在这种情况下,如果一个真实物体在重叠区域出现,则将导致对该物体的检测失败并降低了算法的平均检测率(average precision, AP)。

换一种思路,如果我们只是通过一个基于与M重叠程度相关的函数来降低相邻检测框的分数而非彻底剔除。虽然分数被降低,但相邻的检测框仍在物体检测的序列中。图二中的实例可以说明这个问题。

图二被检测物体高度重叠时,被遮挡物体在不同检测算法下具有不同的检测分数

Soft-NMS可提升目标检测的平均准确率

针对NMS存在的这个问题,我们提出了一种新的Soft-NMS算法(图三),它只需改动一行代码即可有效改进传统贪心NMS算法。在该算法中,我们基于重叠部分的大小为相邻检测框设置一个衰减函数而非彻底将其分数置为零。简单来讲,如果一个检测框与M有大部分重叠,它会有很低的分数;而如果检测框与M只有小部分重叠,那么它的原有检测分数不会受太大影响。在标准数据集PASCAL VOC 和 MS-COCO等标准数据集上,Soft-NMS对现有物体检测算法在多个重叠物体检测的平均准确率有显著的提升。同时,Soft-NMS不需要额外的训练且易于实现,因此,它很容易被集成到当前的物体检测流程中。

图三 Soft-NMS伪代码,仅需将NMS代码(红色框)替换为Soft-NMS代码(绿色框)一步即可完成

传统的NMS处理方法可以通过以下的分数重置函数(Rescoring Function)来表达:

在这个公式中, NMS采用了硬阈值来判断相邻检测框是否保留。但是,换一种方法,假设我们对一个与M高度重叠的检测框bi的检测分数进行衰减,而非全部抑制。如果检测框bi中包含不同于M中的物体,那么在检测阈值比较低的情况下,该物体并不会错过检测。但是,如果bi中并不包含任何物体,即使在衰减过后,bi的分数仍然较高,它还是会产生一个假阳性的结果。因此,在使用NMS做物体检测处理的时候,需要注意以下几点:

  • 相邻检测框的检测分数应该被降低,从而减少假阳性结果,但是,衰减后的分数仍然应该比明显的假阳性结果要高。

  • 通过较低的NMS重叠阈值来移除所有相邻检测框并不是最优解,并且很容易导致错过被检测物体,特别是在物体高度重叠的地方

  • 当NMS采用一个较高的重叠阈值时,平均准确率可能会相应降低。

Soft-NMS中的分数重置函数

通过衰减与检测框M有重叠的相邻检测框的检测分数是对NMS算法的有效改进。越是与M高度重叠的检测框,越有可能出现假阳性结果,它们的分数衰减应该更严重。因此,我们对NMS原有的分数重置函数做如下改进:

当相邻检测框与M的重叠度超过重叠阈值Nt后,检测框的检测分数呈线性衰减。在这种情况下,与M相邻很近的检测框衰减程度很大,而远离M的检测框并不受影响。

但是,上述分数重置函数并不是一个连续函数,在重叠程度超过重叠阈值Nt时,该分数重置函数产生突变,从而可能导致检测结果序列产生大的变动,因此我们更希望找到一个连续的分数重置函数。它对没有重叠的检测框的原有检测分数不产生衰减,同时对高度重叠的检测框产生大的衰减。综合考虑这些因素,我们进一步对soft-NMS中的分数重置函数进行了改进:

在图三的Soft-NMS算法中,f(iou(M,bi))是基于检测框重叠程度的权重函数。算法中每一步的复杂度为O(N),N为图片中检测框的数量。对于N个检测框,Soft-NMS的算法复杂度为O(N2),与传统的贪心NMS算法相同。由于分数低于一个最小阈值的检测框会被直接剔除,因此NMS并不需要对所有检测框进行操作,计算量并不庞大,也不会减慢当前检测器的运行速度。

值得注意的是,soft-NMS也是一种贪心算法,并不能保证找到全局最优的检测框分数重置。但是,soft-NMS算法是一种更加通用的非最大抑制算法,传统的NMS算法可以看做是它的一个采用不连续二值权重函数的特例。除了以上这两种分数重置函数,我们也可以考虑开发其他包含更多参数的分数重置函数,比如Gompertz函数等。但是它们在完成分数重置的过程中增加了额外的参数。

实验数据分析

我们在两个标准数据集PASCAL VOC 和MS-COCO上分别进行实验。Pascal数据集有20种物体分类,MS-COCO数据集含有80种。我们在这里选择VOC 2007 测试集来衡量算法的性能。同时在MS-COCO中一个包含5000张图片的数据集上完成敏感度分析。此外,我们还在含有20288张图片的MS-COCO集上展示了结果。为了检验我们的算法,我们在两种现有的检测器faster-RCNN和R-FCN上完成实验。

在表一中,我们利用MS-COCO数据集,分别比较了R-FCN和Faster-RCNN算法在使用传统NMS和soft-NMS的情况下的性能。我们在线性权重函数中的Nt为0.3,高斯权重函数中Nt为0.5。可以很明显的看出,Soft-NMS在上述各种情况中均能提高算法性能,特别是在多物体重叠的情况下。例如,soft-NMS分别使R-FCN和faster-RCNN算法的平均准确率提升了1.3%和1.1%,在MS-COCO数据集中产生了显著的提升。值得强调的是,我们只需要对原有NMS算法做很小的改动便可获得如此的性能提升。同时,我们也在PASCAL数据集上做了相同的实验,在表二中,我们可以看到,使用Soft-NMS帮助Faster-RCNN和R-FCN的平均准确率均提升了1.7%。在此之后的实验,我们均采用高斯权重函数的soft-NMS。

在图四所示的实验中,我们可以看到应用soft-NMS的R-FCN算法在MS-COCO数据集每一类物体识别的准确率均有提升。其中,例如斑马,长颈鹿,绵羊,大象,马等动物类物体检测均有3%到6%的准确率提升。同时,对于面包机,球类,吹风机等很少多个物体同时出现的类别的物体,平均检测率提升不明显。总的来说,Soft-NMS在不影响运算速度的情况下,可以有效的提升物体检测的成功率。

图四应用于R-FCN(左)和Faster-RCNN(右)的Soft-NMS算法分类准确率提高

敏感度分析

由上述分析可知,使用Soft-NMS时需要设置参数,使用传统NMS需要设置参数Nt。为了对这些参数做敏感度分析,我们通过在MS-COCO数据上上不断改变这些参数的值去观察平均准确率的变化。如图五所示,对于两种检测器,平均准确率(AP)均在0.3-0.6之间稳定变化,然后在该范围之外明显降低。与传统NMS相比,soft-NMS在0.1-0.7的参数变化范围内有更好的性能。在0.4-0.7的参数范围内,使用soft-NMS的两种检测器的平均准确率均比传统NMS大约高1%。尽管在参数为0.6时soft-NMS具有更好的性能,但为了保证实验的一致性,我们均设置为0.5。

图五 R-FCN算法对于参数(Soft-NMS)和Nt(NMS)的敏感度分析

Soft-NMS的定位效果比传统NMS更精确

定位能力(LocalizationPerformance):单纯适用平均准确率很难表现出soft-NMS在物体检测性能上的显著提升。因此,我们需要在不同的重叠阈值下去计算传统NMS和soft-NMS的平均准确率。同时,我们也在实验中不断变化NMS和soft-NMS的参数值来对这两种算法有更深入的了解。在表三中,随着NMS重叠阈值Nt的提高,平均准确率降低。尽管在高度重叠(高Ot)的环境下,高重叠阈值Nt有相对好的表现,但是在低Ot环境下,高重叠阈值Nt导致平均准确率AP大幅下降。而soft-NMS 具有不同的特性,在高度重叠(高Ot)环境下取得的好性能在低重叠环境下仍能保持。对于不同的参数设置,soft-NMS均能取得比传统NMS更好的性能。同时,高可以在高度重叠环境下取得更大的性能提升。因此,相比于传统NMS,soft-NMS在物体检测中具有更好的定位效果:

Soft-NMS、NMS的准确度和检索率对比

最后,我们来观察在不同重叠阈值的下soft-NMS相对于NMS的性能提升。随着重叠阈值和检索率的提升,soft-NMS在准确率上有更大的提升。这是因为传统NMS对所有重叠区域的检测框检测分数均置零,从而错过了很多待识别物体并导致在高检索率的情况下准确率降低。Soft-NMS对相邻区域内的检测框的分数进行调整而非彻底抑制,从而提高了高检索率情况下的准确率。与此同时,由于在相邻区域彻底抑制的NMS在较高重叠环境下更容易错过待检测物体,soft-NMS在低检索率时仍能对物体检测性能有明显提升。

图六不同物体重叠程度(Ot)下准确度vs 检索率

定性分析

在图七中,我们对COCO验证集中的数据进行了定性分析。其中,我们采用R-FCN来检测图片中的物体,检测阈值为0.45。Soft-NMS在假阳性结果与真实被检测物体间有少量重叠时对检测结果有明显提升。以下图中8号为例,NMS中使用的一个涵盖多个人物的较宽的检测框在soft-NMS中被有效抑制,因为它与图中多个分数较高的检测框均有少量重叠,它的检测分数在分数重置函数的影响下会衰减很多,同样的情形也在9号图中出现。在1号的海滩场景中,soft-NMS使得女士包周围的较大的检测框被衰减到0.45以下,4号图中的假阳性结果也同样被有效抑制。同时,在2,5,7,13号图中的动物检测中,NMS对相邻检测框产生了过度抑制而soft-NMS通过衰减相邻检测框的检测分数来实现检测到更多在阈值0.45以上的正确结果。

图七实验结果定性分析,图片对中左图采用NMS算法,右图采用Soft-NMS算法。蓝线以上为检测成功实例,以下为失败实例。14号图检测物体为人,15号图检测物体为长椅,21号图检测物体为盆栽。

实验结论:Soft-NMS在目标检测中效率更高

本文提出了一种新的软权重非最大抑制算法。它通过提供一个基于检测框重叠程度和检测分数的函数来实现。作者在传统贪心NMS算法的基础上提出了两种改进函数并对其在两个现有检测数据集上进行了验证。通过分析,基于检测框重叠程度和检测分数的软权重函数可以有效提升物体检测的准确率。今后的工作可以考虑从学习更复杂的参数或非参数方程的角度展开。此外,针对物体检测的端到端的学习框架将是最理想的解决方案,它在生成检测框时无需考虑非最大抑制以及其中的检测分数和检测框位置等多种因素。

论文地址:https://arxiv.org/pdf/1704.04503.pdf

Github项目:https://github.com/bharatsingh430/soft-nms

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

06-05
### Soft NMS 算法在目标检测中的实现与应用 Soft NMS(Non-Maximum Suppression)是一种改进版的非极大值抑制算法,旨在解决传统 NMS 在处理重叠目标时过于激进的问题。传统 NMS 通过设定一个固定的阈值来筛选检测框,而 Soft NMS 则采用一种渐进的方式调整检测框的置信度分数[^1]。 #### Soft NMS 的基本原理 Soft NMS 的核心思想是根据检测框之间的重叠程度(IoU,Intersection over Union),动态地降低检测框的置信度分数,而不是直接移除重叠的框。具体而言,对于每个检测框 \( i \),其置信度分数 \( S_i \) 可以通过以下公式更新: \[ S_i = S_i \times e^{-\frac{(IoU_{ij})^2}{\sigma}} \] 其中: - \( IoU_{ij} \) 是检测框 \( i \) 和检测框 \( j \) 的交并比。 - \( \sigma \) 是一个控制衰减速度的超参数。 这种方式允许保留更多可能属于同一目标的检测框,从而提高检测精度。 #### Python 实现示例 以下是 Soft NMS 的一个简单实现示例: ```python import numpy as np def soft_nms(dets, sigma=0.5, Nt=0.3, threshold=0.001, method=1): """ :param dets: Nx5 数组,包含 N 个检测框 [x1, y1, x2, y2, score] :param sigma: 衰减因子 :param Nt: 重叠阈值 :param threshold: 最小置信度阈值 :param method: 方法选择 (1 - 线性,2 - 高斯) :return: 应用 Soft NMS 后的检测框 """ # 初始化变量 x1 = dets[:, 0] y1 = dets[:, 1] x2 = dets[:, 2] y2 = dets[:, 3] scores = dets[:, 4] areas = (x2 - x1 + 1) * (y2 - y1 + 1) order = scores.argsort()[::-1] keep = [] while order.size > 0: i = order[0] keep.append(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:]]) w = np.maximum(0.0, xx2 - xx1 + 1) h = np.maximum(0.0, yy2 - yy1 + 1) inter = w * h ovr = inter / (areas[i] + areas[order[1:]] - inter) if method == 1: # 线性方法 weight = np.ones_like(ovr) ind = np.where(ovr > Nt)[0] weight[ind] = 1 - ovr[ind] elif method == 2: # 高斯方法 weight = np.exp(-(ovr * ovr) / sigma) scores[order[1:]] *= weight inds = np.where(scores[order[1:]] > threshold)[0] order = order[inds + 1] return dets[keep] # 示例输入 dets = np.array([[100, 100, 210, 210, 0.9], [250, 250, 420, 420, 0.8], [200, 200, 320, 320, 0.7], [150, 150, 250, 250, 0.6]]) result = soft_nms(dets, method=2) print(result) ``` #### Soft NMS 的优势 相比传统的硬 NMSSoft NMS 的主要优势在于它能够更好地处理重叠目标,尤其是在目标密集或部分遮挡的情况下。通过平滑地降低置信度分数,Soft NMS 提供了更灵活的选择机制,从而提高了检测结果的质量[^1]。 #### 超参数的影响 - **\( \sigma \)**:控制高斯衰减的速度。较小的 \( \sigma \) 值会导致更快的衰减,而较大的值则会使衰减更加平缓。 - **\( Nt \)**:用于线性方法中的重叠阈值。当 IoU 超过此阈值时,置信度分数将被线性降低。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值