Spatial Transformer Networks
Introduction
卷积神经网络(CNN)已经被证明能够训练一个能力强大的分类模型,但与传统的模式识别方法类似,它也会受到数据在空间上多样性的影响。这篇Paper提出了一种叫做空间变换网络(Spatial Transform Networks, STN) 该网络不需要关键点的标定,能够根据分类或者其它任务自适应地将数据进行空间变换和对齐(包括平移、缩放、旋转以及其它几何变换等)。在输入数据在空间差异较大的情况下,这个网络可以加在现有的卷积网络中,提高分类的准确性。
背景知识
线性插值
已知一条直线 l l l上两个点 ( x 0 , y 0 (x_0, y_0 (x0,y0) 与 ( x 1 , y 1 ) (x_1, y_1) (x1,y1),要计算 [ x 0 , x 1 ] [x_0, x_1] [x0,x1] 区间内某一位置 x x x 在直线上的 y y y 值(反过来也是一样,略),由于斜率相等:
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \frac{y - y_0}…
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ y = \frac{x_1 …
也可以理解为用 x x x 和 x 0 , x 1 x_0,x_1 x0,x1 的距离作为一个权重,用于 y 0 y_0 y0 和 y 1 y_1 y1 的加权。而双线性插值本质上就是在两个方向上做线性插值。
双线性插值
在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。见下图:
假如我们想得到未知函数 f f f 在点 P = ( x , y ) P = (x, y) P=(x,y) 的值,假设我们已知函数 f f f 在 Q 11 = ( x 1 , y 1 ) Q_{11} = (x_1, y_1) Q11=(x1,y1) , Q 12 = ( x 1 , y 2 ) Q_{12} = (x_1, y_2) Q12=(x1,y2), Q 21 = ( x 2 , y 1 ) Q_{21} = (x_2, y_1) Q21=(x2,y1) 以及 Q 22 = ( x 2 , y 2 ) Q_{22} = (x_2, y_2) Q22=(x2,y2) 四个点的值。最常见的情况, f f f 就是一个像素点的像素值。首先在 x x x 方向进行线性插值,得到:
f ( R 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) where R 1 = ( x , y 1 ) f(R_1)\approx \frac{x_2-x}{x_2-x_1}f(Q_{11})+\frac{x-x_1}{x_2-x_1}f(Q_{21}) \quad \text {where} \quad R_1=(x,y_1) f(R1)≈x2−x1x2−xf(Q11)+x2−x1x−x1f(Q21)whereR1=(x,y1)
f ( R 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) where R 2 = ( x , y 2 ) f(R_2)\approx \frac{x_2-x}{x_2-x_1}f(Q_{12})+\frac{x-x_1}{x_2-x_1}f(Q_{22}) \quad \text {where} \quad R_2=(x,y_2) f(R2)≈x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22)whereR2=(x,y2)
然后在 y y y 方向进行线性插值,得到:
f ( P ) ≈ y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(P)\approx \frac{y_2-y}{y_2-y_1}f(R_{1})+\frac{y-y_1}{y_2-y_1}f(R_{2}) f(P)≈y2−y1y2−yf(R1)+y2−y1y−y1f(R2)
综合起来就是双线性插值最后的结果:
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{split} …
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。
仿射变换(affine transformation)
-
scaling: scales the x and y direction by a scalar.
K ′ = [ p 0 0 0 q 0 ] [ x y 1 ] = [ p x q y ] % <![CDATA[ K' = \begin{bmatrix} p & 0 & 0 \\ 0 & q & 0 \end{bmatrix} % \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} px \\ qy \end{bmatrix} %]]> K′=[p00q00]⎣⎡xy1⎦⎤=[