【目标检测】32、让你一文看懂且看全 NMS 及其变体

2023-11-19


本博客还有多个超详细综述,感兴趣的朋友可以移步:

卷积神经网络:卷积神经网络超详细介绍

目标检测:目标检测超详细介绍

语义分割:语义分割超详细介绍

NMS:让你一文看懂且看全 NMS 及其变体

数据增强:一文看懂计算机视觉中的数据增强

损失函数:分类检测分割中的损失函数和评价指标

Transformer:A Survey of Visual Transformers

机器学习实战系列:决策树

YOLO 系列:v1v2v3v4scaled-v4v5v6v7yolofyoloxyolosyolop


一、NMS

1.1 背景

NMS 及其变体在边缘检测、关键点检测和目标检测等视觉任务上都有广泛的使用。主要用于剔除和极大值重叠率过大的检测结果。

使用场景:

  • 测试
  • 推理

分类:

  • 类内 NMS
  • 类间 NMS

1.2 方法

  • 对单张图中的所有检出框按照得分排序(此处说的是类间 NMS,类内的则在每个类内进行操作)
  • 以最高得分的框为基准,计算所有框和其 IoU 得分
  • 如果某个框和最高得分框的 IoU > 阈值,则将该框类别得分置为 0,即直接剔除该框
  • 在剩下的框中再选择得分最高的框,重复进行这种剔除,直到全部结束

在这里插入图片描述

1.3 代码

import numpy as np

def 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.35
    keep_dets = nms(dets, thresh)
    print(keep_dets)
    print(dets[keep_dets])

1.4 不足

1、稠密场景会出现漏检:因为稠密场景的目标本身重合就比较大,会把置信度较小但为真实目标的框筛掉
2、实际效果容易被阈值影响:NMS 的阈值是人为设定的,阈值过大会出现误删,阈值过小会出现误检,对 mAP 有很大影响。
3、分类得分和 IoU 的割裂使用,盲目认为得分最大的框的定位也是最准确的,忽略了得分低的框的定位也可能是准确的

二、Soft NMS

论文:Soft-NMS:Improving Object Detection With One Line of Code

代码:http://bit.ly/2nJLNMu

出处:ICCV2017

2.1 背景

由于 NMS 的剔除方法过于暴力,可能剔除掉真正定位准确的框,导致保留的框不准确或漏检的问题,如图 1 所示。故此,作者提出了 soft-NMS,不直接删除 IoU 大于阈值的框,而是降低其分类得分,用以缓解漏检的情况。

在这里插入图片描述

2.2 方法

NMS 的处理方法:

在这里插入图片描述
Soft NMS 的处理方法:

首先选择得分最大的框 M,并计算所有框和 M 的 IoU,对于 IoU>阈值的框,将其分类得分适当降低,而非直接剔除,来避免漏检的情况。

具体是如何降低得分的呢(只降低 IoU > 阈值的框的得分):

  • 对于 IoU 越大的框,得分降低的越多
  • 对于 IoU 越小的框,得分降低的越少

为什么这样降低:

  • 当一个框和 M 的 IoU 越大的时候(如0.9),那么它们越有可能属于同一目标,越应该被剔除,而 soft NMS 是狠狠的降低其分类得分
  • 当一个框和 M 的 IoU 不是很大的时候(如0.7),那么它们越有可能不属于同一目标,可能是相邻很近的互相遮挡的不同目标,越不应该将其剔除,所以 soft NMS 稍微降低了其分类得分

从下面的公式来分析:

  • 当 IoU 越大,(1-IoU) 越小,则和 s i s_i si 相乘后越小,修正后的分类得分越小
  • 反之亦然

第一种加权方式:线性加权

在这里插入图片描述

但上面的公式在阈值 N t N_t Nt 处是不连续的,所以作者使用高斯惩罚函数,为什么是不连续的:

  • 其实 IoU 可以看做是一个惩罚项,当 IoU 阈值很小,且 IoU 很小甚至没有重叠的时候,惩罚项很小。但当 IoU 很大的时候,惩罚项也就会很大。
  • 所以,需要一个可以缓冲的函数,让 M 对其他框的得分的影响是逐步变化的,对 IoU 很小的框影响很小。

所以作者使用高斯的方式来对得分进行修正:

第二种加权方式:高斯加权:

在这里插入图片描述

  • iou 越大,加权值越小,修正后的得分降低的越多
  • iou 越小,加权值越大,修正后的得分降低的越少

