目录

End-to-End Object Detection with Transformers

记录论文《End-to-End Object Detection with Transformers》阅读过程中的一些思考。

简介

论文获取:arXiv | 网盘备份

DETR目标检测建模为集合预测问题,去除了 AnchorNMS 等手工设计组件,实现了真正的端到端检测。

概念

集合预测损失 / Set prediction loss

DETR 在解码器的单次传播中推断出一个固定大小为 $N$ 的集合,其中 $N$ 是一个显著大于图像中目标典型数量的预设值。 DETR 的损失函数在预测目标和真值目标之间找出最优二部匹配(Optimal Bipartite Matching),再优化特定目标(边界框)的损失。

令 $y$ 表示真值目标的集合,且 $\hat{y} = \left\{\hat{y}_i\right\}^N_{i=1}$ 表示 $N$ 个预测目标的集合。如果 $N$ 大于图片中实际目标的数量,可通过填充足够 $\varnothing$ (即无目标)而视 $y$ 为一个大小为 $N$ 的集合。

文中通过在所有 $N$ 元排列 $\sigma \in\mathfrak{S}_N$ 中搜索代价最小的排列,从而求得最优二部匹配,即 $$\hat\sigma = \argmin_{\sigma \in \mathfrak{S}_N} \sum_{i=1}^{N} \mathcal{L}_{match}(y_i, \hat y_{\sigma(i)})$$ 其中, $\mathcal{L}_{match}(y_i, \hat y_{\sigma(i)})$ 是真值 $y_i$ 和索引 $\sigma(i)$ 处的预测值之间的配对代价,定义为: $$\mathcal{L}_{match}(y_i, \hat y_{\sigma(i)}) = -\mathbb{1}_{\left\{c_i \neq \varnothing\right\}}\hat{p}_{\sigma(i)}(c_i)+\mathbb{1}_{\left\{c_i \neq \varnothing\right\}}\mathcal{L}_{box}(b_i, \hat{b}_{\sigma(i)})$$ 其中,

  • 真值集合中第 $i$ 元素可看作 $y_i = (c_i,b_i)$ ,其中
    • $c_i$ 是目标类别标签(可以为 $\varnothing$)
    • $b_i \in [0,1]^4$ 是定义了边界框(Bounding Box)真值的中心点坐标和其相对于图像尺寸的宽高比例的向量
  • 而预测集合第 $\sigma_i$ 排列中
    • 类 $c_i$ 为预测值的概率为 $\hat{p}_{\sigma(i)}(c_i)$
    • 边界框的预测值为 $\hat{b}_{\sigma(i)}$
  • $\mathbb{1}$ 为示性函数,由此亦可知,当 $c_i = \varnothing$ 时,有 $\mathcal{L}_{match}(y_i, \hat y_{\sigma(i)}) = 0$

显见,该配对代价同时考虑了类预测以及预测框和真值框之间的相似性。且其最优分配可以基于匈牙利算法(Hungarian algorithm)高效地计算出。

最优匹配损失函数,亦称匈牙利损失(Hungarian loss),定义与常见目标检测器的损失函数定义类似,即类预测负对数似然和稍后定义的边界框预测损失的线性组合: $$\mathcal{L}_{Hungarian}(y, \hat{y}) = \sum_{i=1}^{N} \left[-\log \hat{p}_{\hat\sigma(i)}(c_i) + \mathbb{1}_{\left\{c_i \neq \varnothing\right\}} \mathcal{L}_{box}(b_i, \hat{b}_{\hat\sigma(i)})\right]$$ 其中, $\hat\sigma$ 是前面计算出的最优匹配,而 $\mathcal{L}_{box}(b_i, \hat{b}_{\hat\sigma(i)})$ 即为边界框预测的损失,定义为: $$\mathcal{L}_{box}(b_i, \hat{b}_{\hat\sigma(i)}) = \lambda_{L_1}\mathcal{L}_{L_1}\left(b_i,\hat b_{\hat\sigma(i)}\right) + \lambda_{iou}\mathcal{L}_{iou}\left(b_i,\hat b_{\hat\sigma(i)}\right)$$ 其中,

  • $\lambda_{L_1}, \lambda_{iou} \in \mathbb{R}$ 是超参数
  • $\mathcal{L}_{L_1}\left(b_i,\hat b_{\hat\sigma(i)}\right) \coloneqq \left\Vert b_i-\hat b_{\hat\sigma(i)} \right\Vert_1$ 是边界框的 $L_1$ 损失
  • $\mathcal{L}_{iou}\left(b_i,\hat b_{\hat\sigma(i)}\right) \coloneqq 1-GIoU$ 是边界框的交并比损失,其中 $GIoU$ 为其广义交并比(Generalized Intersection of Union, GIoU)
  • 这两项损失都需要在 batch 范围内通过目标数量进行归一化
衡准

训练的主要困难之一是如何量化预测目标(的类别、位置、尺寸)关于其真实值之间的差异。

探微

Q1: 为什么配对代价损失函数的计算公式不相同,即为什么使用负对数且没有示性函数标记?

A:

损失函数的类预测项中使用负对数,是因为

  • 从概率论角度,对于给定的预测概率分布 $\hat p$ ,如果希望最大化真值标签的预测概率 $\max \hat{p}_{\hat\sigma(i)}(c_i)$ ,依据最大似然估计(Maximum Likelihood Estimation, MLE),其等价于最小化 $\min -\log \hat{p}_{\hat\sigma(i)}(c_i)$
  • 从信息论角度,对于真实分布 $p$ 和预测分布 $\hat p$ 的交叉熵为 $$H(p, \hat{p}) = -\sum_c p(c) \log \hat{p}(c)$$ 其中真值标签为独热编码,有 $p(c_i) = 1$ ,其余为 $0$ ,因此有 $H(p, \hat{p}) = -\log \hat{p}_{\hat\sigma(i)}(c_i)$
  • 从梯度计算角度,相比直接使用概率 $-\hat p$ 时的梯度为 $-1$ ,使用负对数 $-\log \hat{p}$ 的梯度为 $-\frac{1}{\hat{p}}$ ,当模型预测错误时,即 $\hat p$ 很小时, $-\frac{1}{\hat{p}}$ 可以产生很强的梯度信号快速纠正模型
  • 从数值稳定性角度,小概率乘积(如 $p_1 \times p_2 \times \cdots$ )容易下溢(underflow)从而退化为 $0$ ,而对数和(如 $\log p_1 + \log p_2 + \cdots$ )不容易出现。

而在配对代价中直接使用概率,是因为这样可以与边界框预测代价的量纲相同,并且在实践中观察到这样做可以拥有更好的性能。

另一方面,损失函数类预测损失项不仅考虑到有目标的情形,对无目标的损失亦有计算,且考虑到目标、 $\varnothing$ 的类别数量不平衡,将对数概率项的权重缩小 $10$ 倍,使模型能慢慢学会区分 $\varnothing$ ,即哪些是背景。

而对于配对代价使用示性函数让 $\varnothing$ 与任意目标的配对代价归零,即与预测无关,可以收集那些困难的预测。

Q2: 为什么边界框预测损失要定义成这样的两项之和?

第一项边界框的 $L_1$ 损失具有简单、直观的特点,但对于相对误差接近,而尺度不同的边界框,该项损失差异巨大。

引入第二项,即边界框的交并比损失,其具有尺度不变(scale-invariant)特性,可以缓解该问题。

对于任意两个凸形状 $A, B \subseteq \mathbb{S} \in \mathbb{R}^n$ ,可以找到它们的最小外接凸形状 $C \subseteq \mathbb{S} \in \mathbb{R}^n$ ,从而有定义: $$IoU \coloneqq \frac{|A \cap B|}{|A \cup B|}$$ 和 $$GIoU \coloneqq IoU - \frac{|C\setminus(A \cup B)|}{|C|}$$ 其中, $|\cdot|$ 运算表示“求面积”。

文中,没有使用 $IoU$ 而是使用 $GIoU$ ,是因为前者在两边界框不相交时 $IoU = 0$ ,无法给出优化方向。

相关计算的伪代码可参考

交并比
交并比损失
位置编码 / Positional Encoding

原始图像 $x_{img} \in \mathbb{R}^{3\times H_0 \times W_0}$ ,经过传统 CNN 骨干网络后生成一个较低分辨率的激活图 $f \in \mathbb{R}^{C \times H \times W}$ ,其参数典型值设定为 $C=2048, H=\frac{H_0}{32}, W=\frac{W_0}{32}$ 。再通过 $d$ 个 $1 \times 1 \times C$ 的卷积核减少该高层激活图 $f$ 的通道数并创建新的特征图 $z_0 \in \mathbb{R}^{d \times H \times W}$ 。经典 Transformer 中,编码器的输入是 tokenembedding 序列,在 DETR 中为了匹配这种输入形式,将 $z_0$ 的空间维度折叠成一维,得到新的特征图 $z \in \mathbb{R}^{d \times HW}$ 作为输入。

与经典 Transformer 类似, DETR 使用 attention mechanisms 同样面临其排列不变(permutation-invariant)的特点,为了保证对图像中位置的敏感性,需要对输入注入位置编码,不过与前者略有不同, DETR编码器的每一个 attention layer 都添加了位置编码

衡准

参见

探微

Q1: 为什么 DETR 在每一个注意力层都注入位置编码

相比经典 Transformer 中只在最下方的编码器解码器块中添加位置编码DETR 在每一个注意力层都注入了位置编码

  • 底层施加的位置编码在经过多层自注意力的组合、融合、变换后位置信息逐层衰减
  • DETR 处理的图像空间信息,相比经典 Transformer 的序列任务更依赖位置约束
对象查询 / Object queries

DETR解码器与经典 Transformer 同样使用多头自/交叉(encoder-decoder, or cross)注意力机制。但与后者使用自回归模型串行地预测输出不同, DETR 并行地预测 $N$ 个目标。由于解码器同样具有排列不变的特性,相同的输入必然产生相同的输出,因此需要 $N$ 个互不相同的输入。文中将这 $N$ 个可学习位置嵌入( positional embeddings)称为对象查询(object queries)

衡准
探微

Q1: 为什么 DETR解码器的每一个注意力层都使用对象查询

与在每一个注意力层都注入位置编码的动机类似,若只在一层施加对象查询,经过多层自注意力的组合、融合、变换后查询身份信息会逐层衰减。

在每一个注意力层都注入对象查询可以反复提醒每个 query 聚焦于它的职责。