最近在看一篇CV任务中的Attention机制综述时,觉得其中一篇于2017年发表在CVPR上的Deformable ConvNets很有意思,觉得文章中思路及公式都是清晰明了,在Github上找了份PyTorch代码时,嗯……发现事情并不简单。终于在拜读大佬的deformable convolution可变形卷积(4uiiurz1-pytorch版)源码分析和一篇文章为你讲透双线性插值后,清楚了一二。这里按照自己理解学习的思路写下作为这篇论文的学习总结。

plain convolution operation:
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)=∑pn∈Rw(pn)∗x(p0+pn)
deformable convolution operation:
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)=∑pn∈Rw(pn)∗x(p0+pn+Δpn)
一:背景
作者认为由于普通卷积中感受野是规则且固定的,这导致模型的几何变换建模能力受限。因此,作者提出可变形卷积模块。在卷积核对应的位置上都添加上可学习的偏移量参数,使得在可变性卷积的感受野不再固定。
二:做法
论文中交代,在CNN中的卷积和特征图都是3D的。可变形卷积模块是在2D的空间域上进行操作,在各通道维度上保持一致。
三:代码思路
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)=∑pn∈Rw(pn)∗x(p0+pn+Δpn)
如公式所示,重要的是表示出带有偏置量 x ( p 0 + p n + Δ p n ) x(p_{0}+p_{n}+ \Delta p_{n}) x(p0+pn+Δpn)的特征值。其中, p 0 p_{0} p0代表卷积的中心点坐标, p n p_{n} pn表示邻域位置{(-1,-1),(-1,0),(-1,1),(0,-1)……}, Δ p n \Delta p_{n} Δpn表示偏置量,下文将用 o f f s e t s offsets offsets来代替 Δ p n \Delta p_n Δpn。
1. p 0 + p n + o f f s e t s p_0+p_n+offsets p0+pn+offsets表示包含了坐标偏置量的卷积操作的坐标。

1.1.根据 k e r n e l _ s i z e kernel\_size kernel_size和 s t r i d e stride stride,可以表示出卷积操作的卷积核中心坐标 ( x n , y n ) (x_n, y_n) (xn,yn)。若输出特征图 ( b , c , h , w ) (b, c, h, w) (b,c,h,w),则输入特征图中有 h ∗ w h*w h∗w个卷积核中心 p 0 p_0 p0。
1.2.再根据式中的 p n = { ( − 1 , − 1 ) , ( − 1 , 0 ) , ( − 1 , 1 ) … … } p_{n}=\{(-1,-1),(-1,0),(-1,1)……\} pn={ (−1,−1),(−1,0),(−1,1)……},依次表示出每个卷积核的邻域坐标 p n p_n pn。【注意】输出特征图中每个点在2D空间域上,每个点有 x {x} x方向和 y {y} y方向上各一个可学习的偏移量参数,故每个位置上都有2个可学习参数 o f f s e t s offsets offsets。
2. p 0 + p n + o f f s e t s p_0+p_n+offsets p0+pn+offsets中的 o f f s e t s offsets o

本文解析了2017年CVPR论文中的Deformable Convolution,介绍如何在PyTorch中实现可变形卷积,涉及偏置量处理、双线性插值算法及其在特征图上的应用。重点在于理解卷积操作中添加可学习偏移量以增强模型的几何变换适应性。

6944

被折叠的 条评论
为什么被折叠?