在这里插入图片描述

作者经过实验证明,高斯加权的方式更优,所以使用了高斯加权的方式。

Soft NMS 的过程如下:

其中, f ( i o u ( M , b i ) ) f(iou(M, b_i)) f(iou(M,bi)) 是基于重叠率的加权函数。

在这里插入图片描述

2.3 效果

Soft-NMS 的超参数设置:

  • 在使用线性加权时,设定 IoU 阈值 N t = 0.3 N_t=0.3 Nt=0.3
  • 在使用高斯加权时,设定高斯函数的 δ = 0.5 \delta=0.5 δ=0.5 δ \delta δ 越大,开口越大, δ \delta δ 越小,开口越小

在这里插入图片描述
在这里插入图片描述

2.4 代码

# -*- 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 exchange
        tB = dets[i, :4]
        ts = dets[i, 4]
        ta = areas[i]
        pos = i + 1

        if i != N-1:
            maxscore = np.max(dets[:, 4][pos:])
            maxpos = np.argmax(dets[:, 4][pos:])
        else:
            maxscore = dets[:, 4][-1]
            maxpos = -1

        if ts < maxscore:
            dets[i, :] = dets[maxpos + i + 1, :]
            dets[maxpos + i + 1, :4] = tB

            dets[:, 4][i] = dets[:, 4][maxpos + i + 1]
            dets[:, 4][maxpos + i + 1] = ts

            areas[i] = areas[maxpos + i + 1]
            areas[maxpos + i + 1] = ta

        # IoU calculate
        xx1 = 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 * h
        ovr = inter / (areas[i] + areas[pos:] - inter)
        
        # Three methods: 1.linear 2.gaussian 3.original NMS
        if method == 1:  # linear
            weight = np.ones(ovr.shape)
            weight[ovr > Nt] = weight[ovr > Nt] - ovr[ovr > Nt]
        elif method == 2:  # gaussian
            weight = np.exp(-(ovr * ovr) / sigma)
        else:  # original NMS
            weight = np.ones(ovr.shape)
            weight[ovr > Nt] = 0

        dets[:, 4][pos:] = weight * dets[:, 4][pos:]

    # select the boxes and keep the corresponding indexes
    inds = np.argwhere(dets[:, 4] > thresh)
    keep = inds.astype(int).T[0]

    return keep

2.5 不足

优势:

  • 相比 NMS,提升了 recall
  • 缓解了重叠目标的漏检情况

不足:

  • 仍然需要手工选取的阈值/高斯方差

三、Softer NMS

论文:Bounding Box Regression with Uncertainty for Accurate Object Detection

代码:https://github.com/yihui-he/KL-Loss

出处:CVPR2019

3.1 背景

由于 NMS 的三个问题:

  • 密集场景漏检多
  • 使用分类得分来判定一个框的定位效果,原理上是未对齐的
  • 标注框并非总是准确的

soft NMS 通过降低距离近的框的得分,而非直接剔除该框的方法,缓解了第一个问题,所以 Softer NMS 被提出,以 “标注框并非准确,会有一定不确定性” 为前提,来通过定位的方差投票来进行位置修正。

3.2 方法

Softer NMS = soft NMS + variance voting

1、针对边分布不确定性问题:使用高斯分布来表示框的每个边的位置,使用 KL-Loss 来学习位置的分布(这个分布就包括位置可不确定性——即方差)

为了通过位置来估计出位置得分,本文的网络会预测一个概率分布,而非 bbox 的位置。

预测的概率分布简化为一个高斯分布:

在这里插入图片描述

其中:

  • Θ \Theta Θ 是可学习的参数
  • x e x_e xe 是估计的 bbox 位置
  • σ \sigma σ 为标准差,也表示了不确定性, σ → 0 \sigma \to 0 σ0,说明网络预测的位置越准确,置信度越高。

真实的位置也可以被建模为一个特殊的高斯分布, σ → 0 \sigma \to 0 σ0, 就是 Dirac delta 分布:

在这里插入图片描述

其中: x g x_g xg 是 bbox 的真实位置

Dirac delta 分布: 在 0 处无限大,在其他位置为 0

特性: ∫ δ ( x ) d x = 1 \int \delta(x)dx=1 δ(x)dx=1

在这里插入图片描述

  • 橘色为真值
  • 灰色预测较准,方差较小,位置距离真值的位置较近
  • 蓝色预测较差,方差较大,位置距离真值的位置较远

