[转载]STN:Spatial Transformer Networks 空间变换网络

Google DeepMind在2015年提出的Spatial Transformer Networks(STN),该模型能够让卷积网络学会数据的形状变换,能够对经过平移、旋转、缩放及裁剪等操作的图片得到与未经变换前相同的检测结果。STN作为一种独立的模块可以在网络的任意位置插入使得网络具有空间不变性。

文章链接:Spatial Transformer Networks
参考目录:
仿射变换和双线性插值:Spatial Transformer Networks
pytorch源码:SPATIAL TRANSFORMER NETWORKS TUTORIAL
完整且详细的STN讲解:


0、Abstract

卷积神经网络缺乏对输入数据保持空间不变的能力,导致模型性能下降。虽然CNN中引入池化层有助于满足这一特性,但这种空间不变性仅能在池化矩阵的范围内才具有平移不变性或者在卷积的深层层次上实现。在这篇文章中,作者提出了一种新的可学习模块,STN。这个可微模块可以插入现有的卷积结构中,使神经网络能够根据特征图像本身,主动地对特征图像进行空间变换,而不需要任何额外的训练监督或优化过程。

1、 Introduction

  1. STN作为一种独立的模块可以在不同网络结构的任意节点插入任意个数。
  2. STN具有运算速度快的特点,它几乎没有增加原网络的运算负担,甚至在一些attentive model中实现了一定程度上的加速。
  3. 同一个网络层中也可以插入多个STN来对于多个物体进行不同的空间变换。往往同一个STN模块仅用于检测单个物体并会对其他信息进行剔除。同一个网络层中的STN模块个数在一定程度上影响了网络可以处理的最大物体数量。

2、 Method

网络总体结构可以分为三步走:学习一个变换矩阵 - 找到位置映射关系 - 计算输出像素值

  1. 学习变换矩阵。输入特征图像U,经过FCN或者CNN输出一个变换矩阵θ 。
  2. 根据变换矩阵θ ,找到映射位置关系,注意这里是位置的对应关系,与像素值无关。就是说我们遍历输出图像的所有位置,要找到每个位置的值是由输入图像的哪个位置的值映射过来的,找出输入图像中的这个位置。找出所有的位置对应关系。output feature position -> input feature position
  3. 利用插值算法根据位置映射计算像素值。第二步找到了输出图像在输入图像中的位置对应关系,但是可能有小数,所以使用插值算法算出这个插值点的像素值,赋给输出图像。position->score

总结一下:学变换,往前推找到输入图像中的位置,得到像素值再传回输出图像。

2.1 Localisation Network

  1. Localisation网络是将输入图像(feature map) U \in R^{ H \times W \times C}  经过若干卷积或全连接操作后接一个回归层输出一个变换矩阵θ。
  2. θ的尺寸可以根据参数的类型而变化。变换矩阵θ可以表征任何现存的一种变换,比如仿射变换\theta \in R^{2 \times 3}\theta \in R^{3 \times 3} 等,不同的变换会产生不同size的θ。
    PS:仿射变换可以简单看作线性变换加平移。

这个模块就是输入U,输出一个变化参数Θ,那么这个Θ具体是指什么呢?
我们知道线性代数里,图像的平移,旋转和缩放都可以用矩阵运算来做举例来说,如果想放大图像中的目标,可以这么运算,把(x,y)中的像素值填充到(x',y')上去,比如把原来(2,2)上的像素点,填充到(4,4)上去。

2.2 Parameterised Sampling Grid

根据得到的变换矩阵θ,就可以得知输出是如何由输入变换来的。图2展示了ST中的一次仿射变换(b)和直接映射(a)的区别:


遍历输出图像的每个位置,根据变换矩阵找到变换前的输入图像位置,保存该位置。所有这一层的输出是位置坐标。设输入feature map U每个像素位置的坐标为\left (x_{i}^{s}, y_{i}^{s} \right ),经过ST变换后输出feature map V每个像素位置的坐标为\left (x_{i}^{t}, y_{i}^{t} \right )
下图为输入和输出feature map的仿射变换关系。

得到的坐标值往往都是非整数,所以需要插值算法来获取对应的像素值了。

2.3 Differentiable Image Sampling

