End-to-End Object Detection with Transformers
记录论文《End-to-End Object Detection with Transformers》阅读过程中的一些思考。
简介
DETR 将目标检测建模为集合预测问题,去除了 Anchor、NMS 等手工设计组件,实现了真正的端到端检测。
概念
集合预测损失 / 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 中,编码器的输入是 token 的 embedding 序列,在 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 聚焦于它的职责。