【论文阅读】Conditional/DAB-DETR

Conditional-DETR

通过引入“条件交叉注意力”机制,显著加快了训练速度。

在 DETR 中,DETR Decoder 的 Cross-Attention 如下图所示(图来自 DETR 原文,Cross-Attention 是右边分支中间位置的模块),是对 Encoder 的输出和 Object Query 做交叉注意力的模块,会有三个输入:

Queries:每个 Query 都是 Decoder 第一层 Self-Attention 的输出 (Content Query) + Object Query (Spatial Query),这里的 Object Query 就是 DETR 中提出的概念,每个 Object Query 都是候选框的信息,经过 FFN 后能输出位置和类别信息。

Keys:每个 Key 都是 Encoder 的输出特征( Content Key ) 与 位置编码( Spatial Key )相加构成的。

Values:只有来自 Encoder 的输出。

基于上面提到的 Content 和 Spatial 的概念,本文的动机来源于以下实验结论:

在 Cross-Attention 中,Content Embedding 贡献很大,Spatial Embedding 贡献很小。假设移除 Key 中的 Positional Embedding 和 第二层 Decoder Layer 的 Object Query,只使用 Key 和 Query 中的 Content Embedding,AP 只会下降很小的值。

模型架构

整体的结构与 DETR 相似,区别在于 Cross-Attention 模块的输入。跨注意力机制旨在 定位 不同区域、四个边缘区域用于框检测 和 框内区域 用于对象分类,并聚合相应的 Embedding。我们提出了一种条件交叉注意力机制,引入了条件空间查询,以改善定位能力并加快训练过程。

DETR 中的交叉注意力机制

DETR 中的交叉注意力机制需要三个输入:Query、Key 和 Value,每个 Key 都由一个 Content Key ck\bold{\text{c}}_k**(从编码器中输出的图像特征)和 一个 Spatial Key pk\bold{\text{p}}_k(对应的归一化二维坐标的 PE)**相加。

在原始的 DETR 方法中,Decoder 的交叉注意力机制的每个 Query 都是由一个 Content Query cq\bold{\text{c}}_q(自注意力机制的输出)和 一个 Spatial Query pq\bold{\text{p}}_q(Object Query oq\text{o}_q)相加。在文章实现中,作者使用了 N=300N=300 个 Object Query,每个 Query 在一个解码器层输出一个候选的检测结果。

注意力权重是基于 Query 和 Key 之间的点乘获得的:

(cq+pq)(ck+pk)=cqck+cqpk+pqck+pqpk=cqck+cqpk+oqck+oqpk.\begin{aligned}&(\mathbf{c}_q+\mathbf{p}_q)^\top(\mathbf{c}_k+\mathbf{p}_k)\&= \mathbf{c}_q^\top\mathbf{c}_k+\mathbf{c}_q^\top\mathbf{p}_k+\mathbf{p}_q^\top\mathbf{c}_k+\mathbf{p}_q^\top\mathbf{p}_k\&= \mathbf{c}_q^\top\mathbf{c}_k+\mathbf{c}_q^\top\mathbf{p}_k+\mathbf{o}_q^\top\mathbf{c}_k+\mathbf{o}_q^\top\mathbf{p}_k.\end{aligned}

条件交叉注意力机制(Conditional Cross-Attention)

条件交叉注意力机制 通过将从解码器自注意力输出的 Content Query cq\text{c}_q 与 Spatial Query pq\text{p}_q 连接在一起来形成查询。相应地,Key 是由 Content Key ck\text{c}_k 和 Spatial Key pk\text{p}_k连接形成的。

交叉注意力权重包括两个部分,内容注意力权重**(Content Attention Weight)和空间注意力权重(Spatial Attention Weight)**。这两个权重来自于两个点积,内容点积和空间点积。

cqck+pqpk\mathbf{c}_q^\top\mathbf{c}_k+\mathbf{p}_q^\top\mathbf{p}_k

与 原始DETR 的 cross-attention 不同点在于,我们的机制将 cq\text{c}_q pq\text{p}_q 的角色分开,使得它们分别关注内容和空间注意力权重。

