近来在学习anchor-free网络,看到了可变形卷积(Deformable Convolutional Networks(DCN))的内容,大致总结一下,便于后面回顾。
可变形卷积可从以下三篇论文去学习,它们也被称为DCNv1、DCNv2、RepPoints(DCNv3),
DCNv1:http://xxx.itp.ac.cn/pdf/1703.06211.pdf
DCNv2:http://cn.arxiv.org/pdf/1811.11168v2
RepPoints(DCNv3):http://xxx.itp.ac.cn/pdf/1904.11490v2
这几篇论文是可变形卷积的提出和发展,最基础的都是建立在可变形卷积之上,那就有必要仔细学一下什么是可变形卷积了。
由尺度、姿态、视角和部分形变等因素引起的几何变化是目标识别和检测的主要挑战。在卷积/RoI池化模块中,DCN通过学习采样点的位置来得到几何形变建模的能力。
采样点的个数一般是设置成9个,传统的卷积是图a所示,要实现可形变卷积,并不是卷积核具有变形的能力,而是对这9个样本点的位置增加了一个偏移量进行训练学习。
2D卷积包含两步:1)用规则的网格R(3*3)在输入特征映射x上采样;2)对w加权的采样值求和。网格R定义了感受野的大小和扩张。例如定义了一个扩张大小为1的3×3卷积核。
对于输出特征映射y上的每个位置p0,我们有
其中Pn枚举了R中的位置。
在可变形卷积中,规则的网格R通过偏移{∆pn|n=1,…,N}增大,其中N=|R|。方程(1)变为
现在,采样是在不规则且有偏移的位置Pn+∆pn上。由于偏移∆pn通常是小数,方程(2)可以通过双线性插值实现
其中p表示任意(小数)位置(公式(2)中p=Po+Pn+∆Pn),q枚举了特征映射x中所有整体空间位置,G()是双线性插值的核。注意G是二维的。它被分为两个一维核
如何进行双线性插值呢?
如图2所示,通过在相同的输入特征映射上应用卷积层来获得偏移。卷积核具有与当前卷积层相同的空间分辨率和扩张(例如,在图2中也具有扩张为1的3×3)。输出偏移域与输入特征映射具有相同的空间分辨率。通道维度2N对应于N个2D偏移量。在训练过程中,同时学习用于生成输出特征的卷积核和偏移量。为了学习偏移量,梯度通过方程(3)和(4)中的双线性插值运算进行反向传播。
对于输入的一张feature map,假设原来的卷积操作是3×3的,那么为了学习偏移量offset,我们定义另外一个3×3的卷积层(图中上面的那层),输出的维度其实就是原来feature map大小,channel数等于2N(分别表示x,y方向的偏移)。下面的可变形卷积可以看作先基于上面那部分生成的offset做了一个插值操作,然后再执行普通的卷积。
理解了上面这段话基本上就理解了可变形卷积,其余都是在这基础上的变化,上面那层的卷积是用于学习偏移量的,并没有对变形的区域进行卷积,卷积区域也不会突然变形。通过学习到的偏移量与对应像素的位置索引值相加,像素位置的索引值发生了变化,从整数变成了小数,不再对应之前位置的像素值。这时如何确定新的像素值?使用双线性插值,把每个样本点的4邻域像素值加权平均得到新的对应位置的像素值。这样,每个点对应着四个位置的像素,9个样本点最多可以表示36个位置的像素,而这个位置根据偏移量变化是不固定的,于是就实现了可变形卷积。
关于RepPoints,它是在可变形卷积的基础上实现的,增加了两个阶段的可变形卷积
提出RepPoints一组样本点集,默认是9个
通过学习样本点x和y方向的偏移量,结合像素特征进行分类回归。
这是这篇文章提出的检测器结构。输入图像进入FPN网络进行特征提取,这里只画了一层的处理过程。在这层,提取到的特征图有两条走向,上面那条是进行可变形卷积获得偏移量,下面那条是常规的卷积操作,得到新的特征图。学习到的偏移量与新特征图进行结合,上面提过,就是新特征图的像素索引加上偏移量,在进行双线性插值进一步得到新的特征图。在最新的特征图中,有9个样本点对应学习出来的目标边界,这时根据这些目标边界产生伪框与ground truth对比进行分类回归。
下面是一个更具体的检测器结构图。
参考博客:
全面解析可变形卷积家族(Deformable Convolutional Networks v1+ v2)
可变形卷积 deformable convolution 学习记录