当前位置:   article > 正文

Wise-IoU 作者导读:基于动态非单调聚焦机制的边界框损失_wiseiou

wiseiou

论文地址:Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism

摘要:目标检测作为计算机视觉的核心问题,其检测性能依赖于损失函数的设计。边界框损失函数作为目标检测损失函数的重要组成部分,其良好的定义将为目标检测模型带来显著的性能提升。近年来的研究大多假设训练数据中的示例有较高的质量,致力于强化边界框损失的拟合能力。但我们注意到目标检测训练集中含有低质量示例,如果一味地强化边界框对低质量示例的回归,显然会危害模型检测性能的提升。Focal-EIoU v1 被提出以解决这个问题,但由于其聚焦机制是静态的,并未充分挖掘非单调聚焦机制的潜能。基于这个观点,我们提出了动态非单调的聚焦机制,设计了 Wise-IoU (WIoU)。动态非单调聚焦机制使用“离群度”替代 IoU 对锚框进行质量评估,并提供了明智的梯度增益分配策略。该策略在降低高质量锚框的竞争力的同时,也减小了低质量示例产生的有害梯度。这使得 WIoU 可以聚焦于普通质量的锚框,并提高检测器的整体性能。将WIoU应用于最先进的单级检测器 YOLOv7 时,在 MS-COCO 数据集上的 AP-75 从 53.03% 提升到 54.50%

前言:因为我能使用的算力有限,所以做实验时只在 YOLOv7 上做了。而且因为完整的 MS-COCO 需要更大的参数量,训练一个模型需要 3 天时间,所以我只取了其中四分之一的数据进行训练 (28474 张训练图片)。这篇论文的硬伤在于实验量是严重不足的,所以我也不确保这个方法的普适性。此外,WIoU 是一个依赖超参数的方法,所以建议大家根据自己的实验数据调整超参数,而不是直接使用我的默认参数

c051597d60bd4db19bc95f9d55563b11.png

CIoU、SIoU 的 v2 使用和 WIoU v2 一致的单调聚焦机制,v3 使用和 WIoU v3 一致的动态非单调聚焦机制,详见论文的消融实验

在计算速度上,WIoU 所增加的计算成本主要在于聚焦系数的计算、IoU 损失的均值统计。在实验条件相同时,WIoU 因为没有对纵横比进行计算反而有更快的速度,WIoU 的计算耗时为 CIoU 的 87.2%

在性能提升上,数据集的标注质量越差 (当然差到一定程度就不叫数据集了),WIoU 相对其它边界框损失的表现越好。比如说我在一个检测火焰的比赛里用的 WIoU (那时的初版还比较捞) 使 mAP 提升了 1.70% (相比 CIoU)

GitHub:https://github.com/Instinct323/wiou

现有工作

记锚框为 gif.latex?%5Cvec%7BB%7D%3D%5Bx%5C%20y%5C%20w%5C%20h%5D,目标框为 gif.latex?%5Cvec%7BB_%7Bgt%7D%7D%3D%5Bx_%7Bgt%7D%5C%20y_%7Bgt%7D%5C%20w_%7Bgt%7D%5C%20h_%7Bgt%7D%5D

a870d6f265d5403e9e22f24db12dd95d.png

IoU 用于度量目标检测任务中预测框与真实框的重叠程度,定义为:

gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D%20%3D%201%20-%20IoU%20%3D%201%20-%20%5Cfrac%7BW_i%20H_i%7D%7BS_u%7D

同时,IoU 有一个致命的缺陷,可以在下面公式中观察到。当边界框之间没有重叠时 gif.latex?%28W_i%3D0%5C%20or%5C%20H_i%3D0%29gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D 反向传播的梯度消失。这导致重叠区域的宽度 gif.latex?W_i 在训练时无法更新

gif.latex?%5Cfrac%7B%5Cpartial%20%5Cmathcal%7BL%7D_%7BIoU%7D%7D%7B%5Cpartial%20W_i%7D%20%3D%20%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20-H_i%5Cfrac%7BIoU%20+%201%7D%7BS_u%7D%2CW_i%20%3E0%5C%5C%200%2CW_i%20%3D%200%20%5Cend%7Bmatrix%7D%5Cright.

现有的工作考虑了许多与包围盒相关的几何因素并构造了惩罚项 gif.latex?%5Cmathcal%7BR%7D_i 来解决这个问题,现有的边界框损失都是基于加法的损失,并遵循以下范式:

gif.latex?%5Cmathcal%7BL%7D_i%20%3D%20%5Cmathcal%7BL%7D_%7BIoU%7D%20+%20%5Cmathcal%7BR%7D_i

Distance-IoU

DIoU 将惩罚项定义为中心点连接的归一化长度:

gif.latex?%5Cmathcal%7BR%7D_%7BDIoU%7D%20%3D%20%5Cfrac%7B%28x-x_%7Bgt%7D%29%5E2%20+%20%28y-y_%7Bgt%7D%29%5E2%7D%7BW%5E2_g%20+%20H%5E2_g%7D

同时为最小包围框的尺寸 gif.latex?W_g%2C%20H_g 提供了负梯度,这将使得 gif.latex?W_g%2C%20H_g 增大而阻碍预测框与目标框重叠:

gif.latex?%5Cfrac%20%7B%5Cpartial%20%5Cmathcal%7BR%7D_%7BDIoU%7D%7D%20%7B%5Cpartial%20W_g%7D%20%3D%20-2W_g%20%5Cfrac%7B%28x-x_%7Bgt%7D%29%5E2%20+%20%28y-y_%7Bgt%7D%29%5E2%7D%7B%28W%5E2_g%20+%20H%5E2_g%29%5E2%7D%20%3C%200

gif.latex?%5Cfrac%20%7B%5Cpartial%20%5Cmathcal%7BR%7D_%7BDIoU%7D%7D%20%7B%5Cpartial%20H_g%7D%20%3D%20-2H_g%20%5Cfrac%7B%28x-x_%7Bgt%7D%29%5E2%20+%20%28y-y_%7Bgt%7D%29%5E2%7D%7B%28W%5E2_g%20+%20H%5E2_g%29%5E2%7D%20%3C%200

但不可否认的是,距离度量的确是一个极其有效的解决方案,成为高效边界框损失的必要因子。EIoU 在此基础上加大了对距离度量的惩罚力度,其惩罚项定义为:

gif.latex?%5Cmathcal%7BR%7D_%7BEIoU%7D%20%3D%20%5Cmathcal%7BR%7D_%7BDIoU%7D%20+%20%5Cfrac%7B%28x-x_%7Bgt%7D%29%5E2%7D%7BW%5E2_g%7D%20+%20%5Cfrac%7B%28y-y_%7Bgt%7D%29%5E2%7D%7BH%5E2_g%7D

Complete-IoU

在 gif.latex?%5Cmathcal%7BR%7D_%7BDIoU%7D 的基础上,CIoU 增加了对纵横比一致性的考虑:

gif.latex?%5Cmathcal%7BR%7D_%7BCIoU%7D%20%3D%20%5Cmathcal%7BR%7D_%7BDIoU%7D%20+%20%5Calpha%20v%2C%20%5Calpha%20%3D%20%5Cfrac%7Bv%7D%7B%5Cmathcal%7BL%7D_%7BIoU%7D%20+%20v%7D

其中的 gif.latex?v 描述了纵横比一致性:

gif.latex?v%3D%5Cfrac%7B4%7D%7B%5Cpi%5E2%7D%20%28%5Ctan%5E%7B-1%7D%5Cfrac%7Bw%7D%7Bh%7D%20-%20%5Ctan%5E%7B-1%7D%5Cfrac%7Bw_%7Bgt%7D%7D%7Bh_%7Bgt%7D%7D%29%20%5E2

gif.latex?%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20w%7D%20%3D%20%5Cfrac%7B8%7D%7B%5Cpi%5E2%7D%20%28%5Ctan%5E%7B-1%7D%5Cfrac%7Bw%7D%7Bh%7D%20-%20%5Ctan%5E%7B-1%7D%5Cfrac%7Bw_%7Bgt%7D%7D%7Bh_%7Bgt%7D%7D%29%20%5E2%20%5Cfrac%7Bh%7D%7Bh%5E2+w%5E2%7D

gif.latex?%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20h%7D%20%3D-%20%5Cfrac%7B8%7D%7B%5Cpi%5E2%7D%20%28%5Ctan%5E%7B-1%7D%5Cfrac%7Bw%7D%7Bh%7D%20-%20%5Ctan%5E%7B-1%7D%5Cfrac%7Bw_%7Bgt%7D%7D%7Bh_%7Bgt%7D%7D%29%20%5E2%20%5Cfrac%7Bw%7D%7Bh%5E2+w%5E2%7D

