文章是Google DeepMind在2015年提出的Spatial Transformer Networks(STN),该模型能够让卷积网络学会数据的形状变换,能够对经过平移、旋转、缩放及裁剪等操作的图片得到与未经变换前相同的检测结果。STN作为一种独立的模块可以在网络的任意位置插入使得网络具有空间不变性。
文章链接:Spatial Transformer Networks
参考目录:
仿射变换和双线性插值:Spatial Transformer Networks
pytorch源码:SPATIAL TRANSFORMER NETWORKS TUTORIAL
完整且详细的STN讲解:
论文笔记之STN
Spatial Transformer Networks
理解Spatial Transformer Networks
论文笔记:空间变换网络
Spatial Transformer Networks
Abstract
卷积神经网络缺乏对输入数据保持空间不变的能力,导致模型性能下降。虽然CNN中引入池化层有助于满足这一特性,但这种空间不变性仅能在池化矩阵的范围内才具有平移不变性或者在卷积的深层层次上实现。在这篇文章中,作者提出了一种新的可学习模块,STN。这个可微
模块可以插入现有的卷积结构中
,使神经网络能够根据特征图像本身,主动地对特征图像进行空间变换,而不需要任何额外的训练监督或优化过程。
1 Introduction
- STN作为一种独立的模块可以在不同网络结构的
任意节点
插入任意个数
。 - STN具有
运算速度快
的特点,它几乎没有增加原网络的运算负担,甚至在一些attentive model中实现了一定程度上的加速。 同一个网络层中也可以插入多个STN
来对于多个物体进行不同的空间变换。往往同一个STN模块仅用于检测单个物体并会对其他信息进行剔除。同一个网络层中的STN模块个数在一定程度上影响了网络可以处理的最大物体数量。
2 Method
网络总体结构可以分为三步走:学习一个变换矩阵 - 找到位置映射关系 - 计算输出像素值
- 学习变换矩阵。输入特征图像U,经过FCN或者CNN输出一个变换矩阵θ 。
- 根据变换矩阵θ ,找到映射位置关系,注意这里是位置的对应关系,与像素值无关。就是说我们遍历输出图像的所有位置,要找到每个位置的值是由输入图像的哪个位置的值映射过来的,找出输入图像中的这个位置。找出所有的位置对应关系。output feature position -> input feature position
- 利用插值算法根据位置映射计算像素值。第二步找到了输出图像在输入图像中的位置对应关系,但是可能有小数,所以使用插值算法算出这个插值点的像素值,赋给输出图像。position->score
总结一下:学变换,往前推找到输入图像中的位置,得到像素值再传回输出图像。
2.1 Localisation Network
- Localisation网络是将输入图像(feature map) U ∈ R H × W × C U∈R^{H×W×C} U∈RH×W×C 经过若干卷积或全连接操作后接一个回归层输出一个变换矩阵 θ θ θ 。
- θ的尺寸可以根据参数的类型而变化。
变换矩阵θ可以表征任何现存的一种变换
,比如仿射变换 θ ∈