2015, NIPS
Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu
Google DeepMind
为什么提出(Why)
STN是什么(What)
STN是怎么做的(How)
下面针对每个模块阐述一下
(1) Localisation net
这个模块就是输入U,输出一个变化参数\(\Theta\),那么这个\(\Theta\)具体是指什么呢?
我们知道线性代数里,图像的平移,旋转和缩放都可以用矩阵运算来做
举例来说,如果想放大图像中的目标,可以这么运算,把(x,y)中的像素值填充到(x‘,y‘)上去,比如把原来(2,2)上的像素点,填充到(4,4)上去。
\(\begin{bmatrix}x^{‘}\\ y^{‘}\end{bmatrix}=\begin{bmatrix}2 &0\\0&2\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}+\begin{bmatrix}0\\ 0\end{bmatrix}\)
如果想旋转图像中的目标,可以这么运算(可以在极坐标系中推出来,相关证明放在最后的附录中)
\(\begin{bmatrix}x^{‘}\\ y^{‘}\end{bmatrix}=\begin{bmatrix}cos \Theta & -sin \Theta\\ sin \Theta& cos\Theta\end{bmatrix} \begin{bmatrix}x\\ y\end{bmatrix}+\begin{bmatrix}0\\ 0\end{bmatrix}\)
这些都是属于仿射变换(affine transformation)
\(\begin{bmatrix}x^{‘}\\ y^{‘}\end{bmatrix}=\begin{bmatrix}a & b \\ c& d\end{bmatrix} \begin{bmatrix}x\\ y\end{bmatrix}+\begin{bmatrix}e\\ f\end{bmatrix}\)
在仿射变化中,变化参数就是这6个变量,\(\Theta = \{a,b,c,d,e,f\}\)(此\(\Theta\)跟上述旋转变化里的角度\(\Theta\)无关)
这6个变量就是用来映射输入图和输出图之间的坐标点的关系的,我们在第二步grid generator就要根据这个变化参数,来获取原图的坐标点。
(2) Grid generator
有了第一步的变化参数,这一步是做个矩阵运算,这个运算是以目标图V的所有坐标点为自变量,以$ \Theta $为参数做一个矩阵运算,得到输入图U的坐标点。
\[ \begin{pmatrix}x_{i}^{s}\\ y_{i}^{s}\end{pmatrix}=\Theta \begin{pmatrix}x_{i}^{t}\\ y_{i}^{t}\\ 1\end{pmatrix}
=\begin{bmatrix}
\Theta _{11} & \Theta _{12} & \Theta _{13}\\ \Theta _{21}
& \Theta _{22} & \Theta _{23}
\end{bmatrix}\begin{pmatrix}
x_{i}^{t}\\ y_{i}^{t}
\\ 1
\end{pmatrix}\]
其中$ {(x_{i}^{t},y_{i}^{t})}$记为输出图V中的第i个坐标点,V中的长宽可以和U不一样,自己定义的,所以这里用i来标识第几个坐标点
$ {(x_{i}^{s},y_{i}^{s})}$记为输入图U中的点,这里的i是从V中对应过来的,跟U没有关系
(3) Sampler
由于在第二步计算出了V中每个点对应到U的坐标点,在这一步就可以直接根据V的坐标点取得对应到U中坐标点的像素值来进行填充,而不需要经过矩阵运算。需要注意的是,填充并不是直接填充,首先计算出来的坐标可能是小数,要处理一下,其次填充的时候往往要考虑周围的其它像素值。填充根据的公式如下。
\[V_{i}=\sum _n \sum _m U_{nm}*k(x_{i}^{s}-m;\phi _x)*k(y_{i}^{s}-n;\phi _y)\]
其中n和m会遍历原图U的所有坐标点,\(U_{nm}\)指原图U中某个点的像素值,k()为取样核,两个\(\phi\)为参数,\((x_{i}^{s},y_{i}^{s})\)表示V中第i个点要到U图中找的对应点的坐标,k表示使用不同的方法来填充,通常会使用双线性插值,则会得到下面的公式
\[V_{i}=\sum _n \sum _m U_{nm}*max(0, 1 - |x_{i}^{s}-m|)*max(0, 1 - |y_{i}^{s}-n|)\]
举例来说,我要填充目标图V中的(2,2)这个点的像素值,经过以下计算得到(1.6,2.4)
\[\begin{pmatrix}x_{i}^{s}\\ y_{i}^{s}\end{pmatrix}
=\begin{bmatrix}
\Theta _{11} & \Theta _{12} & \Theta _{13}\\ \Theta _{21}
& \Theta _{22} & \Theta _{23}
\end{bmatrix}\begin{pmatrix}
x_{i}^{t}\\ y_{i}^{t}
\\ 1
\end{pmatrix}\]
\[\begin{pmatrix}1.6\\ 2.4\end{pmatrix}
=\begin{bmatrix}
0 & 0.5 & 0.6\\ 1
& 0 & 0.4
\end{bmatrix}\begin{pmatrix}
2\\ 2
\\ 1
\end{pmatrix}\]
如果四舍五入后直接填充,则难以做梯度下降。
我们知道做梯度下降时,梯度的表现就是权重发生一点点变化的时候,输出的变化会如何。
如果用四舍五入后直接填充,那么(1.6,2.4)四舍五入后变成(2,2)
当\(\Theta\)(我们求导的时候是需要对\(\Theta\)求导的)有一点点变化的时候,(1.6,2.4)可能变成了(1.9,2.1)四舍五入后还是变成(2,2),输出并没有变化,梯度没有改变,这个时候没法用梯度下降来优化\(\Theta\)
如果采用上面双线性插值的公式来填充,在这个例子里就会考虑(2,2)周围的四个点来填充,这样子,当\(\Theta\)有一点点变化的时,式子的输出就会有变化,因为$(x_{i}^{s},y_{i}^{s}) $的变化会引起V的变化。注意下式中U的下标,第一个下标是纵坐标,第二个下标才是横坐标。
\[V = U_{21}(1-0.6)(1-0.4)+ U_{22}(1-0.4)(1-0.4)+ U_{31}(1-0.6)(1-0.6)+ U_{32}(1-0.4)(1-0.6)\]
(4) STN小结
简单总结一下,如下图所示
【实验】Distorted MNIST
【实验】SVHN: Street View House Numbers
【 实验】CUB-200-2011 birds dataset
论文笔记:空间变换网络(Spatial Transformer Networks)
原文:https://www.cnblogs.com/liaohuiqiang/p/9226335.html