其中, cq\text{c}_q 是由编码器的自注意力模块或直接从前一层编码器的输出**(即Decoder Embedding)**中生成的。

pq\text{p}_q 的计算方式则不一样。首先要确定的是,不同区域的空间信息是由两个因素共同决定的,即 编码器嵌入**(Decoder Embedding)** 和 参考点(Reference Point)。然后将它们映射到嵌入空间,形成 pq\text{p}_q,使得 ****cq\text{c}_q 与 ****ck\text{c}_k 的 2D坐标 被映射到相同的空间中。

Decoder Embedding 包含不同区域相对于参考点的位移。模型的框预测过程如下式所示,包括两个步骤:(1) 在非归一化空间中相对于参考点预测框(2) 将预测框归一化到范围 [0,1][0, 1]

b=sigmoid(FFN(f)+[s,0,0]).\mathbf{b}=\mathrm{sigmoid}(\mathrm{FFN}(\mathbf{f})+[\mathbf{s}^{\top},0,0]^{\top}).

其中,f \mathbf{f} 是 Decoder Embedding, b\mathbf{b} 是一个有四个维度的向量 [bcxbcybwbh]\begin{bmatrix}b_{cx}&b_{cy}&b_w&b_h\end{bmatrix}^\top ,包含预测框的中心宽高。sigmoid()\mathrm{sigmoid}() 用于将结果归一化到 [0,1][0,1]FFN()\mathrm{FFN}() 的目标是预测未归一化的预测框,s\mathbf{s} 则是未归一化的 2D 参考点坐标(在原始DETR中是 (0,0(0,0))。在我们的方法中,我们考虑两种选择:将参考点 s\mathbf{s} 作为每个候选框预测的参数进行学习,或者从相应的 oq\mathbf{o}_q 中生成它(实际实现中选择了第二种)。

参考点 s\mathbf{s} 通过 将 Object Query oq\mathbf{o}_q 送入一个 FFN()FFN() 得到。

s=FFN(oq)\mathbf{s}=\operatorname{FFN}(\mathbf{o}_q)

**步骤(1)**意味着解码器嵌入 f \mathbf{f} 包含四个极端(形成框)相对于未标准化空间中参考点 s\mathbf{s} 的位移。这意味着 ① 确定不同区域的空间信息② 四个边缘 以及 ③ 用于预测分类分数的区域 都需要嵌入 f \mathbf{f} 和参考点 s\mathbf{s}

条件空间查询预测(Conditional spatial query prediction)

根据 Decoder Embedding f\mathbf{f} 和参考点 s\mathbf{s} 预测条件空间查询 (s,f)pq(\mathbf{s},\mathbf{f})\to\mathbf{p}_q,使其与 Key 的标准化二维坐标映射到的位置空间保持对齐,这个过程与结构图中灰色区域对应。

首先将参考点 s\mathbf{s} 归一化,然后以 与 Key 的位置嵌入相同的方式 将其映射到 256 维正弦 Positional Encoding。

ps=sinusoidal(sigmoid(s))\begin{aligned}\mathbf{p}_s=\text{sinusoidal}(\text{sigmoid}(\mathbf{s}))\end{aligned}

然后,我们通过一个前馈神经网络(FFN),将 Decoder Embedding f\mathbf{f} 中包含的位移信息映射到同一空间中:T=FFN(f)\mathbf{T}=\mathrm{FFN}(\mathbf{f})

条件空间查询是通过将 ps\mathbf{p}_s在 Embedding 空间中进行转换来计算的:pq=Tps\mathbf{p}_q=\mathbf{T}\mathbf{p}_s,选择简单且计算效率高的投影矩阵,即对角矩阵。256256 个对角元素用向量 λq\lambda_q 表示。通过逐元素乘法计算条件空间查询。

pq=Tps=λqps\mathbf{p}_q=\mathbf{T}\mathbf{p}_s=\mathbf{\lambda}_q\odot\mathbf{p}_s

额外消融实验(自行补充)

对于 Cross-Attention 中的 K 和 Q,作者使用了 Concat 的方式将 Content Embedding 和 Spartial Embedding 连接在一起,但没有做直接相加的消融实验,因此进行补充。

使用 Resnet50 的 backbone 训练 75 个 epoch,消融实验的结果如下:

模型 Embedding 连接方式 mAP 指标
原始 DETR(原始论文数据) Add 42.0(500 epoch 的结果)
原始 DETR(复现) Add 40.7(300 epoch 的结果)
Conditional-DETR(原始论文数据) Concat 42.1
Conditional-DETR(复现) Concat 41.8
Conditional-DETR(复现) Add(更改后) 40.7(退化到原始DETR)

DAB-DETR

作者提出了一种新的 DETR 范式,这种范式直接使用 **框坐标(Box Coordinates)**作为 Transformer Decoder 中的 Query,并且逐层地动态优化它们。使用框坐标不仅可以利用显式的位置先验来改善 DETR 中的 Query 到 Feature 的相似度匹配,并消除训练收敛缓慢的问题;还可以通过框的宽度和高度信息调节位置注意力图。这样的设计清楚地表明,在 DETR 中 Queries 可以通过级联方式逐层执行 软 ROI 池化 来实现。

为什么 DETR 中的位置先验可以加速训练?

很多工作都致力于优化 DETR 模型的训练收敛速度,然而缺少一个对它们有效性的统一理解。比较 DETR 的编码器中的自注意力模块与解码器中的交叉注意力模块,我们发现它们输入之间的关键差异来自于 Query。

上图为 DETR 中编码器的自注意力机制和解码器的交叉注意力机制的比较。它们具有相同的 Key 和 Value,唯一的区别来自 Query。编码器中的每个 Query 由 **图像特征(内容信息)**和一个 PE(位置信息) 组成,解码器中的每个 Query 由 Decoder Embedding(内容信息)Learnable Query(位置信息) 组成。这两个模块之间的不同之处用紫色标记。

由于 Decoder Embedding 被初始化为 0,所以在第一个交叉注意力模块之后,它们被投影到与图像特征相同的空间。在那之后,它们将在 Decoder Layer 中经历与图像特征在 Encoder Layer 中相似的过程。因此,位置先验加速训练的根本原因来源于 Learnable Query

也就是说,Decoder 的 Key 和 Value 与 Encoder 的组成完全相同,但是 Query 则不同。Query 的语义部分来自于 Decoder Embeddings,对应上层的输入,是由图像特征组合来的。而位置部分则来自于 Learnable Queries,因此 Decoder 的 Learnable Query 实际指代的是位置信息。

在交叉注意机制中导致模型训练收敛速度缓慢问题的两个可能的原因是:1) Queries 的优化可能较难,导致训练需要更长时间来收敛;2) Learnable Query 中的位置信息与用于图像特征的正弦位置编码的编码方式不同。

