目标检测的评价指标

交并比 (Intersection of Union, IoU)

在这里插入图片描述

def iou(boxA, boxB):
	# 计算重合部分的上、下、左、右 4 个边的值,注意最大最小函数的使用
	left_max = max(boxA[0], boxB[0])
	top_max = max(boxA[1], boxB[1])
	right_min = min(boxA[2], boxB[2])
	bottom_min = min(boxA[3], boxB[3])
	# 计算重合部分的面积
	inter = max(0, (right_min-left_max))* max(0, (bottom_min-top_max)  
	Sa = (boxA[2]-boxA[0])*(boxA[3]-boxA[1])
	Sb = (boxB[2]-boxB[0])*(boxB[3]-boxB[1])
	# 计算所有区域的面积并计算iou,如果是Python 2,则要增加浮点化操作
	union = Sa+Sb-inter
	iou = inter/union
	return iou

mAP (mean Average Precision)

TP, FP, FN, TN

  • 由于图像中存在背景与物体两种标签,预测框也分为正确与错误,因此在评测时会产生以下 4 种样本:
    • (1) 正确检测框 TP (True Positive):预测框正确地与标签框匹配了,两者间的 IoU 大于 0.5
    • (2) 误检框 FP (False Positive):将背景预测成了物体,通常这种框与图中所有标签的 IoU 都不会超过 0.5
    • (3) 漏检框 FN (False Negative):本来需要模型检测出的物体,模型没有检测出
    • (4) 正确背景 TN (True Negative):本身是背景,模型也没有检测出来,这种情况在物体检测中通常不需要考虑
      在这里插入图片描述

P-R 曲线

在这里插入图片描述

预测值 (Dets): 物体类别、边框位置的 4 个预测值、该物体的得分
标签值 (GTs): 物体类别、边框位置的 4 个真值

  • 遍历到每一个预测框时,都可以生成一个对应的 P P P (Precision, 准确率) 与 R R R (Recall, 召回率)
    P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP R = T P T P + F N = T P l e n ( G T s ) R=\frac{TP}{TP+FN}=\frac{TP}{len(GTs)} R=TP+FNTP=len(GTs)TP将所有的点绘制成曲线,即形成了 P-R 曲线 (每一个类别都可以绘制出一个单独的 P-R 曲线):
    在这里插入图片描述

mAP (mean Average Precision)

  • 即使有了 P-R 曲线,评价模型仍然不直观,如果直接取曲线上的点,在哪里选取都不合适,因为召回率高的时候准确率会很低,准确率高的时候往往召回率很低。这时,AP 就派上用场了:
    A P = ∫ 0 1 P d R AP=\int_0^1PdR AP=01PdR严格意义上讲,还需要对曲线进行一定的修正,再进行 AP 计算。除了求面积的方式,还可以使用 11 个不同召回率对应的准确率求平均的方式求 AP
  • 每个类别的 AP 是相互独立的,将每个类别的 AP 进行平均,即可得到 mAP。我们常使用 mAP 这一指标来评价一个模型的好坏

其他指标

  • 速度需求:自动驾驶等场景下,通常需要对图像处理达到非常低的时延才能保证足够的安全,这时检测器需要达到实时性;而在机械臂自动分拣等系统中,速度并不是第一考虑因素
  • 召回率:在交通流量统计系统中,首先需要保障的指标是车辆、行人等物体的召回率,这会直接影响流量统计,相比之下,检测的边框精准度是次要的指标
  • 边框精准度:在智能测量、机械臂自动分拣等应用中,检测边框的精准度直接影响系统的成功率,因此需要选择边框精准度更高的网络,这是首要因素

非极大值抑制 (Non-Maximum Suppression, NMS)

NMS 基本过程

  • 当前的物体检测算法为了保证召回率,对于同一个真实物体往往会有多于 1 个的候选框输出。由于多余的候选框会影响检测精度,因此需要利用 NMS 过滤掉重叠的候选框,得到最佳的预测输出
    在这里插入图片描述

在上图中,候选框 C 的得分比 A 要低,在评测时,C 候选框会被当做一个 False Positive 来看待,从而降低模型精度。实际上,由于候选框 A 的质量要比 C 好,理想的输出是 A 而不是 C,我们希望能够抑制掉候选框 C


NMS 方法

  • NMS 方法简单有效,并且对检测结果至关重要,在物体检测算法中有着广泛的应用。基本的 NMS 方法利用得分高的边框抑制得分低且重叠程度高的边框,因此涉及以下两个量化指标
    • 预测得分:NMS 假设一个边框的预测得分越高,这个框就要被优先考虑,其他与其重叠超过一定程度的边框要被舍弃,非极大值即是指得分的非极大值
    • IoU:IoU 用于评价两个边框的重合程度。如果两个边框的 IoU 超过一定阈值时,得分低的边框会被舍弃。阈值通常会取 0.5 或者 0.7

NMS 方法的实现

def nms(bboxes, scores, thresh=0.5):
	"""
	Args:
		bboxes: 所有预测框的左上点坐标、右下点坐标 (图片的最左上点坐标为 [0, 0])
		scores: 所有预测框的得分
		thresh: 设定的 IoU 阈值
	"""
    x1, y1 = bboxes[:,0], bboxes[:,1]	# 所有预测框的左上角坐标
    x2, y2 = bboxes[:,2], bboxes[:,3]	# 所有预测框的右下角坐标
    # 计算每个 box 的面积
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    # 对得分进行降序排列,order 为降序排列的索引
    _, order = scores.sort(0, descending=True)
    # keep 保留了 NMS 留下的边框 box
    keep = []

    while order.numel() > 0:
        if order.numel() == 1:   # 保留框只剩一个         
        	i = order.item()
            keep.append(i)
            break
        else:
            i = order[0].item()	 # 保留 scores 最大的那个框 box[i]
            keep.append(i)
        # 巧妙利用 tensor.clamp 函数求取每一个框与当前框的最大值和最小值
        xx1 = x1[order[1:]].clamp(min=x1[i])	# 取 Anchor[i] 与其余 Anchors 的最大 x1, y1
        yy1 = y1[order[1:]].clamp(min=y1[i])	
        xx2 = x2[order[1:]].clamp(max=x2[i])	# 取 Anchor[i] 与其余 Anchors 的最小 x2, y2
        yy2 = y2[order[1:]].clamp(max=y2[i])
        # 求取每一个框与当前框的重合部分面积
        inter = (xx2 - xx1 + 1).clamp(min=0) * (yy2 - yy1 + 1).clamp(min=0)
        # 计算每一个框与当前框的 IoU
        iou = inter / (areas[i] + areas[order[1:]] - inter)
        # 保留 IoU 小于阈值的边框索引 (nonzero 用于返回非零元素的索引)
        idx = (iou <= threshold).nonzero().squeeze()
        if idx.numel() == 0:
            break
        # 这里的 +1 是为了补充 idx 与 order 之间的索引差
        order = order[idx+1]

	# 返回保留下的所有边框的索引值
    return torch.LongTensor(keep)

NMS 的缺陷

  • (1) 最大的问题就是将得分较低的边框强制性地去掉,如果物体出现较为密集时,本身属于两个物体的边框,其中得分较低的也有可能被抑制掉,从而降低了模型的召回率
  • (2) 阈值难以确定。过高的阈值容易出现大量误检,而过低的阈值则容易降低模型的召回率,这个超参很难确定
  • (3) 将得分作为衡量指标。NMS 简单地将得分作为一个边框的置信度,但在一些情况下,得分高的边框不一定位置更准,因此这个衡量指标也有待考量
  • (4) 速度:NMS 的实现存在较多的循环步骤,GPU 的并行化实现不是特别容易,尤其是预测框较多时,耗时较多

针对上述问题陆续产生了一系列改进的方法,如 Soft NMSSofter NMSIoU-Net

抑制得分: Soft NMS

  • 如前所述,当物体比较密集时,NMS 有降低召回率的风险
    在这里插入图片描述造成这种现象的原因在于 NMS 的计算公式
    在这里插入图片描述其中, s i s_i si 代表了每个个边框的得分, M M M 为当前得分最高的框, b i b_i bi 为剩余框的某一个, N t N_t Nt 为设定的阈值,可以看到当 IoU 大于 N t N_t Nt 时,该边框的得分直接置 0,相当于被舍弃掉了,从而有可能造成边框的漏检
  • 基于此原因,诞生了 Soft NMS 方法,它对于 IoU 大于阈值的边框,没有将其得分直接置 0,而是降低该边框的得分
    在这里插入图片描述上式并不是一个连续的函数,当一个边框与 M M M 的重叠 IoU 超过阈值 N t N_t Nt 时,其得分会发生跳变,这种跳变会对检测结果产生较大的波动,因此还需要寻找一个更为稳定、连续的得分重置函数,最终 Soft NMS 给出了如下式所示的重置函数进行得分衰减:
    在这里插入图片描述Soft NMS 的计算复杂度与 NMS 相同,是一种更为通用的非极大值抑制方法,可以将 NMS 看做 Soft NMS 的二值化特例。当然,Soft NMS 也是一种贪心算法,并不能保证找到最优的得分重置映射。经过多种实验证明,Soft NMS 在不影响前向速度的前提下,能够有效提升物体检测的精度

Soft NMS 只是降低了一些检测框的置信度,因此仍需要调节阈值超参

加权平均: Softer NMS

Bounding Box Parameterization

位置置信度与分类置信度

  • NMS 的本意是筛选出位置最精准的边框,但 NMS 与 Soft NMS 算法都使用了预测分类置信度作为衡量指标,即假定分类置信度越高的边框,其位置也更为精准,而具有高分类置信度的边框位置并不总是最精准的,也就是说,位置置信度与分类置信度并不是强相关的关系,直接使用分类置信度作为 NMS 的衡量指标并非是最佳选择
    在这里插入图片描述
  • 为此,Softer NMS 额外让网络输出边框的位置置信度 (Localization Confidence)

分布假设与位置置信度

  • 设预测框为 x e x_e xe ( x e x_e xe 可表示 ( x 1 , y 1 , x 2 , y 2 ) (x_1,y_1,x_2,y_2) (x1,y1,x2,y2) 中的任何一个坐标),GT 框为 x g x_g xg
  • 单变量高斯分布 P Θ ( x ) P_\Theta(x) PΘ(x): Softer NMS 假设预测框 x x x 服从如下单变量高斯分布 (这是一个比较强的先验条件,它假定了边框的 4 个坐标之间相互独立,也没有考虑高斯混合分布等更加复杂的分布情况):
    在这里插入图片描述其中 Θ \Theta Θ 为网络参数,标准差 σ \sigma σ 可用于衡量预测框的位置置信度,例如 σ → 0 \sigma\rightarrow0 σ0 表示网络对预测框位置置信度很高。如下图所示,Softer NMS 直接使用一个新的全连接层 + 绝对值层来输出标准差 σ \sigma σ (使用绝对值层而非 ReLU 是为了防止标准差为 0):
    在这里插入图片描述
  • Dirac delta 分布 P D ( x ) P_D(x) PD(x): 真实物体边框 x x x 服从 Dirac delta function
    在这里插入图片描述其中,狄拉克分布为标准差为 0 的高斯分布的极限
    δ ( x ) = { ∞  if  x = 0 0  if  x ≠ 0 \delta(x)=\left\{\begin{aligned} \infty & \quad\text { if } x=0 \\ 0 &\quad \text { if } x \neq 0 \end{aligned}\right. δ(x)={0 if x=0 if x=0

Bounding Box Regression with KL Loss

  • 上面给出了预测框和真实物体边框服从的分布,因此很自然地就可以想到让这两个分布尽量接近。为此,Softer NMS 将回归损失定义为了预测框分布 P Θ ( x ) P_\Theta(x) PΘ(x) 和真实物体边框 P D ( x ) P_D(x) PD(x) 的 KL 散度
    L reg  = D K L ( P D ( x ) ∥ P Θ ( x ) ) = ∫ P D ( x ) log ⁡ P D ( x ) d x − ∫ P D ( x ) log ⁡ P Θ ( x ) d x = − H ( P D ( x ) ) − P D ( x g ) log ⁡ P Θ ( x g ) = − log ⁡ P Θ ( x g ) − H ( P D ( x ) ) = ( x g − x e ) 2 2 σ 2 + log ⁡ ( σ 2 ) 2 + log ⁡ ( 2 π ) 2 − H ( P D ( x ) ) \begin{aligned} L_{\text {reg }} &=D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) \\ &=\int P_{D}(x) \log P_{D}(x) \mathrm{d} x-\int P_{D}(x) \log P_{\Theta}(x) \mathrm{d} x \\ &=-H\left(P_{D}(x)\right)-P_D(x_g)\log P_\Theta(x_g)\\ &=-\log P_\Theta(x_g)-H\left(P_{D}(x)\right) \\ &=\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)dxPD(x)logPΘ(x)dx=H(PD(x))PD(xg)logPΘ(xg)=logPΘ(xg)H(PD(x))=2σ2(xgxe)2+2log(σ2)+2log(2π)H(PD(x))去掉最后两项常数项可得:
    L r e g ∝ ( x g − x e ) 2 2 σ 2 + 1 2 log ⁡ ( σ 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) Lreg2σ2(xgxe)2+21log(σ2)(当 σ = 1 \sigma=1 σ=1 时,KL 损失就退化为了标准的欧几里得损失)
  • 将回归损失对 x e x_e xe σ \sigma σ 求导可得:
    在这里插入图片描述由于 σ \sigma σ 在分母上,在训练初期很可能出现梯度爆炸的情况,为此,网络不再直接输出 σ \sigma σ,而是改为输出 α = log ⁡ ( σ 2 ) \alpha=\log(\sigma^2) α=log(σ2),此时回归损失为:
    在这里插入图片描述与 Faster RCNN 类似,当 δ = ∣ x g − x e ∣ > 1 \delta=|x_g-x_e|>1 δ=xgxe>1 时,Softer NMS 也采用了 smooth L 1 L_1 L1 loss 来帮助模型收敛:
    在这里插入图片描述

δ = ∣ x g − x e ∣ \delta=|x_g-x_e| δ=xgxe,则 d L r e g d α = − 1 2 δ 2 e − α + 1 2 \frac{dL_{reg}}{d\alpha}=-\frac{1}{2}\delta^2e^{-\alpha}+\frac{1}{2} dαdLreg=21δ2eα+21. 令 d L r e g d α = 0 \frac{dL_{reg}}{d\alpha}=0 dαdLreg=0 可得 α = log ⁡ δ 2 \alpha=\log\delta^2 α=logδ2 时回归损失有最小值,也就是说,当预测框与 GT 框差别很大时,理想模型输出的标准差 σ \sigma σ 也应该很大:
在这里插入图片描述

Variance Voting

  • 如下图所示,对于一个真实物体,可能所有的预测边框都是不准确的
    在这里插入图片描述为此,Softer NMS 利用位置置信度将多个框加权合成最后的框,从而使得高分类置信度的边框位置变得更加准确,有效提升了检测性能

B \mathcal B B 为所有预测框的位置坐标, S \mathcal S S 为所有预测框的分类置信度, C \mathcal C C 为所有预测框的位置置信度, D \mathcal D D 为所有利用 var voting 更新完位置坐标的预测框, σ t \sigma_t σt 为 var voting 的温度系数, S f ( ) \mathcal {Sf}() Sf() 为 Soft NMS 对应的分类得分衰减函数

在这里插入图片描述

  • Softer NMS 在 Soft NMS 的基础上增加了绿色的 3 行代码。在选出当前具有最大分类得分的预测框 b b b 后,使用加权平均的方法,利用 b b b 周围的预测框去提升 b b b 的位置精度:
    在这里插入图片描述其中, p i / σ x , i 2 p_i/\sigma_{x,i}^2 pi/σx,i2 为预测框 b b b 附近边框 b i b_i bi 的权重, b i b_i bi b b b 的 IoU 越大、位置置信度越高,则它的权重就越大; x x x 为加权平均后预测框 b b b 的新坐标 (注意,在位置修正的过程中,只用到了位置置信度,没有使用分类置信度)
  • 至此,通过这种加权平均的方法,Softer NMS 成功避免了下面两种检测错误:
    在这里插入图片描述在这里插入图片描述

定位置信度: IoU-Net


  • 与 Softer NMS 类似,IoU-Net 也是瞄准了当前目标检测网络不能输出定位置信度的痛点,在 Faster RCNN 的网络基础上设计了新的网络分支去输出预测框和 GT 框的 IoU 作为当前预测框的定位置信度,并通过位置置信度改进 NMS 来保留位置更精准的预测框。除此之外,IoU-Net 还进一步提出了基于优化的预测框位置修正方法,通过最大化定位置信度来修正预测框位置

Precise RoI Pooling (PrRoI Pooling)

  • RoI Align 通过采样的方法有效避免了量化操作,减小了 RoI Pooling 的误差,但 RoI Align 也存在一个缺点,即对每一个区域都采取固定数量的采样点,但区域有大有小,都采取同一个数量点,显然不是最优的方法
  • 以此为出发点,IoU-Net 提出了 PrRoI Pooling,采用积分的方式实现了更为精准的感兴趣区域池化。与 RoI Align 只采样 4 个点不同,PrRoI Pooling 方法将整个区域看做是连续的,采用积分公式求解每一个区域的池化输出值:
    在这里插入图片描述其中 b i n bin bin 为 RoI 中的一个区域, F \mathcal F F 为特征图, f ( x , y ) f(x,y) f(x,y) 为通过双线性插值得到的点 ( x , y ) (x,y) (x,y) 处的权重:
    在这里插入图片描述其中, w i , j w_{i,j} wi,j F \mathcal F F 上点 ( i , j ) (i,j) (i,j) 处的权重,
    I C ( x , y , i , j ) = max ⁡ ( 0 , 1 − ∣ x − i ∣ ) × max ⁡ ( 0 , 1 − ∣ y − j ∣ ) I C(x, y, i, j)=\max (0,1-|x-i|) \times \max (0,1-|y-j|) IC(x,y,i,j)=max(0,1xi)×max(0,1yj)
    在这里插入图片描述
  • 总的来说,PrRoI Pooling 避免了任何的坐标量化过程,同时与 RoI Align 和 RoI Pooling 不同,PrRoI Pooling 对于预测框的坐标 x 1 , x 2 , y 1 , y 2 x_1,x_2,y_1,y_2 x1,x2,y1,y2 还连续可导,这有利于之后的预测框位置修正过程
    在这里插入图片描述

实现时仍然通过采样离散的点去近似积分项

Learning to predict IoU

在这里插入图片描述

  • IoU-Net 在 Head 处增加了一个预测 IoU 的分支,与分类回归分支并行,用于预测每一个候选框的定位置信度 (IoU-Net uses class-aware IoU predictors)
  • 需要注意的是,在训练时 IoU-Net 通过自动生成候选框的方式来训练 IoU 分支,而不是从 RPN 获取。具体来讲,Jittered RoIs 在训练集的真实物体框上增加随机扰动,生成了一系列候选框,并移除与真实物体框 IoU 小于 0.5 的边框。实验证明这种方法来训练 IoU 分支可以带来更高的性能与稳健性。因此,在整个模型的联合训练时,IoU 预测分支的训练数据需要从每一批的输入图像中单独生成。此外,还需要对 IoU 分支的标签进行归一化,保证其分布在 [ − 1 , 1 ] [-1,1] [1,1] 区间中

由于这种训练方式只需要提供特征图和 GT 框,因此不依赖于任何特定的目标检测器,当与不同的目标检测器结合使用时都能具有不错的鲁棒性

IoU-guided NMS

  • IoU-Net 使用预测的 IoU 而非分类置信度作为预测框排序的依据,并抑制掉与当前框 IoU 超过设定阈值的其他候选框,从而解决了传统 NMS 分类置信度与定位精度不匹配的问题。此外,在 NMS 过程中,IoU-Net 还做了分类置信度的聚类。具体做法是,在 NMS 过程中,当边框 i i i 抑制边框 j j j 时,通过 s i = max ⁡ ( s i , s j ) s_i=\max(s_i,s_j) si=max(si,sj) 来更新边框 i i i 的分类置信度,即对于匹配到同一真实物体的边框,选取其中最大的类别置信度

在这里插入图片描述

Bounding box refinement as an optimization procedure

  • 预测框位置修正的问题可以被看作如下优化问题
    在这里插入图片描述其中, b o x d e t box_{det} boxdet 为预测框, b o x g t box_{gt} boxgt 为 GT 框; transform \text{transform} transform 为一个变换函数,接受参数 c c c 来调整预测框的位置; c r i t crit crit 为衡量两个边界框距离的度量指标
  • Regression-based algorithms: 基于回归的预测框位置修正算法直接通过一次网络的前向传播,由网络的回归分支得到 c ∗ c^* c。但这种迭代的回归算法极容易受到输入分布变化的影响,使得迭代过程中定位精度反而下降。同时,定位置信度的缺失也使得回归修正算法缺少可解释性
  • optimization-based bounding box refinement method: 为了解决回归修正算法中存在的问题,IoU-Net 直接将网络预测的 IoU 作为优化指标,利用梯度上升来进行位置修正 (这得益于 PrRoI Pooling 对预测框坐标连续可导),同时还利用预测 IoU 采取早停策略防止迭代过程中定位精度下降。这不仅提高了位置修正的性能,还提高了算法的可解释性
    在这里插入图片描述

算法第 6 行的 s c a l e scale scale 表示根据坐标所在轴对应的边框尺寸大小对梯度进行放大,例如将 ∇ x 1 \nabla x_1 x1 放大 w i d t h ( b j ) width(b_j) width(bj)

在这里插入图片描述

参考文献

更多推荐