KL Loss 如何计算:

上面将预测结果和真实label建模后,就可以使用 N 个采样点来估计出参数 Θ ^ \hat{\Theta} Θ^,最小化预测和真实分布的 KL 距离:

在这里插入图片描述

KL 散度是用于框位置的回归的:

在这里插入图片描述

当网络预测一个较大的方差 σ 2 \sigma^2 σ2 时, L r e g L_{reg} Lreg 会很小,位置 x e x_e xe 的估计会更准确。如上图 4 所示。

由于 L r e g L_{reg} Lreg 不依赖于后两项,则有如下规律:

在这里插入图片描述

σ = 1 \sigma=1 σ=1 时,KL loss 演变成一个规范的 Euclidean loss:

在这里插入图片描述

该 loss 函数是和估计的位置和位置标准差相关的:

在这里插入图片描述

由于 σ \sigma σ 是分母,所以在刚开始训练的时候可能会梯度爆炸,为了避免,作者使用 α = l o g ( σ 2 ) \alpha = log(\sigma^2) α=log(σ2) 而非 α = σ \alpha=\sigma α=σ

在这里插入图片描述

∥ x g − x e ∥ > 1 \|x_g-x_e\|>1 xgxe>1 时,使用的函数类似于 smooth L1 loss:

在这里插入图片描述

在开始训练的时候,使用随机高斯来初始化 FC 层参数,标准差设置为 0.0001,均值设置为 0,此时 KL loss 和 smooth L1 loss 类似。

KL loss 的三个优势:

  • 能够很好的捕捉数据集中的不确定性: bbox 回归器能从不确定的 bbox 中拿到很小的 loss
  • 学习到的方差在后处理中很有用:作者提出了方差投票(variance voting),在 NMS 的时候,使用该预测出来的方差来给其邻域的位置加权,来给候选框投票
  • 学习到的概率分布是可解释的:因为其反应了预测框的不确定程度,对很多下游任务(自动加速、机器人)很有必要

在这里插入图片描述

2、针对分类得分和定位得分使用未对齐的问题:使用方差投票

Var voting:得分修正(soft NMS )+ 位置修正(给距离候选框近的框分配更高的权重,其不确定性更小)

第一步:首先进行 soft NMS:

Soft NMS:对大于 IoU 阈值的框得分抑制(线性和高斯两种方式,高斯更优),小于 IoU 阈值的框得分不变

soft NMS 认为和候选框距离越近的框,越有可能是”假正”,对应分数的衰减应该更严重,所以对得分进行衰减。

  • 衰减方式 1:使用1-IoU与得分的乘积作为衰减后的值:参数为 N t = 0.3 N_t=0.3 Nt=0.3

    在这里插入图片描述

    当相邻检测框与候选框重叠超过阈值 N t N_t Nt 时,得分线性衰减,但该函数并非线性函数,容易产生突变,所以需要找到一个连续的函数,对没有重叠的框的得分不衰减,对高度重叠的框进行较大的衰减,即高IoU的有高的惩罚,低IoU的有低的惩罚,且是逐渐过渡的,所以就有了第二种。

  • 衰减方式 2:高斯惩罚函数:参数为 δ = 0.5 \delta=0.5 δ=0.5

    在这里插入图片描述

第二步:完成了 soft-NMS 后,对得到的边框 b m b_m bm 进行基于网络学习到的方差进行修正。

预测结果为:

( x 1 , y 1 , x 2 , y 2 , s , σ x 1 , σ y 1 , σ x 2 , σ y 2 ) (x_1, y_1, x_2, y_2, s, \sigma_{x_1}, \sigma_{y_1}, \sigma_{x_2}, \sigma_{y_2}) (x1,y1,x2,y2,s,σx1,σy1,σx2,σy2)

新的坐标计算如下, x i x_i xi 是第 i i i 个框的坐标( σ t \sigma_t σt 是可调节参数):

在这里插入图片描述

  • 首先,选择出分类得分最大的框 b b b

  • 然后,对所有和 b b b 存在 IoU 交集的框 ( I o U ( b i , b ) IoU(b_i, b) IoU(bi,b) >0),计算权值 p i p_i pi

    • I o U ( b i , b ) IoU(b_i, b) IoU(bi,b) 越大,则 p i p_i pi 越大,即距离越近的两个框产生的 p i p_i pi 值越大,权重越大,也就是说距离越近的框,对 b b b 的最终位置影响更大。
    • 方差 σ x , i \sigma_{x,i} σx,i 越大,则权重越小,也就是会对 b b b 的最终位置影响更小。
  • 最后,根据权值,来更新 b b b 的坐标(四个坐标分别更新)

