引用:
https://www.cnblogs.com/liaohuiqiang/p/9226335.html
https://arleyzhang.github.io/articles/7c7952f0/
1.1 一个理想模型是当图像的目标发生:旋转、平移、缩放后,依然能够得到正确的结果。
1.2 CNN的作用和不足:CNN的深层结构具有空间不变性(平移、旋转),但这个空间不变性是maxpooling(主要作用)和conv(步长不为1)带来的,pooling层越多,越深,空间不变性越强;但主要问题是局部信息丢失,所以并不是层数越深越好(resnet也证明了这一点),但是主流的CNN网络都比较深,且pooling size比较小,如2*2。那么分类网络的之所以深的原因是否为了适应空间不变性?(可能是为了尽量让网络适应目标的形变,同时学习纹理特征等)
1.3 STN网络的提出就是为了增强网络的空间不变性。
图1
这个模块就是输入U,输出一个变化参数Θ,那么这个Θ具体是指什么呢?
我们知道线性代数里,图像的平移,旋转和缩放都可以用矩阵运算来做
举例来说,如果想放大图像中的目标,可以这么运算,把(x,y)中的像素值填充到(x',y')上去,比如把原来(2,2)上的像素点,填充到(4,4)上去。
这属于仿射变换(affine transformation)
在仿射变化中,变化参数就是这6个变量,Θ={a,b,c,d,e,f}(此Θ跟上述旋转变化里的角度Θ无关)。这6个变量就是用来映射输入图和输出图之间的坐标点的关系的,我们在第二步grid generator就要根据这个变化参数,来获取原图的坐标点。
有了第一步的变化参数,这一步是做个矩阵运算,这个运算是以目标图V的所有坐标点为自变量,以Θ为参数做一个矩阵运算,得到输入图U的坐标点。
其中记为输出图V中的第i个坐标点,V中的长宽可以和U不一样,自己定义的,所以这里用i来标识第几个坐标点。
记为输入图U中的点,这里的i是从V中对应过来的,表示V中的第i的坐标点映射的U中坐标,i跟U没有关系。
由于在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)
结合前面的分析,总结一下前向传播的过程,如下图:
参考链接:https://arleyzhang.github.io/articles/7c7952f0/
其中涉及半监督任务—Co localisation(没有标签)。