论文阅读笔记9-Deformable DETR: Deformable Transformers for end-to-end object detection


2022.4.29补充
关于DETR和Deformable DETR算法复杂度的对比,正好今天写论文写到,简单捋了一下,先贴在这里供参考。

DETR复杂度:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Deformable DETR复杂度:
在这里插入图片描述



对于DETR收敛慢训练时间长的问题,本文分析了原因,并且结合deformable conv的稀疏空间采样的优点和Transformer结构关注elements之间关系的特点,提出了Deformable DETR.

这篇文章写的很详尽,也挺难读的.


-1.Preliminaries: deformable conv和DETR

得先学一下这俩.

-1.1 deformable conv

deformable conv提出的初衷是为了解决让CNN也能适应目标几何变形(尺寸,姿态等等)带来的变化.过去解决这种问题,要么进行数据增强,要么用SIFT.

其实相比传统方方正正的卷积, 可变型卷积就是加入了2D的offset, 这个2D的offset是将feature map经过一个额外的卷积层学到的.
在这里插入图片描述

用公式表示.传统的2D卷积可表示为:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) x ( p 0 + p n ) y(p_0)=\sum_{p_n\in R}w(p_n)x(p_0+p_n) y(p0)=pnRw(pn)x(p0+pn)
其中 p 0 , p n ∈ R 2 , R p_0,p_n\in\mathbb R^2,R p0,pnR2,R为kernel的索引集合.

如果我们加入2D的offset(不知道为什么要加在 x x x上),公式变为:
y ( p 0 ) = ∑ p n ∈ R w ( p n ) x ( p 0 + p n + Δ p n ) y(p_0)=\sum_{p_n\in R}w(p_n)x(p_0+p_n+\Delta p_n) y(p0)=pnRw(pn)x(p0+pn+Δpn)
其中 { p n } \{p_n\} { pn}集合的大小与 R R R的相同,也即,为每个点都分配一个offset.

但是学习到的offset通常是一个小数, 所以通常采用双线性插值的方法来计算值. 简单说, 双线性内插就是用4-近邻的灰度来计算指定点的灰度.

-1.2 DETR

DETR的大致流程是, 用CNN backbone提取feature map,然后将feature map转换成一维表征(我认为是flatten了)输入Encoder(加入了位置编码), 然后用已学习的object queries和Encoder的输出作为输入, 进入Decoder. Decoder输出的output embedding进入FFN, 执行不同的任务.

在这里插入图片描述

  \space  

0.Abstract

DETR是实现端到端进行目标检测的很好的范式,但是DETR的缺陷是收敛慢,而且空间的分辨率有限.这是由于transformer attention处理图片feature map的限制导致的.

为了解决这个问题,作者提出了Deformable DETR, Deformable DETR的注意力模块只关注参考周围的一小部分关键采样点。

相比DETR,它有更好的表现,尤其是在小目标上,而且训练的epoch小了十倍.

  \space  

1.Introduction

DETR主要有两个缺陷:

  1. 需要很大的training epochs来收敛,大约是Faster RCNN的10~20倍
  2. 检测小目标的能力不好.小目标通常是在高分辨率的feature map上检测的.但是对于DETR来说,高分辨率的feature map会导致非常大的复杂度.

作者认为产生上述问题的原因是Transformer本身缺乏对图像feature map的处理.具体地,在(DETR)初始化时,注意力模块对feature map中的像素几乎初始化同样的权重,这样必须经过很长的epochs以后才能学习到稀疏的目标.而且,关于像素的计算复杂度是平方级的,计算成本很高.

关于复杂度:假设feature map是 c × h × w c\times h \times w c×h×w
1.卷积运算的复杂度:一次卷积运算 O ( k 2 d ) O(k^2 d) O(k2d),假设输出维度也是 d d d,有 h w d hwd hwd次运算,故复杂度为 O ( h w k 2 d 2 ) O(hwk^2d^2) O(hwk2d2)
2.self-attention复杂度:由 S e l f A t t n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V {\rm SelfAttn}(Q,K,V)={\rm softmax}(\frac{QK^T}{\sqrt{d_k}})V SelfAttn(Q,K,V)=softmax(dk QKT)V:
Q , K , V ∈ R n × d Q,K,V\in \mathbb R^{n\times d} Q,K,VRn×d的复杂度为 n d nd nd(一个元素就是一次乘法)
Q , K T Q,K^T Q,KT相乘,相乘后每个元素都是 d d d次乘法,故总共 n 2 d n^2d n2d次乘法
softmax的复杂度为 n 2 n^2 n2
softmax结果和 V V V相乘,同理,每个元素 n n n次乘法,共 n d nd nd个元素,共 n 2 d n^2d n2d次乘法
因此总共复杂度为 O ( n 2 d ) O(n^2d) O(n2d)
3.DETR:将feature map转成一维后,由于 n = h w n=hw n=hw,因此复杂度为 O ( ( h w ) 2 d ) O((hw)^2d) O((hw)2d),这就是为何DETR的复杂度是像素的平方.