为了检查是否为第一个原因,作者从一个已经训练好的 DETR 模型中提取出查询,并将其固定,不再对查询进行更新,只训练其他模块。发现固定查询只在非常早期的 Epoch 中略微改善了收敛速度,例如前 25 个轮次。因此,Query 的学习(或优化)可能不是关键问题。

于是作者转向第二种可能性,尝试找出学到的查询是否具有一些不良特性。DETR 的查询使用了一组可学习的高维向量作为位置部分,而图像特征的位置信息采用正弦位置编码(Sinusoidal Positional Encoding)。这两种编码方式的不一致可能导致:1) 注意力分布不明确:查询的位置信息无法与图像特征的位置信息有效匹配;2) 注意力范围不集中:导致模型无法快速定位目标。

因此,作者将 DETR 中的 Query 范式更改为动态的 Anchor Boxes,从而强制每个 Query 只关注某个特定的区域,并强制关注对象的宽、高信息。

image.png

模型结构

image.png

DAB-DETR 直接预设了 NN 个可学习的 Anchor。然后经过宽高调制交叉注意力模块,预测出每个锚框的四个元素偏移量来更新 Anchor。

直接学习 Anchor Boxes

在每个解码器层中有两个注意力模块,包括自注意力模块和交叉注意力模块,分别用于查询更新和特征探测。每个模块需要 Query、Key 和 Value 来执行基于注意力的值聚合,然而这些三元组的输入是不同的。