其中 gif.latex?v 反向传播的梯度满足 gif.latex?%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20h%7D%20%3D%20-%5Cfrac%7Bw%7D%7Bh%7D%20%5Cfrac%7B%5Cpartial%20v%7D%7B%5Cpartial%20w%7D,也就是 gif.latex?v 不可能为预测框的宽高提供同号的梯度。在前文对 DIoU 的分析中可知 DIoU 会产生负梯度 gif.latex?%5Cfrac%20%7B%5Cpartial%20%5Cmathcal%7BR%7D_%7BDIoU%7D%7D%20%7B%5Cpartial%20W_g%7D,当这个负梯度与 gif.latex?%5Cfrac%20%7B%5Cpartial%20%5Cmathcal%7BL%7D_%7BIoU%7D%7D%20%7B%5Cpartial%20W_g%7D 正好抵消时,会导致预测框无法优化。而 CIoU 对纵横比一致性的考虑将打破这种僵局

6c0127c968334b70accc987e4934fb1e.png

Scylla-IoU

Zhora Gevorgyan 证明了中心对齐的边界框会具有更快的收敛速度,以 angle cost、distance cost、shape cost 构造了 SIoU。其中 angle cost 描述了边界框中心连线与 x-y 轴的最小夹角:

gif.latex?%5Cmathcal%7B%5CvarLambda%7D%20%3D%20%5Csin%282%5Csin%5E%7B-1%7D%5Cfrac%7B%5Cmin%28%7Cx-x_%7Bgt%7D%7C%2C%7Cy-y_%7Bgt%7D%7C%29%7D%7B%5Csqrt%7B%28x-x_%7Bgt%7D%29%5E2%20+%20%28y-y_%7Bgt%7D%29%5E2%7D%20+%20%5Cepsilon%7D%29

distance cost 描述了两边界框的中心点在x轴和y轴上的归一化距离,其惩罚力度与 angle cost 正相关。distance cost 被定义为:

gif.latex?%5CDelta%20%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bt%3Dw%2Ch%7D%281%20-%20e%5E%7B-%5Cgamma%20%5Crho_%7Bt%7D%7D%29%2C%5Cgamma%20%3D%202%20-%20%5CvarLambda

gif.latex?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20%5Crho_x%20%3D%20%28%5Cfrac%7Bx%20-%20x_%7Bgt%7D%7D%7BW_g%7D%29%5E2%5C%5C%20%5Crho_y%20%3D%20%28%5Cfrac%7By%20-%20y_%7Bgt%7D%7D%7BH_g%7D%29%5E2%20%5Cend%7Bmatrix%7D%5Cright.

shape cost 描述了两边界框的形状差异,当两边界框的尺寸不一致时不为 0。shape cost 被定义为:

gif.latex?%5COmega%20%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bt%3Dw%2Ch%7D%281%20-%20e%5E%7B%5Comega_t%7D%29%5E%7B%5Ctheta%7D%2C%5Ctheta%20%3D%204

gif.latex?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20%5Comega_w%20%3D%20%5Cfrac%7B%7Cw-w_%7Bgt%7D%7C%7D%7B%5Cmax%28w%2Cw_%7Bgt%7D%29%7D%5C%5C%20%5Comega_h%20%3D%20%5Cfrac%7B%7Ch-h_%7Bgt%7D%7C%7D%7B%5Cmax%28h%2Ch_%7Bgt%7D%29%7D%20%5Cend%7Bmatrix%7D%5Cright.

gif.latex?%5Cmathcal%7BR%7D_%7BSIoU%7D 与 gif.latex?%5Cmathcal%7BR%7D_%7BCIoU%7D 类似,它们都由 distance cost 和 shape cost 组成:

gif.latex?%5Cmathcal%7BR%7D_%7BSIoU%7D%20%3D%20%5CDelta%20+%20%5COmega

本文方法

本文所涉及的聚焦机制有以下几种:

  • 静态:当边界框的 IoU 为某一指定值时有最高的梯度增益,如 Focal EIoU v1
  • 动态:享有最高梯度增益的边界框的条件处于动态变化中,如 WIoU v3
  • 单调:梯度增益随损失值的增加而单调增加,如 Focal loss
  • 非单调:梯度增益随损失值的增加呈非单调变化

WIoU v1 构造了基于注意力的边界框损失,WIoU v2 和 v3 则是在此基础上通过构造梯度增益 (聚焦系数) 的计算方法来附加聚焦机制

Wise-IoU v1