后文说,deformable conv在稀疏目标的检测方面很有效,避免了上面提到的问题.但是它缺少对元素间关系建模的能力,而这恰恰是DETR(Transformer)所擅长的.

Deformable DETR结合了deformable conv的稀疏空间采样的优点和Transformer学习输入间关系的能力.

作者提出了deformable attention module,它关心采样位置的一个小集合,作为所有feature map像素中重要关键元素的一个预滤波器.这个模型可以很自然地拓展到集成多尺度特征,可以不用特征金字塔网络.

在Deformable DETR中,作者使用deformable attention module来替换Transformer中的attention modules.

  \space  

2.Related Work

2.1高效的注意力机制.

传统的Transformer在时间和内存上的复杂度都是很高的.许多工作致力于解决这个问题,大体上可以分为三类:

  1. 第一类是在key上用预定义的稀疏注意力模式.最直接的范式就是将注意力模式限制为固定的窗口(可能说的是在一个小区域上计算注意力).但这样仍会丢失全局信息. 于是有的人就以固定的间隔关注关键要素(可能类似于kernel的dilation)来增加感受野,也有人用一些special tokens,这些tokens能访问所有的关键元素,来增加对全局信息的感知.也有人用预先设定的稀疏注意力模式去直接关注远处(distant)的关键元素.

  2. 第二类是学习依据数据的稀疏注意力.这些人的方法都没看懂.

  3. 第三类是探索自我注意的低等级属性.Wang等通过在尺寸维度而不是通道维度上的线性投影来减少关键元素的数量。也有人通过核化近似改写了自我注意的计算(有观点认为transformer本质上就是核方法).

Deformable DETR是属于第二种减少计算量的思路(学习依据数据的稀疏注意力).它只关注一个小的固定的采样点集合,这个集合是由query元素的特征预测来的.

2.2 目标检测的多尺度特征表示.

多尺度特征提取的代表方法就是FPN, 之后还有一堆net, 反正也没学过. 但是作者说作者提出的方法,也即多尺度可变型注意力模块可以通过注意力机制天然地集成多尺度的feature maps,而不用经过FPN。
  \space  

3. 再看Transformer和DETR

该部分主要进一步分析Multi-head self attention和DETR的计算复杂度.

作者将Multi-head self attention写为:

M u l t i H e a d A t t n ( z q , x ) = ∑ m = 1 M W m [ ∑ k ∈ Ω k A m q k W m T x k ] {\rm MultiHeadAttn}(z_q,x)=\sum_{m=1}^MW_m[\sum_{k\in\Omega_k}A_{mqk}W_m^Tx_k] MultiHeadAttn(zq,x)=m=1MWm[kΩkAmqkWmTxk]

其中: z q , x k ∈ R C , C z_q,x_k \in {\mathbb R^C},C zq,xkRC,C为feature map的通道维度(因为query key是feature map上的pixel)
A m q k = exp ⁡ { z q T U m V m x k C v } A_{mqk}=\exp\{\frac{z_q^TU_mV_mx_k}{\sqrt{C_v}}\} Amqk=exp{ Cv zqTUmVmxk}是注意力权重, U m , V m ∈ R C v × C , C v = C / M U_m,V_m \in {\mathbb R^{C_v\times C}},C_v=C/M Um,VmRCv×C,Cv=C/M
W m ∈ R C × C v W_m\in {\mathbb R^{C\times C_v}} WmRC×Cv是每个head对应的映射.
z q , x z_q,x zq,x通常是元素和位置编码的sum或concat.

这个公式,写的有点迷.其实多头注意力的本意应该是如下的公式:

Cordonnier et al. On the relationship bewteen self-attention and conv layers

M H S A ( X ) = c o n c a t h ∈ [ N h ] [ S e l f A t t n h ( X ) ] W o u t + b o u t MHSA(X)={\rm concat}_{h\in[N_h]}[{\rm SelfAttn}_h(X)]W_{out}+b_{out} MHSA(X)=concath[Nh][SelfAttnh(X)]Wout+bout

这两个公式是相同的,本文的公式输入的是两个向量,计算一个query相对所有key的注意力,而上式输入的是矩阵,包含了所有的向量,是注意力的向量形式.只不过本文的公式没考虑偏置,而且字母表示(U,V)有所不同.