Aq=(xq,yq,wq,hq)A_q = (x_q,y_q,w_q,h_q) 记为第 qq 个 Anchor,xq,yq,wq,hqRx_q,y_q,w_q,h_q\in\mathbb{R}CqRDC_q\in\mathbb{R}^DPqRDP_q\in\mathbb{R}^D 作为它们相应的 Content Query 和 Positional Query,DD 是 Decoder Embedding 和 Positional Queries的维度。

给定一个 AqA_q,它的 Positional Query 由下式生成:

Pq=MLP(PE(Aq))P_q=\text{MLP}(\text{PE}(A_q))

其中 PE\text{PE} 表示位置编码,用于从浮点数生成正弦嵌入,而 MLP\text{MLP} 的参数在所有层之间共享。由于 AqA_q 是一个四元数,因此我们将 PE\text{PE} 运算符重载为:

PE(Aq)=PE(xq,yq,wq,hq)=Cat(PE(xq),PE(yq),PE(wq),PE(hq))\begin{aligned}\text{PE}(A_q)=\text{PE}(x_q,y_q,w_q,h_q)=\text{Cat}(\text{PE}(x_q),\text{PE}(y_q),\text{PE}(w_q),\text{PE}(h_q))\end{aligned}

符号 Cat\text{Cat} 表示连接函数。具体实现中,有 PE:RRD/2\text{PE}: \mathbb{R}\to\mathbb{R}^{D/2}MLP:R2DRD\text{MLP}: \mathbb{R}^{2D}\to\mathbb{R}^{D},因此最后的输出为 RD\mathbb{R}^{D}MLP\text{MLP} 块有两个子模块,每个子模块由一个线性层一个 ReLU 激活组成,特征缩减在第一个线性层进行。

在自注意力模块中,Query、Key 和 Value 都拥有相同的内容项,而 Query 和 Key 则包含了额外的位置项:

Self-Atten: Qq=Cq+Pq,Kq=Cq+Pq,Vq=Cq\begin{aligned}Q_q=C_q+P_q,\quad K_q=C_q+P_q,\quad V_q=C_q\end{aligned}

受 Conditional-DETR 启发,在交叉注意力模块中 将位置信息和内容信息连接在一起,从而能够解耦 Query → Feature 相似度 的 内容信息位置信息 的贡献,计算方法是将 Query 与 Key 之间的点积。为了重新调整位置嵌入,我们利用 条件空间查询conditional spatial query,与 Conditional-DETR 的做法完全一致)。更具体地说,我们学习一个MLP(csq):RDRD\mathrm{MLP}^{(\mathrm{csq})}:\mathbb{R}^D\to\mathbb{R}^D,以获得与内容信息有关的尺度向量,并将其用于与 Positional Embedding 执行逐元素乘法。

Cross-Atten: Qq=Cat(Cq,PE(xq,yq)MLP(csq)(Cq)),Kx,y=Cat(Fx,y,PE(x,y)),Vx,y=Fx,yQ_q=\text{Cat}(C_q,\text{PE}(x_q,y_q)\cdot\text{MLP}^{(\text{csq})}(C_q)),\K_{x,y}=\text{Cat}(F_{x,y},\text{PE}(x,y)),\quad V_{x,y}=F_{x,y}

在这里,Fx,yRD F_{x,y}\in\mathbb{R}^D 是位置 (xy)(x,y) 处的图像特征,而 \cdot 表示逐元素乘法。Query 和 Key 中的 Positional Encoding 都是基于 2D 坐标生成的,这使得比较位置相似性更加一致,正如之前的工作所示。

Anchor 更新

