Spatial transformer network总结(STN)

引用:

https://www.cnblogs.com/liaohuiqiang/p/9226335.html

https://arleyzhang.github.io/articles/7c7952f0/

1.提出原因:

1.1 一个理想模型是当图像的目标发生:旋转、平移、缩放后,依然能够得到正确的结果。

1.2 CNN的作用和不足:CNN的深层结构具有空间不变性(平移、旋转),但这个空间不变性是maxpooling(主要作用)和conv(步长不为1)带来的,pooling层越多,越深,空间不变性越强;但主要问题是局部信息丢失,所以并不是层数越深越好(resnet也证明了这一点),但是主流的CNN网络都比较深,且pooling size比较小,如2*2。那么分类网络的之所以深的原因是否为了适应空间不变性?(可能是为了尽量让网络适应目标的形变,同时学习纹理特征等)

1.3 STN网络的提出就是为了增强网络的空间不变性

2.STN网络

2.1简介

2.1.1 STN对feature map(包括输入图片)进行空间变换,输出一张新的图。希望网络能够对feature map纠正成理想的图像,然后再去分类、识别。如下:

     

Spatial transformer network总结(STN)_第1张图片

2.1.2 这个网络可以作为单独的模块,可以在CNN 的任何地方插入,所以STN的input不止可以是原始输入pic,也可以是中间的feature map。

2.2 Spatial Transformer Network结构

Spatial transformer network总结(STN)_第2张图片

 

                                                                                                 图1

  1. STN的输入是U(可能是feature map中间层),输出是V(size是固定好的),分为三步:localisation net、Grid generator、Sample。
  2. Localisation net:输入是U,输出一个U-V之间的变换关系Θ,这一部分的网络结构可以是一个fc或者一个conv,但必须是一个最终的回归层用来得到这个“Θ”。
  3. Grid generator:根据V中的坐标点和变换关系“Θ”,计算得到U中的坐标点,便于Sampler做差值运算,把新的像素值插入到V中。
  4. Sample:根据步骤3得到的坐标点填充V,由于步骤3计算得到的坐标点可能是小数,要使用其他的方式计算,例如:双线性差值。

2.2.1 Localisation net

这个模块就是输入U,输出一个变化参数Θ,那么这个Θ具体是指什么呢?

我们知道线性代数里,图像的平移,旋转和缩放都可以用矩阵运算来做

举例来说,如果想放大图像中的目标,可以这么运算,把(x,y)中的像素值填充到(x',y')上去,比如把原来(2,2)上的像素点,填充到(4,4)上去。

 

 

这属于仿射变换(affine transformation)

 

 

在仿射变化中,变化参数就是这6个变量,Θ={a,b,c,d,e,f}(此Θ跟上述旋转变化里的角度Θ无关)。这6个变量就是用来映射输入图和输出图之间的坐标点的关系的,我们在第二步grid generator就要根据这个变化参数,来获取原图的坐标点。

2.2.2 Grid generator

有了第一步的变化参数,这一步是做个矩阵运算,这个运算是以目标图V的所有坐标点为自变量,以Θ为参数做一个矩阵运算,得到输入图U的坐标点。

 

 

其中记为输出图V中的第i个坐标点,V中的长宽可以和U不一样,自己定义的,所以这里用i来标识第几个坐标点。

记为输入图U中的点,这里的i是从V中对应过来的,表示V中的第i的坐标点映射的U中坐标,i跟U没有关系。

2.2.3 Sample

由于在2.22计算出了V中每个点对应到U的坐标点,在这一步就可以直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不需要经过矩阵运算。需要注意的是,填充并不是直接填充,首先计算出来的坐标可能是小数,要处理一下,其次填充的时候往往要考虑周围的其它像素值。填充根据的公式如下。

 

 

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

 

 

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

 

 

 

在这个例子里就会考虑(2,2)周围的四个点来填充,这样子,当Θ有一点点变化的时,式子的输出就会有变化,因为的变化会引起V的变化。注意下式中U的下标,第一个下标是纵坐标,第二个下标才是横坐标

V=U21(1−0.6)(1−0.4)+U22(1−0.4)(1−0.6)+U31(1−0.6)(1−0.6)+U32(1−0.4)(1−0.6)

2.2.4 前向传播

结合前面的分析,总结一下前向传播的过程,如下图:

  1. 实际上首先进行的是 localisation network 的回归,产生 变换矩阵的参数 θ,进而resize为 变换矩阵 Tθ;
  2. 根据V中的目标坐标,做逆向仿射变换到源坐标,源坐标位于U上,对应图中1,2步。
  3. 在U中找到源坐标,(小数坐标)附近的四个整数坐标,做双线性插值,插值后的值作为 目标坐标位置的像素值,对应3,4步。

 

Spatial transformer network总结(STN)_第3张图片

 

2.2.5 反向传播及实验

参考链接:https://arleyzhang.github.io/articles/7c7952f0/

其中涉及半监督任务—Co localisation(没有标签)。

你可能感兴趣的:(deep,learning)