作者给距离真值更近但分类得分低的框权重更高。

有两种邻域框会被降权重:

  • 有高方差的框
  • 和候选框的 IoU 更小的框

分类得分不参与投票,因为低分类得分可能有高位置得分。

在这里插入图片描述

四、IoU-Net:IoU-Guided NMS

论文:Acquisition of Localization Confidence for Accurate Object Detection

出处:ECCV2018

4.1 背景

首先,由于一般的 NMS 是用分类分数来主导一个框的去留,想当然的选择得分高的框作为最优的框,忽略了得分高并不一定定位准的现象,如下图 1a 所示。

其次,在整个重复去留的过程中,没有一个定位质量的衡量标准,所以最终回归得到的框可解释性较差,如图 1b 所示,可能经过多次迭代反而得到了更不好的框。

在这里插入图片描述

4.2 方法

基于上述背景,研究者提出了 IoU-Net,让网络和关系分类得分一样关心定位得分。

1、原理分析:

作者首先分析了 IoU-Classification 的关系和 IoU-Localization 的关系:

如图 2a 所示,是在进行 NMS 之前的框的统计结果,Person 相关系数展示出定位的准确性和分类得分是没有强关联的,因为选择两阶段检测器选择正负样本是根据一个 IoU 阈值来确定的,并非定位准确性来确定的,所以这样的效果很容易理解。

如图 2b 所示,作者提出了 IoU-Net 来预测每个框的定位得分(也就是预测 IoU),低 IoU 的框对应的定位得分一般也比较低。

在这里插入图片描述

图 3 展示了在 NMS 前后保留的 positive 框的数量,横轴是预测框和 gt 框的 IoU.

这些框是依据 IoU 聚拢的,当多个框对应一个真值框的时候,只将 IoU 最大的那个框认为是 positive 的。

从图中可以看出,有很多 IoU>0.9 的框被 NMS 滤掉了(这些其实是定位优质的框,但却被滤掉了),这会严重损害最终的定位效果。

在这里插入图片描述

2、IoU-Net

① 使用 class-aware IoU 预测器来预测 IoU

class-aware IoU 预测器:两层的网络

  • 输入: FPN 特征
  • 输出:对每个框的定位准确性预测(IoU)

在这里插入图片描述

在这里插入图片描述

② IoU-Guided NMS

为了解决分类得分和定位准确率没对齐的问题,IoU-Guided NMS,将分类得分和定位得分(IoU 预测结果)进行了解耦,使用预测的定位得分作为框排序的标准。

方法:

  • 选择预测的 IoU 最大的框 M 作为基准框
  • 将和 M 的 IoU 大于阈值的框,消除,当框 i 把框 j 消除后,将框 i 的分类得分更新为 m a x ( s i , s j ) max(s_i, s_j) max(si,sj),即这两个框中的最大得分,这种操作可以看出得分聚合:当多个框都对应一个真值时,使用最大的得分作为最终得分。

优势: 对分类得分和定位得分解耦,避免了两者不对齐的问题,提升了效果

五、FCOS:Centerness-NMS

论文:FCOS: Fully Convolutional One-Stage Object Detection

代码:https://github.com/aim-uofa/AdelaiDet/tree/master/configs/FCOS-Detection

出处:ICCV2019

5.1 背景

FCOS 是单阶段检测器,在只有分类和回归 loss 时,和两阶段检测器效果还有一定的差距,主要原因在于预测产生了很多距离目标中心点很远的低质量 bbox。

所以作者就提出了 centerness 分支,来预测每个预测框和真实框的 centerness 特征,即预测框和真实目标中心点的位置。

5.2 方法

centerness 如何在 NMS 中使用

使用方法: 在测试时,和分类得分相乘,然后对框进行排序,距离越远的框得分会被很大程度地抑制下去,可以看做 centerness-NMS。

centerness 公式如下:

在这里插入图片描述

  • 为了减缓衰落,使用了根号
  • centerness 的范围是 (0,1),使用二值交叉熵损失来训练(添加到公式 2 的 loss 函数)
  • 在测试时,final score(用于 NMS 框排序)是 centerness × classification score 得到的,所以可以降低远离中心点的位置(即 low-quality 位置)的权重,可以通过 NMS 过滤掉很大一部分 low-quality 位置,提升检测效果。

