🌞欢迎来到Pytorch的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
📆首发时间:🌹2024年2月20日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
论文地址:
1703.06211.pdf (arxiv.org)
引入
传统卷积的感受野是固定的,无法灵活适应目标的不规则形状。Deformable Convolutional Networks(DCN)旨在通过引入可变形卷积(Deformable Convolution)来解决这一问题。
核心思想
可变形卷积的核心思想是在卷积操作中引入可学习的偏移量,使得网络能够动态地调整卷积核在输入上的采样位置。这种方式可以使网络更好地适应目标的形变,从而提高对不规则目标的识别能力。
主要贡献:
- 可变形卷积: 提出了一种新的可变形卷积操作,可以自适应地调整卷积核的采样位置。
- 可变形ROIPooling: 在目标检测任务中引入了可变形的ROIPooling操作,提高了网络对目标不规则形状的适应性。
- 实验证明: 在多个数据集和任务上进行了实验证明,证明了DCN在目标检测等任务上的优越性。
可变形卷积
文章提出了可变卷积,添加了位移变量,这个变量根据数据的情况学习,偏移后,相当于卷积核每个方块可伸缩的变化,从而改变了感受野的范围,感受野成了一个多边形。
(a)是普通的卷积,卷积核大小为3*3,采样点排列非常规则,是一个正方形。
(b)是可变形的卷积,给每个采样点加一个offset(这个offset通过额外的卷积层学习得到),排列变得不规则。
(c)和(d)是可变形卷积的两种特例。
(c)加上offset,达到尺度变换的效果
(d)加上offset,达到旋转变换的效果。
我们先看普通的卷积,以3x3卷积为例对于每个输出y(p0),都要从x上采样9个位置,这9个位置都在中心位置x(p0)向四周扩散,(-1,-1)代表x(p0)的左上角,(1,1)代表x(p0)的右下角。
(R 中的(−1, −1) 表示卷积核(或感受野)相对于中心位置的一个位置偏移。每个元素 (i, j) 表示相对于中心位置的水平偏移 i 和垂直偏移 j。
对于 (−1, −1),水平偏移为 -1,垂直偏移也为 -1。这表示卷积核在水平和垂直方向上都相对于中心位置向左上方移动一个位置。在卷积操作中,这个偏移会影响卷积核在输入特征图上的采样位置,进而影响卷积操作的结果。
这个网格 R 中的元素定义了卷积核的形状和采样策略,影响了卷积操作在输入上的感受野。在给定的例子中,R = {(−1, −1),(−1, 0), . . . ,(0, 1),(1, 1)} 表示卷积核的形状是 3 × 3,它在水平和垂直方向上相对于中心位置有一个单位的偏移。)
所以传统的卷积输出就是(其中Pn就是网格中的n个点):
举个栗子:
import numpy as np # 定义输入特征图 X X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 定义卷积核 w 和采样位置 R w = np.ones((3, 3)) # 使用全1权重 R = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 0), (0, 1), (1, -1), (1, 0), (1, 1)] # 初始化输出 output = 0 # 执行卷积操作 for p_n in R: # 输出位置 p_0 = (1 + p_n[0], 1 + p_n[1]) # 计算权重采样 weighted_sample = w[p_0[0], p_0[1]] * X[p_0[0], p_0[1]] # 打印每一步的计算过程 print(f"Sample at position {p_0}: {w[p_0[0], p_0[1]]} * {X[p_0[0], p_0[1]]} = {weighted_sample}") # 更新输出 output += weighted_sample # 输出最终结果 print("\nFinal Output:", output)
可变形卷积则在公式1的基础上为每个点引入了一个偏移量,偏移量是由输入特征图与另一个卷积生成的,通常是小数。
由于加入偏移量后的位置一般为小数,并不对应输入特征图上实际的像素点,因此需要使用插值来得到偏移后的像素值,通常可采用双线性插值,用公式表示如下:
其中,公式中最后一行的max(0, 1-...)限制了插值点与邻域点不超过1个像素的距离。
双线性插值是指将插值点位置的像素值设为其4邻域像素点的加权和,邻域4个点是离其最近的在特征图上实际存在的像素点,每个点的加权权重则根据它与插值点横、纵坐标的距离来设置,最终得到插值点的像素值。
各点权重由各点距离P点的距离确定。
下图为可变形卷积示意图。可以看到offsets(偏移)是额外使用一个卷积来生成的,与最终要做卷积操作那个卷积不是同一个 。图示N为卷积核区域大小,例如3*3大小的卷积核,N=9,图中绿色过程为卷积学习偏移的过程,其中offset field的通道大小为2N,表示卷积核分别学习x方向与y方向的偏移量。下图所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。
可变形卷积的具体细节:
- 一个output feature map上的点对应到input feature map上的卷积采样区域大小为K*K,按照可变形卷积的操作,这K*K区域的每一个卷积采样点都要学习一个偏离量offset,而offset是用坐标表示的,所以一个output要学习2*K*K个参数。假设一个output大小为H*W,所以一共要学习2*K*K*H*W个参数。即上图的offset field(N=K*K),其维度为B*2*K*K*H*W,其中B代表batch_size;
- 假设input feature map的维度为B*C*H*W,一个batch内的特征图(一共C个)共用一个offset field,即一个batch内的每张特征图用到的偏移量是一样的;
- 可变形卷积不改变input feature map的尺寸,所以output feature map也为H x W;