复杂度分析

如何计算多头注意力的复杂度? O ( N q C 2 + N k C 2 + N q N k C ) O(N_qC^2+N_kC^2+N_qN_kC) O(NqC2+NkC2+NqNkC)

我没算出来作者给出的结果.作者给出的结果可以这么理解:计算 A m q k A_{mqk} Amqk,每个query和每个key都要计算 C 2 C^2 C2次乘法(这是因为例如 U m x k U_mx_k Umxk的相乘的维度维数是C,还有一个 V u Vu Vu),并且计算 W x Wx Wx要算C次,每个query,key都要算一个C,加起来总共是 N q C 2 + N k C 2 + N q N k C N_qC^2+N_kC^2+N_qN_kC NqC2+NkC2+NqNkC.
总觉得不对.

一般 N q = N k > > C N_q=N_k>>C Nq=Nk>>C,复杂度简化为 O ( N q N k C ) O(N_qN_kC) O(NqNkC)

再看DETR

前已介绍,DETR的Encoder是将feature map作为输入,根据前面的计算,自注意力的复杂度为 O ( ( h w ) 2 C ) O((hw)^2C) O((hw)2C).

而Decoder的注意力由两部分组成,一是自注意力,二是和Encoder的交叉注意力.

在交叉注意力中,key是feature map中的pixel,和之前一样,因此 N k = h w N_k=hw Nk=hw.Decoder的输入是固定数量的object queries,记数量为 N N N(一般是100),因此 N q = N N_q=N Nq=N,代入前面的公式,得到交叉注意力的复杂度 O ( h w C 2 + N h w C ) O(hwC^2 + NhwC) O(hwC2+NhwC).

少了一块,应是 h w C 2 + N C 2 + N h w C hwC^2+NC^2+ NhwC hwC2+NC2+NhwC,不懂.

在自注意力中,学习的是object queries之间的关系,因此 N q = N k = N N_q=N_k=N Nq=Nk=N,代入得复杂度 O ( 2 N C 2 + N 2 C ) O(2NC^2+N^2C) O(2NC2+N2C)
  \space  

4.Method

4.1 可变型注意力模块

将transformer注意力引入的核心问题就是它会浏览所有可能的空间位置.(而这是不必要的)

为了解决这个问题,作者提出了可变型注意力模块.
受可变型卷积的启发,可变型注意力只关注一小部分的keys,而不是feature map的所有信息.
通过为每个query只分配少量的keys,收敛慢和特征空间分辨率的问题就能够缓解.

公式表达如下:

D e f o r m A t t n ( z q , p q , x ) = ∑ m = 1 M W m [ ∑ k = 1 K A m q k W m T x k ( p q + Δ p m q k ) ] {\rm DeformAttn}(z_q,p_q,x)=\sum_{m=1}^MW_m[\sum_{k=1}^{K}A_{mqk}W_m^Tx_k(p_q+\Delta p_{mqk})] DeformAttn(zq,pq,x)=m=1MWm[k=1KAmqkWmTxk(pq+Δpmqk)]

其中:

x ∈ R C × H × W x\in \mathbb R^{C\times H \times W} xRC×H×W是feature map,若用 q q q表示一个query,则 z q z_q zq表示query向量, p q = ( p q x , p q y ) p_q=(p_{qx},p_{qy}) pq=(pqx,pqy)表示这个query的二维参考点(也就是说,这个式子计算的是query z q z_q zq在参考点 p q p_q pq下在feature map x x x中的注意力). W m , A m q k W_m,A_{mqk} Wm,Amqk的含义和之前相同, Δ p m q k ∈ R 2 \Delta p_{mqk}\in \mathbb R^2 ΔpmqkR2是相对于参考点的offset,是无限制范围的实数,是可学习的.

另外,由于只关注小部分的keys,因此 K < < H W K<<HW K<<HW.

和可变型卷积一样, p q + Δ p m q k p_q+\Delta p_{mqk} pq+Δpmqk是分数,因此利用双线性插值的方法计算 x k ( p q + Δ p m q k ) x_k(p_q+\Delta p_{mqk}) xk(pq+Δpmqk).

在具体实现上, z q z_q zq会经过一个线性层,输出维度为 3 M K 3MK 3MK的向量,其中前 2 M K 2MK 2MK预测 M K MK MK Δ p \Delta p Δp的offset,后 M K MK MK维计算 M K MK MK个注意力分数 A m q k A_{mqk} Amqk.