第三步重采样也叫差分采样。获取U中像素值来作为V中对应位置的像素值。如果获得的U中的坐标点\left (x_{i}^{s}, y_{i}^{s} \right )​是整数,那就可以直接将\left (x_{i}^{s}, y_{i}^{s} \right )处像素值作为输出V中\left (x_{i}^{t}, y_{i}^{t} \right )的像素值。但往往获得的\left (x_{i}^{s}, y_{i}^{s} \right )是小数的形式,因为不能直接取出像素值,就需要使用插值的方法来获取像素值。
理论上任意的插值方法都可以使用,作者介绍了两种插值方式:最近邻插值和双线性插值。双线性插值就是找出距离所求坐标最近的四个整数点,根据距离权重求和(距离越近权重越大,所以是1-距离)。下面列出了应用双线性插值的公式:(双线性插值的简单介绍:Spatial Transformer Networks,还包含了 仿射变换:平移(translation)缩放(Scaling)旋转(Rotation)剪切(Shear)仿射变换(Affine transformation)的介绍)

其中n和m会遍历原图U的所有坐标点,U_{nm}指原图U中某个点的像素值,k()为取样核,两个ϕ
为参数,\left (x_{i}^{s}, y_{i}^{s} \right )表示V中第i个点要到U图中找的对应点的坐标,表示的坐标是U图上的,k表示使用不同的方法来填充,通常会使用双线性插值,则会得到下面的公式

  1. 使用双线性插值可导,且满足反向传播条件。为什么直接取最近的点值不行而要采用双线性插值的方法来进行反向传播可以看这篇解析
  2. 非插值部分一律取0,显示出来就是黑色像素块。

举例来说,我要填充目标图V中的(2,2)这个点的像素值,经过以下计算得到(1.6,2.4)

如果四舍五入后直接填充,则难以做梯度下降。
我们知道做梯度下降时,梯度的表现就是权重发生一点点变化的时候,输出的变化会如何。
如果用四舍五入后直接填充,那么(1.6,2.4)四舍五入后变成(2,2)
当Θ(我们求导的时候是需要对Θ求导的)有一点点变化的时候,(1.6,2.4)可能变成了(1.9,2.1)四舍五入后还是变成(2,2),输出并没有变化,对Θ的梯度没有改变,这个时候没法用梯度下降来优化Θ。如果采用上面双线性插值的公式来填充,在这个例子里就会考虑(2,2)周围的四个点来填充,这样子,当Θ有一点点变化的时,式子的输出就会有变化,因为\left (x_{i}^{s}, y_{i}^{s} \right )的变化会引起V的变化。注意下式中U的下标,第一个下标是纵坐标,第二个下标才是横坐标。

3、 Conclusion

简单总结一下,如下图所示

  1. Localization net根据输入图,计算得到一个Θ
  2. Grid generator根据输出图的坐标点和Θ,计算出输入图的坐标点,举例来说想知道输出图上(2,2)应该填充什么坐标点,则跟Θ运算,得到(1.6,2.4)
  3. Sampler根据自己定义的填充规则(一般用双线性插值)来填充,比如(2,2)坐标对应到输入图上的坐标为(1.6,2.4),那么就要根据输入图上(1.6,2.4)周围的四个坐标点(1,2),(1,3),(2,2),(2,3)的像素值来填充。

STN网络有以下几个特点:

  1. 该模块可以作为插件放入任意网络中,并执行特征的显式空间变换,且无需对损失函数进行任何更改。
  2. STN是一个可导的网络,所以插入CNN后它可以实现端对端的训练。
  3. 在输入图像之后接一个ST是最常见的操作,也是最容易理解的,即自动图像矫正。
  4. 同一个网络层中也可以插入多个STN来对多个物体进行不同的空间变换。往往同一个STN模块仅用于检测单个物体并会对其他信息进行剔除。同一个网络层中的STN模块个数在一定程度上影响了网络可以处理的最大物体数量。
  5. STN模块可以插入到网络的任意位置,其输入可以是Image/feature map,输出也可以是Image/feature map。
  6. Pytorch源码:SPATIAL TRANSFORMER NETWORKS TUTORIAL


原文链接:https://blog.csdn.net/qq_45122568/article/details/124293622

【附录】旋转的矩阵运算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值