空间变换网络Spatial Transformer Networks(STN)

相关理论

(见https://zhuanlan.zhihu.com/p/37110107)
在理解STN之前,先简单了解一下基本的仿射变换、双线性插值。

1.仿射变换(Affine transformation)
下面的所有变换假设都是针对一幅图像,即一个三维数组(HWC),这里为简单起见,假设图像都是单通道(C=1)的。首先说明一下待会要用到的符号:

(x,y): 原图像中某一点A的位置
(x′,y′): 变换后图像中A点对应的位置
平移(translation)

若将原图像沿x和y方向分别平移 \delta x在这里插入图片描述,即:

写成矩阵形式如下:
在这里插入图片描述

缩放(Scaling)

假设将图像分别沿x和y方向分别缩放p倍和q倍,且p>0,q>0,即:

在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述

旋转(Rotation)
在这里插入图片描述

图2.旋转变换示意图

写成矩阵形式如下:

在这里插入图片描述
剪切(Shear)
在这里插入图片描述
剪切变换指的是类似于四边形不稳定性那种性质,方形变平行四边形。任意一边都可以被拉长,以一定比例的x补偿y,也以一定比例的y补偿x。

仿射变换(Affine transformation)

其实上面几种常见变换都可以用同一种变换来表示,就是仿射变换,它有更一般的形式,如下:

在这里插入图片描述
a,b,c,d,e,f取不同的值就可以表示上述不同的变换。当6个参数取其上述变换以外的值时,为一般的仿射变换,效果相当于从不同的位置看同一个目标。
2.双线性插值(详见https://blog.csdn.net/qq_30339595/article/details/84945474)

STN算法细节

(见https://zhuanlan.zhihu.com/p/42692080)

  1. ST
    ST由三个模块组成:

  2. Localisation Network:该模块学习仿射变换矩阵(附件A);

  3. Parameterised Sampling Grid:根据Localisation Network得到仿射变换矩阵,得到输出Feature Map和输入Feature Map之间的位置映射关系;

  4. Differentiable Image Sampling:计算输出Feature Map的每个像素点的值。

STM的结构见图1:
在这里插入图片描述

图1:STM的框架图
ST使用的插值方法属于“后向插值”的一种,即给定输出Feature Map上的一个点在这里插入图片描述,我们某种变化呢反向找到其在输入Feature Map中对应的位置 在这里插入图片描述,如果 在这里插入图片描述为整数,则输出Feature Map在 在这里插入图片描述处的值和输入Feature Map在 在这里插入图片描述处的值相同,否则需要通过插值的方法得到输出Feature Map在在这里插入图片描述处的值。

说了后向插值,当然还有一种插值方式叫做前向插值,例如在Mask R-CNN中介绍的插值方法。

Localisation Network

Localisation Network是一个小型的卷积网络 \Theta = f_{loc}(U) ,其输入是Feature Map ( U\in R^{W\times H\times C} ),输出是仿射矩阵 \Theta 的六个值。因此输出层是一个有六个节点回归器。

\ theta = \left[ \begin{matrix} \theta_{11} & \theta_{12} & \theta_{13} \ \theta_{21} & \theta_{22} & \theta_{23} \end{matrix} \tag{1} \right]

下面的是源码中给出的Localisation Network的结构:

locnet = Sequential()
locnet.add(MaxPooling2D(pool_size=(2,2), input_shape=input_shape))
locnet.add(Conv2D(20, (5, 5)))
locnet.add(MaxPooling2D(pool_size=(2,2)))
locnet.add(Conv2D(20, (5, 5)))

locnet.add(Flatten())
locnet.add(Dense(50))
locnet.add(Activation('relu'))
locnet.add(Dense(6, weights=weights))

Parameterised Sampling Grid

Parameterised Sampling Grid利用Localisation Network产生的 \Theta 进行仿射变换,即由输出Feature Map上的某一位置 G_i = (x^t_i, y^t_i) 根据变换参数 \theta 得到输入Feature Map的某一位置 (x^s_i, y^s_i)

\left(\begin{matrix}x_i^s \y_i^s\end{matrix} \right) = \mathcal{T}_\theta(G_i) = \Theta\left(\begin{matrix}x_it\y_it\1\end{matrix}\right) = \left[\begin{matrix}\theta_{11} & \theta_{12} & \theta_{13} \ \theta_{21} & \theta_{22} & \theta_{23}\end{matrix}\right] \left(\begin{matrix}x_it\y_it\1\end{matrix}\right) \tag{2}

里需要注意两点:

  1. \Theta 可以是一个更通用的矩阵,并不局限于仿射变换,甚至不局限于6个值;

  2. 映射得到的 (x^s_i, y^s_i) 一般不是整数,因此不能 (x^t_i, y^t_i) 不能使用 (x^s_i, y^s_i) 的值,而是根据它进行插值,也就是我们下一节要讲的东西。

Differentiable Image Sampling

如果 (x^s_i, y^s_i) 为一整数,那么输出Feature Map的 (x^t_i, y^t_i) 处的值便可以从输入Feature Map上直接映射过去。然而在的1.2节我们讲到, (x^s_i, y^s_i) 往往不是整数,这时我们需要进行插值才能确定输出其值,在这个过程叫做一次插值,或者一次采样(Sampling)。插值过程可以用下式表示:

V_{i}^c = \sum^H_n \sum^W_m U^c_{nm} k(x_i^s-m;\Phi_x) k(y_i^s -m; \Phi_y) ,\quad where\quad \forall i\in[1,...,H'W'],\forall c\in[1,...,C] \tag{3}

上式中,函数 f() 表示插值函数,本文将以双线性插值为例进行解析, \Phi 为 f() 中的参数, U^c_{nm}为输入Feature Map上点 (n, m, c) 处的值, V_i^c 便是插值后输出Feature Map的 (x^t_i, y^t_i) 处的值。

H’,W’ 分别为输出Feature Map的高和宽。当 H’=H 并且 W’=W 时,则ST是正常的仿射变换,当 H’=H/2 并且 W’=W/2 时, 此时ST可以起到和池化类似的降采样的功能。

以双线性插值为例,插值过程即为:

V_{i}^c = \sum^H_n \sum^W_m U^c_{nm} max(0, 1 - |x_i^s-m|) max(0,1-|y_i^s -m|) \tag{4}

上式可以这么理解:遍历整个输入Feature Map,如果遍历到的点 (n,m) 距离大于1,即 |x_i^s-m|>1 ,那么 max(0, 1 - |x_i^s-m|)=0 ( n 处同理),即只有距离 (x^s_i, y^s_i) 最近的四个点参与计算。且距离与权重成反比,也就是距离越小,权值越大,也就是双线性插值的过程,如图3。其中 (x^s_i, y^s_i)=(1.2, 2.3) , U_{12} = 1, U_{13} = 2, U_{22} = 3, U_{23}=4 ,则:

V _{(x_i^s, y_i^s) } = 0.8 \times 0.7 \times 1 + 0.2 \times 0.7 \times 2 + 0.8 \times 0.3 \times 3 + 0.2 \times 0.3 \times 4 = 1.8 \tag{5}

图3:STN中的双线性插值示例
上式中的几个值都是可偏导的:
在这里插入图片描述
在这里插入图片描述
\frac{\partial V_i^c}{\partial U_{nm}^c} = \sum^H_n \sum^W_m max(0, 1 - |x_i^s-m|) max(0,1-|y_i^s -m|) \tag{6}

再对 \theta 求导为:

\frac{\partial V_i^c}{\partial \theta} = \left( \begin{matrix} \frac{\partial V_i^c}{\partial x_i^s}\cdot\frac{\partial x_i^s}{\partial \theta} \ \frac{\partial V_i^c}{\partial y_i^s}\cdot\frac{\partial y_i^s}{\partial \theta} \end{matrix} \right) \tag{9}

ST的可导带来的好处是其可以和整个卷积网络一起端到端的训练,能够以layer的形式直接插入到卷积网络中。

  1. STN
    1.3节中介绍过,将ST插入到卷积网络中便得到了STN,在插入ST的时候,需要注意以下几点:

在输入图像之后接一个ST是最常见的操作,也是最容易理解的,即自动图像矫正;
理论上讲ST是可以以任意数量插入到网络中的任意位置,ST可以起到裁剪的作用,是一种高级的Attention机制。但多个ST无疑增加了网络的深度,其带来的收益价值值得讨论;
STM虽然可以起到降采样的作用,但一般不这么使用,因为基于ST的降采样产生了对其的问题;
可以在同一个卷积网络中并行使用多个ST,但是一般ST和图像中的对象是 1:1 的关系,因此并不是具有非常广泛的通用性。

猜你喜欢

转载自blog.csdn.net/qq_30339595/article/details/84945961
今日推荐