可变型注意力的计算复杂度是 O ( 2 N q C 2 + min ⁡ ( H W C 2 , N q C 2 ) O(2N_qC^2+\min(HWC^2,N_qC^2) O(2NqC2+min(HWC2,NqC2), 若 N q = H W N_q=HW Nq=HW,则化为 O ( H W C 2 ) O(HWC^2) O(HWC2),关于 H W HW HW呈线性,而不是DETR的 O ( ( H W ) 2 C ) O((HW)^2C) O((HW)2C)的二次,这就是降低了复杂度的来由.

整个可变型注意力模块如下图所示:

在这里插入图片描述
4.2 多尺度可变型注意力模块

之前说基于transformer的注意力不能获取多尺度信息,进而不能很好的检测小目标. 作者是怎么做的呢?就是将不同尺寸的feature map作为输入,只需要对4.1中的式子稍加修改:

若用 { x l } ∣ l = 1 L \{x_l\}|_{l=1}^L { xl}l=1L表示 L L L个尺寸的feature map(是从CNN backbone不同层的输出提取的,比如说ResNet50的某些层里提取), p q ^ ∈ [ 0 , 1 ] 2 \hat{p_q}\in [0,1]^2 pq^[0,1]2表示归一化的参考点坐标,则:

M S D e f o r m A t t n ( z q , p q ^ , { x l } ∣ l = 1 L ) = ∑ m = 1 M W m [ ∑ l = 1 L ∑ k = 1 K A m l q k W m T x l ( ϕ l ( p q ^ ) + Δ p m l q k ) ] {\rm MSDeformAttn}(z_q,\hat{p_q},\{x_l\}|_{l=1}^L)=\sum_{m=1}^MW_m[\sum_{l=1}^L\sum_{k=1}^{K}A_{mlqk}W_m^Tx^l(\phi_l (\hat{p_q})+\Delta p_{mlqk})] MSDeformAttn(zq,pq^,{ xl}l=1L)=m=1MWm[l=1Lk=1KAmlqkWmTxl(ϕl(pq^)+Δpmlqk)]

其中函数 ϕ \phi ϕ表示逆变换,将归一化的坐标变换回原feature map大小对应的坐标.

L = 1 , K = 1 L=1,K=1 L=1,K=1时,退化为可变型卷积;当采样点穿过所有可能的位置时,等价于普通的transformer注意力.

4.3 可变型transformer的Encoder

作者将DETR Encoder中所有的注意力模块都替换成了上述的多尺度可变型注意力, Encoder的输入是多尺度的特征图,输出也是对应的相同分辨率的多尺度特征图.

之所以相同,是因为自注意力的输入和输出个数是相同的.

前已说过, feature map一般来自ResNet不同层抽取的特征. 作者是利用ResNet50的C3~C5层, 利用1x1的卷积将通道数都改为256,如下图所示:

在这里插入图片描述

自然,对于2D输入来说,query和key都是feature map的pixel. 但是由于利用了多尺度, 除了位置编码以外,为了区分query在哪个尺度的map上, 还引入了额外的scale-level embedding.

这个scale-level embedding也是可学习的.

4.4 可变型transformer的Decoder

和DETR一样,decoder也是包括了自注意力和交叉注意力. 自注意力同样是学习object queries之间的关系, 这个和利用可变型注意力的优势无关, 因此自注意力模块没有改变, 而把交叉注意力模块改成了多尺度可变型注意力. 交叉注意力同样是将Encoder输出的map中的pixel作为key, object query从map中学习特征.

DETR后面用不同的网络来执行类别和bbox的预测, 但作者说由于我们已经有了已学习的offset( p q ^ \hat{p_q} pq^)的先验知识, 可以利用offset来减少检测的难度. 具体地, 参考点就作为box center的initial guess(初始猜测), 至于框的大小, 就可以将offset p q ^ \hat{p_q} pq^进行某种计算然后得到. 例如:

b q ^ = ( σ ( b q x + σ − 1 ( p q x ^ ) ) , σ ( b q y + σ − 1 ( p q y ^ ) ) ) \hat{b_q}=(\sigma(b_{qx}+\sigma^{-1}(\hat{p_{qx}})),\sigma(b_{qy}+\sigma^{-1}(\hat{p_{qy}}))) bq^=(σ(bqx+σ1(pqx^)),σ(bqy+σ1(pqy^)))

其中 σ \sigma σ表示sigmoid函数, 当然 b q ^ \hat{b_q} bq^也是归一化的, b q x , b q y b_{qx},b_{qy} bqx,bqy是学到的.
  \space  

additional improvements还没看.需要了再看.
这篇文章提出了多尺度可变型注意力,还是很有想法,而且写作也不错,就是还没学会计算复杂度到底是咋算的.
学吧,学无止境,太深了

猜你喜欢

转载自blog.csdn.net/wjpwjpwjp0831/article/details/121888314