论文笔记 Deformable ConvNet v1+v2+DETR

本文最后更新于:2023年7月20日 上午

论文笔记 Deformable ConvNet v1+v2+DETR

最近看到Deformable attention越来越多,于是关注到了Deformable这个东西,本文从起源开始介绍三篇经典的CV相关使用Deformable的论文。文本只介绍其方法,对实验和背景不展开过多的叙述。

Deformable ConvNets

CNN的卷积核是固定的,具有局限性,对于长距离的建模也不佳,Deformable ConvNets则是一种新的网络架构,能够实现变形的卷积。

如下图所示,(a)是传统的卷积操作,拥有一个3×33\times3的卷积核。(b)是对采样位置进行变形的操作,原来的绿点通过施加offsets偏移到了蓝点,从而得到了变形卷积的雏形。

上图是一个3×33\times3的Deformable Conv的架构,和卷积类似,变形卷积也是在输入特征图上使用一个滑动窗口,每个窗口得到输出特征图上的一个值。变形卷积首先会初始化一组采样点:

R={(1,1),(1,0),,(0,1),(1,1)}\mathcal{R}=\{(-1,-1),(-1,0),\dots,(0,1), (1,1)\}

对于输出特征图上的每一个位置p0\mathbf{p}_0,使用下面这个公式:

y(p0)=pnRw(pn)x(p0+pn+Δpn)\mathbf{y}\left(\mathbf{p}_0\right)=\sum_{\mathbf{p}_n \in \mathcal{R}} \mathbf{w}\left(\mathbf{p}_n\right) \cdot \mathbf{x}\left(\mathbf{p}_0+\mathbf{p}_n+\Delta\mathbf{p}_n\right)

pn\mathbf{p}_n是包括自身的周围9个位置,而Δpn\Delta\mathbf{p}_n则是进一步的变形offset,有了这个offset,采样的点就会变到别的位置上而不是一个方框。

公式中w()\mathbf{w}(\cdot)是每个点对应的可学习的权重,x()\mathbf{x}(\cdot)则是取出某个(小数)位置上的值,这个值需要通过bilinear interpolation来得到。

Δpn\Delta\mathbf{p}_n就如图所示,是通过一个卷积操作得到的,图中NN指的是卷积核的大小(3×3=93\times3=9),由于有x,yx,y两个偏移方向,所以要得到2N2N的深度。

论文还提出了Deformable RoI pooling,基本上类似,就是在RoI pooling的每一个bin中使用变形卷积来得到值而非简单的平均。

使用变形卷积,可以如上图得到变形的感受野,同时可视化效果也很不错,有一种天生的自底向上的注意力。

Deformable ConvNets V2

作者观察到Deformable Conv很强,所以准备往上面叠更多层,但是发现叠多层之后变形卷积的关注范围又变散了,会超出感兴趣的范围,没有和预料中的那样聚集在一个物体周围。所以,V2还添加了一个调制的操作:

y(p)=k=1Kwkx(p+pk+Δpk)Δmky(p)=\sum_{k=1}^K w_k \cdot x\left(p+p_k+\Delta p_k\right) \cdot \Delta m_k

别的都类似,这个Δmk\Delta m_k就是重点,它控制了变形卷积核在扩散时的权重,其值在[0,1][0,1],也就是说,一个采样点不会肆意吸取周围点的信息了,假如到了边缘,它的权重可能会降低到0。

Δmk\Delta m_k的计算方式也很简单,就是把计算Δpk\Delta p_k时候的2K的深度拓展到3K。

Deformable DETR

从传统注意力到DeformAttn

接下来就把可变形状和现代的Transformer结合起来了。

DETR有收敛慢、受限于分辨率(注意力复杂度高)、对小物体检测效果不好的问题,而Deformable可以进行离散的空间采样,在与DETR结合之后可以构建一个更高效、更适合层级特征的目标检测器。

传统的多头注意力如下

MultiHeadAttn(zq,x)=m=1MWm[kΩkAmqkWmxk]\operatorname{MultiHeadAttn}\left(\boldsymbol{z}_q, \boldsymbol{x}\right)=\sum_{m=1}^M \boldsymbol{W}_m\left[\sum_{k \in \Omega_k} A_{m q k} \cdot \boldsymbol{W}_m^{\prime} \boldsymbol{x}_k\right]

