Deformable DETR:结合多尺度特征、可变形卷积机制的DETR
写在前面
DETR存在两个问题:
- 收敛速度慢:初始注意力权重在所有位置几乎没有区分性,需要长时间训练才能学习到稀疏的有意义的位置信息;
- 小目标性能差:只使用了单一尺度特征图,没有利用到多尺度特征图,而且随着特征图图尺度增大,Transformer计算量指数增长。
针对上述两个问题,文章提出Deformable-DETR,将可变形卷积(deformable convolution,不了解原理的同学可自行查阅)处理稀疏空间位置的机制和transformer的全局建模能力结合起来,缓解了收敛速度慢的问题(收敛速度提高10倍),同时提出的deformable attention机制可扩展到多尺度特征,从而进一步提高了小目标的检测性能,一举两得。
除了模型本身的创新,文章还有如下贡献:
- 提出一种边界框迭代优化机制;
- 尝试了两阶段的方案,即由Deformable DETR的一个变体产生推荐区域(region proposal),然后上述推荐区域再被进一步送到解码器进行边界框迭代优化,相当于借鉴了传统两阶段目标检测器的做法。
一、模型
模型的核心模块是deformable attention module,该模块进一步可扩展应用于多尺度特征图成为multi-scale deformable attention module;然后通过替换encoder和decoder中相应的注意力模块,得到deformable transformer encoder和deformable transformer decoder,接下来将逐一进行介绍。
1. Deformable Attention Module
目的:为了解决transformer attention全局计算导致计算量较大的问题。
思想:计算注意力权重时,每个query只考虑参考点附近一小部分固定数量的key,如此一来计算量就大大降低了,跟特征图尺寸也无关了。
PS:这里的key实际上来自于value中采样的某几个值。
但现在就有一些疑问了:
- 该模块中,query、key和value怎么获得?
- 参考点(referenquece point)是什么?
- key的数量如何确定?
带着上述问题,结合图例和公式进一步了解该模块的机制(不了解多头注意力机制的伙伴可以自行补课)。
首先解释一下公式和图中符号的含义:
- 下标q:query的索引,即第几个query;
- 下标m:head的索引,M表示head总数;
- 下标k:key的索引,K表示key的总数;
- :由特征图得到value的线性映射层的权重;
- :由加权value得到output的线性映射层的权重;
- :添加位置编码的特征图在某个(x,y)位置的特征向量,作为query;
- :query对应的参考点,即query本身在特征图中的位置坐标;
- :相对于参考点的偏移量,表示:在第m个head中,对于第q个query,第k个key的偏移量;
- :注意力权重,表示:在第m个head中,第q个query和第k个key计算得到的注意力权重;其中,即在一个head中注意力权重之和为1;
- :特征图,代码中特征图实际上是被flatten成了序列,但为了方便展示图中仍绘制成了二维的形式;
结合上图回答之前的问题:
- query由特征图加上位置编码获得,即;
- value由特征图经过一个线性映射得到;
- 对于某个query而言,它的参考点就是它本身的坐标;
- key由参考点坐标加上偏移量,在value上采样得到,key的数量K是个超参数,图中K=3,代码中K=4;
- 偏移量由query经过一个线性映射得到,此处便是引入可变形卷积思想的地方;
- 注意力权重A由query经过一个线性映射和softmax得到;
- output根据value和A进行矩阵运算再经过一个线性映射层得到。
2.Multi-scale Deformable Attention Module
DETR只使用了单尺度特征图,但现在大多数检测器都通过利用多尺度特征增强检测效果。接下来分析一下可变形注意力模块是如何扩展到多尺度特征上的。
与之前相比,变化如下:
- 模块的输入由单尺度变为了多尺度,L表示特征图的索引;
- key的采样个数由单尺度的K个变成了多尺度的LK个;
- 对参考点坐标进行归一化表示,即,绝对坐标会在多个特征图之间发生混淆;
- 添加了新的函数,将归一化的参考点坐标重新缩放到对应尺寸特征图中的坐标(怎么进行缩放的我还没细看= = 、);
- 注意力权重归一化方式改变,变为,即在第m个head中,对于第q个query,所有尺度特征图上的所有key计算出的权重和为1。
然而,实际操作过程稍有不同,如下图所示:
不同尺度的特征图被flatten后首尾拼接,作为一个整体输入到模块中。当然,为了区分不同特征图的token,在flatten之前除了添加位置编码外还会额外添加了可学习的层编码,同时会记录每个特征图第一个token的位置信息。
因此我们可以发现,来自不同尺寸特征图的token在进行自注意力操作时相互之间是可以交互的。所以文中提到不需要FPN结构对特征进行融合,同时也进行了相应的消融实验证明。
但此处我有个疑惑,来自不同特征图的token表征的语义层级不同,这是否对交互造成影响。但根据文中做的与FPN结构的消融实验结果来看,似乎影响不大。
3. Deformable Transformer Encoder
将encoder中的自注意力模块替换为multi-scale deformable attention module即可。
4. Deformable Transformer Decoder
关于decoder的修改有两点:
- 交叉注意力模块替换为文中提出的可变形注意力模块;
- 检测头(detection head)的预测变成了偏移量。
(1)注意力机制的修改
decoder中有自注意力和交叉注意力两种模块,其中交叉注意力模块中的key来自经过encoder增强后的特征图,而自注意力模块中的key是来自于query。文中提出的可变形注意力模块是为了将卷积得到的特征图作为key而设计,因此只替换了decoder中的交叉注意力模块,保留了自注意力模块。
PS:除此之外,关于为什么不将自注意力模块也替换成单尺度可变形注意力模块,我还想到一个原因:decoder的自注意力模块起到了NMS的作用,如果替换成可变形注意力模块,则token之间不能充分交互,NMS效果就会减弱。这只是我个人推测。
注意!将交叉注意力模块替换为可变形注意力模块后,还缺少一个重要的参数——那就是query的参考点。在encdoer中,query来自于特征图,参考点就是query本身对应的坐标。但decoder中的query是随机初始化的向量,没有对应的参考点坐标。如何得到参考点呢?看下面的示意图:
decoder中可变形注意力机制的2d参考点由object query经过一个可学习的线性映射和sigmoid函数得到。
PS:在DETR的decoder中,由query得到坐标参数这一步骤由最后的检测头完成。但在Deformable DETR的decoder中,额外的线性映射层可以让我们从每个object query提前得到一个2d参考点坐标点。如此一来,既然有了一个参考点,作者就将检测头预测的目标也进行了相应的修改。
(2)边界框预测目标的改变
因为多尺度可变形注意力模块是从参考点周围提取图像特征,decoder中的参考点坐标由object query得到,而object query可以看作是预测框坐标信息的向量表示,因此作者将参考点坐标作为预测框的初始中心点,将边界框预测分支预测的目标由预测框的中心点坐标、高和宽改为对于参考点的相对偏移量、高和宽。
这样,学习到的解码器注意力与预测的边界框具有较强的相关性,这加速了训练收敛的过程。
三、Deformable DETR的其他改进及其变体
1. 边界框迭代优化策略
简单来说,就是decoder中每一层都会基于上一层的输出进行优化。
了解DETR的朋友知道,decoder每一层的输出都会经过一个分类头和一个回归头,然后计算输出的loss作为辅助loss优化模型,不同层对应的分类头和回归头共享参数。
而Deformable DETR的decoder每一层的输出得到的预测框坐标除了用于计算辅助loss外,还作为下一层的输入继续优化。
举个列子:比如decoder第d-1层的输出经过回归头得到预测框的坐标参数为,那第d层对应回归头的输出就是,即该层回归头预测的目标是偏移量。同时,对于第d层而言,和作为新的参考点,对参考点预测的偏移量会受到高宽参数的调制。
PS:这样的做法使得采样位置与先前预测框的中心和大小是相关的。但如果先前预测框不准会不会影响模型性能?这是我的疑惑。
现在有个问题,对于这种边界框迭代优化策略,每一层预测的都是偏移量。但是decoder的第一层只有参考点作为中心坐标,高宽是没有的。文中的做法是用0.1作为高宽的初始值,同时还提到模型对于高宽初始值的选择是鲁棒的(0.05,0.1,0.2,0.5都得到了相似的性能)。但是Deformable DETRdecoder每一层对应的分类头和检测头的参数是不共享的。个人还不太理解为什么这么设置。
2. Two-Stage Deformable DETR
第一阶段:encoder输出特征图,分类头和回归头应用于特征图上的每个token,根据每个token都能的到一个预测框,其坐标参数如下:
其中i表示来自特征尺度的一个token的索引,这个token有对应的归一化的坐标,各偏移量是由回归头得到,s=0.05。然后挑选得分较高的预测框(数量跟object query的数量相同)作为region proposals。
第二阶段:region proposals被送入decoder作为边界框迭代优化策略的初始边界框,object query的位置编码被设置为region proposals坐标的位置编码。
我个人理解,每个region proposal都是从一个token得到,把所有region proposal对应token的位置编码当作object query,如此一来也实现了把object query编码与特征图位置编码统一在了同一编码空间。
PS:既然得到了region proposal,我们也可以直接用region proposal作为object query,即把object query建模为bounding box四个坐标的形式,这就是DAB-DETR的思想,有机会再进行分享。
论文结果啥的就不放了,很直观,应该能看懂。文中有错误之处还请大佬批评指正。