极端情况下:

  • 如果某一个点在box边界,那么centerness就是0
  • 如果刚好在box中心,这个值就是1。centerness的值在0-1之间
  • 测试的时候,作者将 centerness 乘以类别 score 作为新的 score,这样就降低了远离中心点的 location 的分数,在NMS阶段将会大概率过滤掉它们。

从 anchor-based 检测器的角度来看,anchor-based 方法使用两个 IoU 阈值来将 anchor 分为 negative、ignore、positive,centerness 可以被看做一个 soft threshold。

在这里插入图片描述
使用 centerness 参与 NMS 的效果分析:

如图 7 所示:

  • 使用 centerness 前,有很多 low-quality bbox 的类别得分很高,很难被 NMS 消除
  • 使用 centerness 后,这些点都被推到了左上角,即降低类别得分置信度,更容易被消除

在这里插入图片描述

六、GFLV1:Classification-IoU-NMS

论文: Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection

代码:https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl

出处:NIPS2020

6.1 背景

单阶段目标检测器是将目标检测建模为了一个密集的分类和定位任务,分类使用 Focal loss,定位可以看做学习 Dirac 分布。

很多单阶段检测器由于没有预设的 anchor,导致定位效果较差,所有很多方法都引入了单独的预测分支来衡量定位的效果,如FCOS 中使用 centerness 来评估定位质量,然后在 NMS 排序时,将 centerness 和 分类 得分相乘,用于排序。

所以,主流单阶段检测方法有三个基础的元素:

  • 检测框的定位质量(如 IoU-Score 或 centerness score)
  • 分类
  • 定位

6.2 方法

针对主流算法问题 1:训练和测试不一致性

虽然 FCOS 中使用了 centerness × \times × score 的形式,为 NMS 引入了位置的质量信息,但测试和训练过程还是存在一定的不一致性:

1、用法不一致:

  • 训练时:分类得分用于训练分类分支,定位得分和centerness得分用于训练回归分支
  • 测试时:分类得分和定位得分相乘,来对框进行排序

在这里插入图片描述

2、对象不一致:

  • Focal loss 能够使得分类分支上,少量正样本和大量负样本一起训练,但框的质量估计是只针对正样本的。而在 NMS 排序的时候,是分类得分和定位得分联合使用的,会导致必然存在一部分分数很低的负样本的定位质量在训练过程中没有监督信号,即大量负样本没有定位质量的度量,这就会导致一个分类得分很低的负样本,由于预测了一个高定位得分,被导致预测为一个正样本。

在这里插入图片描述

问题 1 解决方法:

建立一个 classification-IoU joint representation

对于第一个训练和测试不一致的问题,为了保证训练和测试一致,同时还能兼顾分类和框质量预测都能训练到所有的正负样本,作者提出将框的表达和分类得分结合起来使用。

当预测的类别为 ground-truth 类别的时候,使用位置质量的 score 作为置信度,本文的位置质量得分就是使用 IoU 得分来衡量。

在这里插入图片描述

针对主流算法问题 2:对框回归建模不够灵活(如 softer-NMS 使用高斯分布建模框的边的位置),没办法建模复杂场景的不确定性

解决方法:直接回归一个任意分布来建模框的表示

方法:使用 softmax 来实现,涉及到从狄拉克分布的积分形式推导到一般分布的积分形式来表示框

这样一来,就消除了训练和测试的不一致性,而且建立了如图 2b 的分类和定位的强相关性。

此外,负样本可以使用 0 quality scores 来监督。

Generalized Focal Loss 的构成:

QFL:Quality Focal Loss,学习分类得分和位置得分的联合表达,可以用于 NMS 中辅助框排序
DFL:Distribution Focal Loss,将框的位置建模成一个 general distribution,让网络快速的聚焦于和目标位置距离近的位置的分布

为什么 IoU-branch 比 centerness-branch 效果更好?

  • IoU 本身就更适合衡量定位效果
  • Centerness label 过小导致正样本漏检

centerness 是 FCOS 中提出的用于衡量预测框中心点和 gt 框中心点距离的指标,GFLv1 中 的 预测IoU 是对预测框定位质量的预测,上面的实验的证明了 IoU 效果更好一些,这是为什么呢?

