当前位置: 首页 > news >正文

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的数量如何确定?

带着上述问题,结合图例和公式进一步了解该模块的机制(不了解多头注意力机制的伙伴可以自行补课)。

DeformAttn(z_{q},p_{q},x)=\sum_{m=1}^{M}W_{m}[\sum_{k=1}^{K}A_{mqk}\cdot W_{m}^{'}x(P_{q}+\Delta p_{mqk})]

首先解释一下公式和图中符号的含义:

  • 下标q:query的索引,即第几个query;
  • 下标m:head的索引,M表示head总数;
  • 下标k:key的索引,K表示key的总数;
  • W_{m}^{'}:由特征图得到value的线性映射层的权重;
  • W_{m}:由加权value得到output的线性映射层的权重;
  • z_{q}:添加位置编码的特征图在某个(x,y)位置的特征向量,作为query;
  • p_{q}:query对应的参考点,即query本身在特征图中的位置坐标;
  • \Delta p:相对于参考点的偏移量,\Delta p_{mqk}表示:在第m个head中,对于第q个query,第k个key的偏移量;
  • A:注意力权重,A_{mqk}表示:在第m个head中,第q个query和第k个key计算得到的注意力权重;其中\sum_{k=1}^{K}A_{mqk}=1,即在一个head中注意力权重之和为1;
  • x:特征图,代码中特征图实际上是被flatten成了序列,但为了方便展示图中仍绘制成了二维的形式;

结合上图回答之前的问题:

  • query由特征图x加上位置编码获得,即z_{q}
  • value由特征图x经过一个线性映射得到;
  • 对于某个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个;
  • 对参考点坐标进行归一化表示,即\widehat{p_{q}}\in[0,1]^{2},绝对坐标会在多个特征图之间发生混淆;
  • 添加了新的函数\phi_{l},将归一化的参考点坐标重新缩放到对应尺寸特征图中的坐标(怎么进行缩放的我还没细看= = 、);
  • 注意力权重归一化方式改变,变为\sum_{l=1}^{L}\sum_{k=1}^{K}A_{mlqk}=1,即在第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层的输出经过回归头得到预测框的坐标参数为(x,y,w,h),那第d层对应回归头的输出就是(x+\Delta x,y+\Delta y,w+\Delta w,h+\Delta h),即该层回归头预测的目标是偏移量(\Delta x, \Delta y,\Delta w,\Delta h)。同时,对于第d层而言,xy作为新的参考点,对参考点预测的偏移量\Delta p_{mlqk}会受到高宽参数的调制(\Delta p_{mlqk}w,\Delta p_{mlqk}h)

PS:这样的做法使得采样位置与先前预测框的中心和大小是相关的。但如果先前预测框不准会不会影响模型性能?这是我的疑惑。

现在有个问题,对于这种边界框迭代优化策略,每一层预测的都是偏移量。但是decoder的第一层只有参考点作为中心坐标,高宽是没有的。文中的做法是用0.1作为高宽的初始值,同时还提到模型对于高宽初始值的选择是鲁棒的(0.05,0.1,0.2,0.5都得到了相似的性能)。但是Deformable DETRdecoder每一层对应的分类头和检测头的参数是不共享的。个人还不太理解为什么这么设置。

 2. Two-Stage Deformable DETR

第一阶段:encoder输出特征图,分类头和回归头应用于特征图上的每个token,根据每个token都能的到一个预测框,其坐标参数如下:

\widehat{b_{i}}=\{\sigma(\Delta b_{ix}+\sigma^{-1}(\widehat{p_{ix}})),\Delta b_{iy}+\sigma^{-1}(\widehat{p_{iy}})),\Delta b_{iw}+\sigma^{-1}(2^{l_{i}-1}s),\Delta b_{ih}+\sigma^{-1}(2^{l_{i}-1}s)\}

 其中i表示来自特征尺度l_{i}\in\{1,2,...,L\}的一个token的索引,这个token有对应的归一化的坐标\widehat{p_{i}}=(\widehat{p_{ix}},\widehat{p_{iy}})\in[0,1]^{2},各偏移量\Delta是由回归头得到,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的思想,有机会再进行分享。

论文结果啥的就不放了,很直观,应该能看懂。文中有错误之处还请大佬批评指正。


http://www.mrgr.cn/news/54773.html

相关文章:

  • 2. 什么是注解?
  • 利用飞腾派进行OpenCV开发
  • 【设计模式七大设计原则】
  • 动态规划-子数组系列——413.等差数列划分
  • 求刚体移动后的转换矩阵
  • [论文阅读]RGB-Depth Fusion GAN for Indoor Depth Completion再阅读
  • Python画笔案例-089 绘制 三角圆图
  • 11.useComponentDidMount
  • STL-vector+题目
  • hadoop的MapReduce提交任务到yarn实操
  • 【Redis】数据结构(下)
  • fftw 的安装与编译
  • 算法题——二分查找类型题大全
  • java实现文件变动监听
  • vulnhub靶场之JOY
  • 提示词高级阶段学习day2.1-在提示词编写中对{}的使用教程
  • 卷积神经网络
  • R语言中的stat_compare_means():如何解决anova目标对象的方法问题
  • 我对需求分析的理解
  • DockerCompose快速部署Java项目、nginx前端和mysql数据库到centos虚拟机
  • ES6 中函数参数的默认值
  • protobuf 未知字段的获取
  • gc cr/current block 2-way
  • 【MySQL】内外连接
  • 2024年深圳福田区第十二届职工技能大比武职业技能竞赛圆满收官
  • Vue-router 路由守卫执行流程图