空间变换网络

转自https://www.cnblogs.com/liaohuiqiang/p/9226335.htmlhtml

2015, NIPS
Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu 
Google DeepMind网络

为何提出(Why)优化

  1. 一个理想中的模型:咱们但愿鲁棒的图像处理模型具备空间不变性,当目标发生某种转化后,模型依然能给出一样的正确的结果
  2. 什么是空间不变性:举例来讲,以下图所示,假设一个模型能准确把左图中的人物分类为凉宫春日,当这个目标作了放大、旋转、平移后,模型仍然可以正确分类,咱们就说这个模型在这个任务上具备尺度不变性,旋转不变性,平移不变性
  3. CNN在这方面的能力是不足的:maxpooling的机制给了CNN一点点这样的能力,当目标在池化单元内任意变换的话,激活的值多是相同的,这就带来了一点点的不变性。可是池化单元通常都很小(通常是2*2),只有在深层的时候特征被处理成很小的feature map的时候这种状况才会发生
  4. Spatial Transformer:本文提出的空间变换网络STN(Spatial Transformer Networks)可使得模型具备空间不变性。

STN是什么(What)ui

  1. STN对feature map(包括输入图像)进行空间变换,输出一张新的图像。
  2. 咱们但愿STN对feature map进行变换后能把图像纠正到成理想的图像,而后丢进NN去识别,举例来讲,以下图所示,输入模型的图像多是摆着各类姿式,摆在不一样位置的凉宫春日,咱们但愿STN把它纠正到图像的正中央,放大,占满整个屏幕,而后再丢进CNN去识别。
  3. 这个网络能够做为单独的模块,能够在CNN的任何地方插入,因此STN的输入不止是输入图像,能够是CNN中间层的feature map

STN是怎么作的(How)atom

  1. 以下图所示,STN的输入为U,输出为V,由于输入多是中间层的feature map,因此画成了立方体(多channel),STN主要分为下述三个步骤
  2. Localisation net:是一个本身定义的网络,它输入U,输出变化参数ΘΘ,这个参数用来映射U和V的坐标关系
  3. Grid generator:根据V中的坐标点和变化参数ΘΘ,计算出U中的坐标点。这里是由于V的大小是本身先定义好的,固然能够获得V的全部坐标点,而填充V中每一个坐标点的像素值的时候,要从U中去取,因此根据V中每一个坐标点和变化参数ΘΘ进行运算,获得一个坐标。在sampler中就是根据这个坐标去U中找到像素值,这样子来填充V
  4. Sampler:要作的是填充V,根据Grid generator获得的一系列坐标和原图U(由于像素值要从U中取)来填充,由于计算出来的坐标可能为小数,要用另外的方法来填充,好比双线性插值。

下面针对每一个模块阐述一下
(1) Localisation net
这个模块就是输入U,输出一个变化参数ΘΘ,那么这个ΘΘ具体是指什么呢?
咱们知道线性代数里,图像的平移,旋转和缩放均可以用矩阵运算来作
举例来讲,若是想放大图像中的目标,能够这么运算,把(x,y)中的像素值填充到(x',y')上去,好比把原来(2,2)上的像素点,填充到(4,4)上去。
[xy]=[2002][xy]+[00][x′y′]=[2002][xy]+[00]
spa

若是想旋转图像中的目标,能够这么运算(能够在极坐标系中推出来,证实放到最后的附录)
[xy]=[cosΘsinΘsinΘcosΘ][xy]+[00][x′y′]=[cosΘ−sinΘsinΘcosΘ][xy]+[00]3d

这些都是属于仿射变换(affine transformation)
[xy]=[acbd][xy]+[ef][x′y′]=[abcd][xy]+[ef]
在仿射变化中,变化参数就是这6个变量,Θ={a,b,c,d,e,f}Θ={a,b,c,d,e,f}(此ΘΘ跟上述旋转变化里的角度ΘΘ无关)
这6个变量就是用来映射输入图和输出图之间的坐标点的关系的,咱们在第二步grid generator就要根据这个变化参数,来获取原图的坐标点。
orm

