可变形卷积DeformableConvolutionNet(DCN)理解
1. 为什么做DCN
传统的卷积采⽤固定尺⼨的卷积核,不能很好地适应⼏何形变
2. 什么是DCN
可形变卷积,卷积核的形状是可变的,也就是感受野可以变化,但注意感受野的元素是“不变”的。
3. DCN的具体实现
代码似乎也是按照这个流程写的,不过上⾯的输出结果不应该是(b*h*w*2c),⽽是(b*h*w* (2kernel_size*kernel_size)),因为只需要记录可变形卷积滤波器变形之后的位置,滤波器的原始尺⼨是kernel_size*kernel_size,需记录x坐标和y坐标,故为
2*kernel_size*kernel_size
代码参考,关键步骤及其解释如下:
这⼀步输⼊图⽚学习偏移量offt,输⼊的feature map尺⼨是(64,28,28)分别表⽰通道数,h和w。输出之所以是18通道的,是因为kernel size是3,卷积核有3*3=9个点,每个点都有x偏移量和y偏移量(从这⾥看得出每个输⼊通道做同样的偏移处理),18通道的前九个通道表⽰x偏移量,后9个通道表⽰y偏移量。
由于offt是偏移量,需要得到偏移之后的绝对坐标p,直接把偏移量加到原始坐标就好
原始坐标⼀般⽤meshgrid函数表⽰
最后,万事具备,偏移的位置都已经确定好了,⽤正常的卷积操作实现实现DCN:
注意执⾏_reshape_x_offt函数前x_offt的形状是torch.Size([32, 64, 28, 28, 9]),由于dcn的卷积核是3*3,所以感受野⾥总共9个元素(这也是最后⼀个通道是9点原因),reshape之后把9维向量的感受野展开成平⾯(torch.Size([32, 64, 84, 84])),⽽且由于