公式有点不一样,其中zq\boldsymbol{z}_q是单个CC维的query特征,x\boldsymbol{x}是需要关注的所有key特征,MM是多头注意力的头数,Ωq,Ωk\Omega_q,\Omega_k分别是进行注意力时query和key的长度。Wm\boldsymbol{W}_m是融合多个头的输出矩阵,Wm\boldsymbol{W}_m^{\prime}是把key映射为value的矩阵(可能有些奇怪,其实是把被施加注意力的输入映射到value),AmqkA_{m q k}就是常规的QK/CvQK/\sqrt{C_v},但是这里简写了这一步骤。

Deformable Attention Module如下

DeformAttn(zq,pq,x)=m=1MWm[k=1KAmqkWmx(pq+Δpmqk)]\operatorname{DeformAttn}\left(\boldsymbol{z}_q, \boldsymbol{p}_q, \boldsymbol{x}\right)=\sum_{m=1}^M \boldsymbol{W}_m\left[\sum_{k=1}^K A_{m q k} \cdot \boldsymbol{W}_m^{\prime} \boldsymbol{x}\left(\boldsymbol{p}_q+\Delta \boldsymbol{p}_{m q k}\right)\right]

注意这里的x()\boldsymbol{x}(\cdot)是一个函数,表示取该位置的像素值,不是括号内的乘法。这里把key的范围由Ωk\Omega_k限制到了KKpq\boldsymbol{p}_q是一个2d的reference point,是相较于传统的一个额外输入,与query一一对应。而学出来的Δpmqk\Delta \boldsymbol{p}_{m q k}是从点pq\boldsymbol{p}_q出来的K个offset(这一点与变形卷积有些不一样)。offset的范围不受限制,可以是短距离也可能是长距离。

zq\boldsymbol{z}_q会通过一个线性层从CC映射到3MK3MK维度,即采样点×\times头数×\times(2d偏移量+1d的注意力权重)。注意这里AmqkA_{m q k}并不是和多头注意力那样通过query乘key得到的,而是直接学习出来的,在K的维度进行归一化。

整体来说,DeformAttn对于每一个query,会使用M个头、选择K个采样点,每个采样点包含与参考点的偏移距离以及对应的归一化权重

Deformable Attention Module还可以扩展到多尺度版本:

MSDeformAttn(zq,p^q,{xl}l=1L)=m=1MWm[l=1Lk=1KAmlqkWmxl(ϕl(p^q)+Δpmlqk)]\operatorname{MSDeformAttn}\left(\boldsymbol{z}_q, \hat{\boldsymbol{p}}_q,\left\{\boldsymbol{x}^l\right\}_{l=1}^L\right)=\sum_{m=1}^M \boldsymbol{W}_m\left[\sum_{l=1}^L \sum_{k=1}^K A_{m l q k} \cdot \boldsymbol{W}_m^{\prime} \boldsymbol{x}^l\left(\phi_l\left(\hat{\boldsymbol{p}}_q\right)+\Delta \boldsymbol{p}_{m l q k}\right)\right]

由于有了多尺度,所以参考点是归一化的坐标p^q\hat{\boldsymbol{p}}_qϕl(p^q)\phi_l\left(\hat{\boldsymbol{p}}_q\right)把坐标映射到第ll个尺度的像素坐标,其余都与单尺度版本类似。多尺度版本就是在多个尺度上,以同一个点,每个点预测K个偏移,然后使用归一化的注意力矩阵合并。

DeformAttn for DETR

接下来将其应用到DETR的架构中MSDeformAttn应用到DETR的架构中,首先是编码器

用作编码器时,输入和输出都是相同分辨率的多尺度特征图,对于每个query pixel,参考点就是本身,为了区分位置和层级,会使用positional encoding和scale-level embedding。

然后是解码器

解码器中仅交叉注意力会被替换为Deformable,对于每个query,参考点的归一化位置会通过query embedding + linear + sigmoid得到。在最后得到box时,会使用query对应的参考点位置作为box的初始中心,然后额外预测中心的偏移量以及box的宽和高。

Iterative Refinement

实际时Deformable DETR还使用了一些trick,比如这个迭代式的box精细化。

每一层解码器都对中心偏移量和宽高的变化进行预测,首先初始化中心偏移量为第一层通过query embedding得到的中心,宽高初始化为0.1。然后,下一层以这个中心为参考点,得到中心偏移量和宽高的变化量(即相对于0.1的变化量),然后以偏移的中心作为参考点进行再下一层的解码……

Two-Stage

第一阶段从encoder中获得一些region proposal,第二阶段把这些proposal作为初始框来进行Iterative Refinement。

可视化结果

不同box对应的采样点图,看上去……好像也没有那么强的可解释性?