(2) Grid generator
有了第一步的变化参数,这一步是作个矩阵运算,这个运算是以目标图V的全部坐标点为自变量,以ΘΘ为参数作一个矩阵运算,获得输入图U的坐标点。
xml

(xsiysi)=Θ⎛⎝⎜xtiyti1⎞⎠⎟=[Θ11Θ21Θ12Θ22Θ13Θ23]⎛⎝⎜xtiyti1⎞⎠⎟(xisyis)=Θ(xityit1)=[Θ11Θ12Θ13Θ21Θ22Θ23](xityit1)

 

其中(xti,yti)(xit,yit)记为输出图V中的第i个坐标点,V中的长宽能够和U不同,本身定义的,因此这里用i来标识第几个坐标点
(xsi,ysi)(xis,yis)记为输入图U中的点,这里的i是从V中对应过来的,表示V中的第i的坐标点映射的U中坐标,i跟U没有关系
htm

(3) Sampler
因为在第二步计算出了V中每一个点对应到U的坐标点,在这一步就能够直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不须要通过矩阵运算。须要注意的是,填充并非直接填充,首先计算出来的坐标多是小数,要处理一下,其次填充的时候每每要考虑周围的其它像素值。填充根据的公式以下。

Vi=nmUnmk(xsim;ϕx)k(ysin;ϕy)Vi=∑n∑mUnm∗k(xis−m;ϕx)∗k(yis−n;ϕy)


其中n和m会遍历原图U的全部坐标点,UnmUnm指原图U中某个点的像素值,k()为取样核,两个ϕϕ为参数,(xsi,ysi)(xis,yis)表示V中第i个点要到U图中找的对应点的坐标,表示的坐标是U图上的,k表示使用不一样的方法来填充,一般会使用双线性插值,则会获得下面的公式

Vi=nmUnmmax(0,1|xsim|)max(0,1|ysin|)Vi=∑n∑mUnm∗max(0,1−|xis−m|)∗max(0,1−|yis−n|)

 

举例来讲,我要填充目标图V中的(2,2)这个点的像素值,通过如下计算获得(1.6,2.4)

(xsiysi)=[Θ11Θ21Θ12Θ22Θ13Θ23]⎛⎝⎜xtiyti1⎞⎠⎟(xisyis)=[Θ11Θ12Θ13Θ21Θ22Θ23](xityit1)

 

 

(1.62.4)=[010.500.60.4]⎛⎝⎜221⎞⎠⎟(1.62.4)=[00.50.6100.4](221)


若是四舍五入后直接填充,则难以作梯度降低。
咱们知道作梯度降低时,梯度的表现就是权重发生一点点变化的时候,输出的变化会如何。
若是用四舍五入后直接填充,那么(1.6,2.4)四舍五入后变成(2,2)
ΘΘ(咱们求导的时候是须要对ΘΘ求导的)有一点点变化的时候,(1.6,2.4)可能变成了(1.9,2.1)四舍五入后仍是变成(2,2),输出并无变化,对ΘΘ的梯度没有改变,这个时候无法用梯度降低来优化ΘΘ

 

若是采用上面双线性插值的公式来填充,在这个例子里就会考虑(2,2)周围的四个点来填充,这样子,当ΘΘ有一点点变化的时,式子的输出就会有变化,由于(xsi,ysi)(xis,yis)的变化会引发V的变化。注意下式中U的下标,第一个下标是纵坐标,第二个下标才是横坐标。

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

 

(4) STN小结
简单总结一下,以下图所示

  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)的像素值来填充。

【实验】Distorted MNIST

【实验】SVHN: Street View House Numbers

【 实验】CUB-200-2011 birds dataset

【附录】旋转的矩阵运算

 

 

相关文章
相关标签/搜索