本文作者通过分析后发现,主要原因在于对于极小的物体,centerness 的 label 非常小,难以被优化,如图 11 所示。

为什么 label 小的时候难以被优化,或者说会降低网络的查全率呢,因为如果一些正样本的 centerness label 本来就很小,那么在 NMS 的时候,乘到 classification score 上,会拉低排序的得分,导致这些正样本被排到后面,就会漏检。

七、GFLV2:DGQP-NMS

论文:Generalized Focal Loss V2: Learning Reliable Localization Quality Estimation for Dense Object Detection

代码:https://github.com/implus/GFocalV2

出处:CVPR2021

7.1 背景

GFLV1 中提出的 generalized 分布,用于将位置分布建模为一个更通用的分布,且发现了边界模糊与否和位置分布的关系(越模糊,分布越平缓),但没有好好用这个分布。GFLV2 使用了这个分布的统计信息,来提取位置得分,指导模型训练。

7.2 方法

GFLV 1 的 NMS 排序方式:

GFLV1 是使用了 classification-IoU 的联合表达方式,来缓解训练和测试的不一致性,方式如下,当预测类别是真实类别时,联合表示特征 J = I o U J=IoU J=IoU,否则为 0。

在这里插入图片描述

V1 这种方式虽然进行了联合使用,但还是有局限性的

GFLV2 的 NMS 排序方式:

V2 同时使用分类得分(C)和由 Distribution-Guided Quality Predictor (DGQP) 得到的位置质量得分(I)作为联合表达,且同时用于训练和测试,不会有不一致性。

J = C × I J=C \times I J=C×I

  • C C C 是分类得分
  • I I I 是由 DGQP 得到的定位质量估计,如下图红框里边所示即为 DGQP
  • 在进行 NMS 排序时,同时考虑分类得分和定位质量,分类得分大但定位质量低的框会被拍到后面,分类得分略低但定位质量高的框会被提到前面来,避免了使用分类来判断位置的问题。

DGQP 的原理:

在这里插入图片描述

  • 输入:位置的统计信息
  • 输出:定位质量估计
  • 原理:将输入分布的 Top-k 值和均值 concat 起来,作为分布的特征,然后经过两个全连接层+Relu+Sigmoid,得到输出。

为什么使用 Top-k 值和均值:

能很好的反应分布的形态(如大小缓陡等),且对偏移不敏感,对尺度有更好的鲁棒性。