因为训练数据中难以避免地包含低质量示例,所以如距离、纵横比之类的几何度量都会加剧对低质量示例的惩罚从而使模型的泛化性能下降。好的损失函数应该在锚框与目标框较好地重合时削弱几何度量的惩罚,不过多地干预训练将使模型有更好的泛化能力。在此基础上,我们根据距离度量构建了距离注意力,得到了具有两层注意力机制的 WIoU v1:

  • gif.latex?%5Cmathcal%7BR%7D_%7BWIoU%7D%20%5Cin%20%5B1%2Ce%29,这将显著放大普通质量锚框的 gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D
  • gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D%20%5Cin%20%5B0%2C1%5D,这将显著降低高质量锚框的 gif.latex?%5Cmathcal%7BR%7D_%7BWIoU%7D,并在锚框与目标框重合较好的情况下显著降低其对中心点距离的关注

gif.latex?%5Cmathcal%7BL%7D_%7BWIoUv1%7D%20%3D%20%5Cmathcal%7BR%7D_%7BWIoU%7D%20%5Cmathcal%7BL%7D_%7BIoU%7D

gif.latex?%5Cmathcal%7BR%7D_%7BWIoU%7D%20%3D%20%5Cexp%28%5Cfrac%7B%28x-x_%7Bgt%7D%29%5E2%20+%20%28y-y_%7Bgt%7D%29%5E2%7D%7B%28W%5E2_g%20+%20H%5E2_g%29%5E*%7D%29

为了防止 gif.latex?%5Cmathcal%7BR%7D_%7BWIoU%7D 产生阻碍收敛的梯度,将 gif.latex?W_g%2C%20H_g 从计算图中分离 (上标 * 表示此操作)。因为它有效地消除了阻碍收敛的因素,所以我们没有引入新的度量指标,如纵横比

Wise-IoU v2

Focal Loss 设计了一种针对交叉熵的单调聚焦机制,有效降低了简单示例对损失值的贡献。这使得模型能够聚焦于困难示例,获得分类性能的提升。类似地,我们构造了 gif.latex?%5Cmathcal%7BL%7D_%7BWIoUv1%7D 的单调聚焦系数 gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D%5E%7B%5Cgamma*%7D

gif.latex?%5Cmathcal%7BL%7D_%7BWIoUv2%7D%20%3D%20%5Cmathcal%7BL%7D_%7BIoU%7D%5E%7B%5Cgamma%20*%7D%20%5Cmathcal%7BL%7D_%7BWIoUv1%7D%2C%20%5Cgamma%20%3E%200

在模型训练过程中,梯度增益 gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D%5E%7B%5Cgamma%20*%7D 随着 gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D 的减小而减小,导致训练后期收敛速度较慢。因此,引入 gif.latex?%5Cmathcal%7BL%7D_%7BIoU%7D 的均值作为归一化因子:

gif.latex?%5Cmathcal%7BL%7D_%7BWIoUv2%7D%20%3D%20%28%5Cfrac%7B%5Cmathcal%7BL%7D_%7BIoU%7D%5E*%7D%7B%5C%20%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D%5C%20%7D%29%5E%7B%5Cgamma%7D%20%5Cmathcal%7BL%7D_%7BWIoUv1%7D

其中的 gif.latex?%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D 为动量为 gif.latex?m 的滑动平均值,动态更新归一化因子使梯度增益 gif.latex?r%3D%20%28%5Cfrac%7B%5Cmathcal%7BL%7D_%7BIoU%7D%5E*%7D%7B%5C%20%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D%5C%20%7D%29%5E%7B%5Cgamma%7D 整体保持在较高水平,解决了训练后期收敛速度慢的问题

Wise-IoU v3

定义离群度以描述锚框的质量,其定义为:

gif.latex?%5Cbeta%20%3D%20%5Cfrac%7B%5Cmathcal%7BL%7D_%7BIoU%7D%5E*%7D%7B%5C%20%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D%5C%20%7D%20%5Cin%20%5B0%2C%20+%5Cinfty%29

离群度小意味着锚框质量高,我们为其分配一个小的梯度增益,以便使边界框回归聚焦到普通质量的锚框上。对离群度较大的锚框分配较小的梯度增益,将有效防止低质量示例产生较大的有害梯度。我们利用 gif.latex?%5Cbeta 构造了一个非单调聚焦系数并将其应用于 WIoU v1:

gif.latex?%5Cmathcal%7BL%7D_%7BWIoUv3%7D%3D%20r%5Cmathcal%7BL%7D_%7BWIoUv1%7D%2C%5C%20r%3D%5Cfrac%7B%5Cbeta%7D%7B%5Cdelta%20%5Calpha%5E%7B%5Cbeta%20-%20%5Cdelta%7D%7D

284b6e848eb8493ab4dada3ca606aab5.png

其中,当 gif.latex?%5Cbeta%20%3D%20%5Cdelta 时,gif.latex?%5Cdelta 使得 gif.latex?r%3D1。当锚框的离群程度满足 gif.latex?%5Cbeta%20%3D%20C (gif.latex?C 为定值)时,锚框将获得最高的梯度增益。由于 gif.latex?%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D 是动态的,锚框的质量划分标准也是动态的,这使得 WIoU v3 在每一时刻都能做出最符合当前情况的梯度增益分配策略

核心代码

安装完 git 后,在电脑上某个文件夹右键,点击“Open Git Bash here”,然后运行以下命令下载代码

git clone git@github.com:Instinct323/wiou.git

cd wiou

git checkout v1

IoU_Cal 类可以计算现有的边界框损失 (IoU,GIoU,DIoU,CIoU,EIoU,SIoU,WIoU),核心的类变量有:

  • iou_mean:即 gif.latex?%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D 的滑动平均值,每次程序刚开始运行时初始化为 1。如果训练中断导致该值重置,需要将该值恢复为中断前的值,否则会导致性能增速下降
  • monotonus:其指示了边界框损失使用单调聚焦机制 (e.g., WIoU v2) 或是非单调聚焦机制 (e.g., WIoU v3),具体看该类的文档
  • momentum:遵循 gif.latex?m%20%3D%201-%20%5Csqrt%5Btn%5D%7B0.5%7D%2C%5C%20tn%20%3E%207000 的设置。当 gif.latex?m 足够小时,验证集的 IoU 基本不影响 gif.latex?%5Coverline%7B%5Cmathcal%7BL%7D_%7BIoU%7D%7D 的值,此时不需要使用 eval 和 train 函数指定训练模式;否则需要使用 eval 和 train 函数指定训练模式

此外,聚焦机制会对边界框损失的值进行缩放,具体通过实例方法 _scaled_loss 实现

其中,WIoU v3 包含 α, δ 两个超参数,不同的超参数可能适用于不同的模型和数据集,需要自行调整 _scaled_loss 的缺省值以找到最优解

在将 WIoU v3 引进 YOLOv7 时,先在 train_aux.py 中找到损失函数的位置。ComputeLossAuxOTA 是 train 的时候用的,找到其源代码并进行修改

因为 YOLOv7 对模型性能的比较主要利用 utils/metrics 里的 fitness 函数,与损失值无关。而 ComputeLoss 是在 eval 的时候用的,保证不出 bug 就行

0508a93be9ad4772b22ab6a726a531c9.png

在初始化函数动一下手脚,指定使用的损失函数

5a3d0b0aa3ab467ab83e19f5e0b8ffe7.png

再修改 __call__ 函数 (修改的行已用书签标注出) 

ee8d4a9abc2947fabca2834658619e88.png

5fa94fde15284c66a6c65b7f60a1014c.png

再找到 bbox_iou 函数的所在位置,修改边界框损失的计算方法

这里因为形参、返回值都和原函数不同,所以要检查 ComputeLoss 中调用这个函数的地方,以防报错

  1. def bbox_iou(box1, box2, type_, x1y1x2y2=True):
  2. # Returns the IoU of box1 to box2. box1 is 4, box2 is nx4
  3. box2 = box2.T
  4. # Get the coordinates of bounding boxes
  5. if x1y1x2y2: # x1, y1, x2, y2 = box1
  6. b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]
  7. b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]
  8. else: # transform from xywh to xyxy
  9. b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2
  10. b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2
  11. b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2
  12. b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2
  13. # 将边界框信息拼接
  14. b1 = torch.stack([b1_x1, b1_y1, b1_x2, b1_y2], dim=-1)
  15. b2 = torch.stack([b2_x1, b2_y1, b2_x2, b2_y2], dim=-1)
  16. self = IoU_Cal(b1, b2)
  17. loss = getattr(IoU_Cal, type_)(b1, b2, self=self)
  18. iou = 1 - self.iou
  19. return loss, iou
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/271266
推荐阅读
相关标签
  

闽ICP备14008679号