使用坐标作为查询进行学习使得可以逐层更新它们。相比之下,对于高维嵌入的查询,很难进行逐层的查询优化,因为不清楚如何将更新后的锚点转换回高维查询嵌入。

我们通过一个预测头来预测相对的坐标偏移 (Δx,Δy,Δw,Δh)\begin{aligned}(\Delta x,\Delta y,\Delta w,\Delta h)\end{aligned},将他们与上一层的坐标相加就可以得到新的坐标。值得注意的是,所有的预测头共享权重。

宽度 & 高度自适应的高斯核

传统的位置注意力图被用作类似于高斯先验。但是这种先验信息被认为是各项同性且固定大小的,因此使他们的尺度信息被忽略了。为了改进这种位置先验,我们提议将尺度信息插入到注意力图中。

具体来说,在原始位置注意力图中,从 Query 到 Key 的相似度被计算为两个坐标编码的点积之和:

Attn((x,y),(xref,yref))=(PE(x)KPE(xref)Q+PE(y)KPE(yref))Q/D\begin{aligned}\text{Attn}((x,y),(x_{\text{ref}},y_{\text{ref}}))=(\overset{K}{\text{PE}(x)}\cdot\overset{Q}{\text{PE}(x_{\text{ref}})}+\overset{K}{\text{PE}(y)}\cdot\overset{Q}{\text{PE}(y_{\text{ref}}))}/\sqrt{D}\end{aligned}

其中 1/D1/\sqrt{D} 被用来调整值的尺度。

我们通过将相对锚点的宽度和高度分别除以其 xx 分量和 yy 分量来调制位置注意力图(在softmax之前),以平滑高斯先验,从而更好地匹配不同尺度的物体。

ModulateAttn((x,y),(xref,yref))=(PE(x)PE(xref)wq,refwq+PE(y)PE(yref)hq,refhq)/D\begin{aligned}\text{ModulateAttn}((x,y),(x_{\text{ref}},y_{\text{ref}}))&=(\text{PE}(x)\cdot\text{PE}(x_{\text{ref}})\frac{w_{q,\text{ref}}}{w_q}+\text{PE}(y)\cdot\text{PE}(y_{\text{ref}})\frac{h_{q,\text{ref}}}{h_q})/\sqrt{D}\end{aligned}

其中 wqw_qhqh_q 是 Anchor AqA_q 的宽和高,wq,refw_{q,ref}hq,refh_{q,ref}是相对宽高,由下式计算:

wq,ref,hq,ref=σ(MLP(Cq))w_{q,\text{ref}},h_{q,\text{ref}}=\sigma(\text{MLP}(C_q))

这种调制后的位置注意力帮助我们提取具有不同宽度和高度的对象的特征。

Temperature 调节

对于位置编码,我们使用正弦函数:

PE(x)2i=sin(xT2i/D),PE(x)2i+1=cos(xT2i/D)\begin{aligned}\text{PE}(x){2i}=\sin(\frac{x}{T^{2i/D}}),\quad\text{PE}(x){2i+1}=\cos(\frac{x}{T^{2i/D}})\end{aligned}

其中 TT 是手工设计的温度,上标 2i2i2i+12i + 1 表示编码向量中的索引。温度 TT 影响位置先验的大小,作者选择了 T=20T=20

Cross-Attention 的作用与 Soft-ROI Pooling

接下来说明 Decoder 中的 Cross-Attention 在做什么,以及与传统的 Faster RCNN 之间的关系。

我们看到,在 Attention 模块中,Query 和 Key 计算相似度,同时考虑了 Content 信息和 Positional 信息,计算出一个注意力图,然后使用这个注意力图从原始图片特征中提取特征。

这个步骤非常类似于传统两阶段检测器中的 ROI Pooling(或者 ROI Align)。但是由于注意力图是由 Query 和 Key 共同决定的,并不局限于物体框内信息,我们称之为 Soft ROI Pooling

这种调制的位置注意力帮助我们提取具有不同宽度和高度的对象的特征。

评论 (0)

暂无评论,来发表第一条评论吧!