在这里插入图片描述
DGQP-NMS 的优势

  • 相比 V1 来说,能够降低学习难度,加速模型训练
  • 发现了输入和输出之间的强联系,能够很好的使用输入分布,来指导得到定位质量,且定位质量相比使用单一的 IoU 或 centerness 等更可靠

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【目标检测】32、让你一文看懂且看全 NMS 及其变体 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • Quartus导出网表文件:.qxp和.vqm

    当项目过程中 不想给甲方源码时 该如何 我们可以用网表文件qxp或者vqm对资源进行保护 下面讲解这两个文件的具体生成步骤 一 基本概念 QuartusII的qxp文件为QuartusII Exported Partition 用于创建综合
  • c#float取小数点后两位_C# 保留小数点后两位(方法总结)

    最简单使用 float i 1 6667f string show i ToString 0 00 结果1 67 四舍五入 其他类似方法 string show i ToString F F2 f 不区分大小写 string show St
  • SpringBoot集成Swagger4

    Swagger是一种工具 可以帮助开发人员设计 构建 文档化和测试 RESTful Web 服务 Swagger提供了一种交互式文档格式 可以使用它来了解 API 的用法 参数 返回值等等 Spring Boot提供了集成Swagger的简
  • Servlet接口实现类

    JavaWeb 03 Servlet 02 Servlet接口实现类 1 什么是Servlet接口 有什么用 Servlet接口来自于Servlet规范中的一个接口 这个接口存在于Http服务器所提供的jar包中 Servlet接口的具体位
  • 【NVMe2.0b 14-6】Format NVM、Keep Alive、Lockdown command

    目录 5 14Format NVM command 5 14 1Command Completion 5 18Keep Alive command 5 18 1Command Completion 5 19Lockdown command
  • 啪啪动物城 源码

    游戏地址 http www 4399 com flash 192131 htm 啪啪动物城源码 https files cnblogs com files gamedaybyday E5 95 AA E5 95 AA E5 8A A8 E7
  • Metasploit 提权篇

    声明 文中所涉及的技术 思路和工具仅供以安全为目的的学习交流使用 任何人不得将其用于非法用途以及盈利等目的 否则后果自行承担 文章目录 内核漏洞提权 enum patches模块 Windows Exploit suggester Wind
  • web服务器响应的端口号,web服务器端口号

    web服务器端口号 内容精选 换一换 Nginx Web Server场景是以Nginx作为Web Server的场景 Nginx作为Web Server 可以被配置部署为静态资源Web Server 在该配置下可以高效的进行静态资源的请求
  • python学习笔记——条件判断

    上篇 https blog csdn net qq 42489308 article details 89388218 条件判断 条件判断是通过一条或多条判断语句的执行结果 True或者False 来决定执行的代码块 在Python语法中
  • uboot分析之Makefile

    Uboot分析之Makefile 1 uboot根目录下执行 make smdk2410 config smdk2410 config unconfig MKCONFIG config arm arm920t smdk2410 samsun
  • 数据集下载OTB,VOT,UAV,鸢尾花

    OTB数据集下载百度网盘链接 链接 https pan baidu com s 1snsJF 7Sw EbKtzdvLO1nw 提取码 ls23 VOT数据集下载百度网盘链接 链接 https pan baidu com s 1UiTG1z
  • AI顶级会议列表 & ACL相关

    The First Class tier 1的conferences 其实基本上就是AI里面大家比较公认的top conference 下面同分的按字母序排列 IJCAI 1 AI最好的综合性会议 1969年开始 每两年开一次 奇数年开 因
  • 基于互补搜索技术和新颖架构设计,结合MobileNetV3主干网络,打造不同的目标检测器

    基于互补搜索技术和新颖架构设计 结合MobileNetV3主干网络 打造不同的目标检测器 目标检测是计算机视觉中的一个重要任务 随着深度学习技术的发展和神经网络的不断优化 YOLOv5已成为目前最流行的目标检测框架之一 然而 为了进一步提高
  • opengl shader 使用札记

    一 shader的使用步骤 创建shader 1 创建一个shader对象 GLuint glCreateShader GLenum shaderType 2 将shader源代码传入前面创建的shader对象 void glShaderS
  • 老嫂子的保姆级科普 选择视频剪辑软件就从阅读本文开始

    选错一款视频剪辑软件 是种什么样的体验 就好像新婚当晚 发现老婆是人妖一样 浪费了感情 又错付了青春 新手在学习视频剪辑的初期 需要花费大量精力去熟悉剪辑软件的基础功能 而软件挑选本身没有对错可言 适合自己的才是最好的 因此 本文仅从事实与
  • 初识Java(一)

    Java开发语言 前言 一 Java是什么 二 应用领域 特点及核心机制 1 应用领域 2 特性及特点 特性 特点 3 两种核心机制 三 JDK JRE JVM的关系 四 Java环境变量配置 五 编写我的第一个程序 总结 前言 计算机语言
  • C# 实现rabbitmq 延迟队列功能(不堵塞)

    最近在研究rabbitmq 项目中有这样一个场景 在用户要支付订单的时候 如果超过30分钟未支付 会把订单关掉 当然我们可以做一个定时任务 每个一段时间来扫描未支付的订单 如果该订单超过支付时间就关闭 但是在数据量小的时候并没有什么大的问题
  • 计算机基础msoffice等宽两缆,一级计算机基础及《MSOffice应用》模拟题

    一级计算机基础及 MSOffice应用 模拟题 三 字处理题 共25分 26 在考生文件夹下打开文档WORD DOCX 按照要求完成下列操作并以该文件名 WORD oocx 保存文档 文档开始 IBM电子商务专利的特点 通过对IBM e c
  • Typora主题下载

    1 0前言 Typora有很多主题可以使用 默认的主题很少 想要自己的主题更加个性化 可以去添加更多的主题来优化自己的使用体验 2 0下载主题 2 1 找到Typora主题的网站 1 打开一个typora文件此点击 2 进入偏好设置 3依次
  • 【目标检测】32、让你一文看懂且看全 NMS 及其变体

    文章目录 一 NMS 1 1 背景 1 2 方法 1 3 代码 1 4 不足 二 Soft NMS 2 1 背景 2 2 方法 2 3 效果 2 4 代码 2 5 不足 三 Softer NMS 3 1 背景 3 2 方法 四 IoU Ne