相关理论
(见https://zhuanlan.zhihu.com/p/37110107)
在理解STN之前,先简单了解一下基本的仿射变换、双线性插值。
1.仿射变换(Affine transformation)
下面的所有变换假设都是针对一幅图像,即一个三维数组(HWC),这里为简单起见,假设图像都是单通道(C=1)的。首先说明一下待会要用到的符号:
(x,y): 原图像中某一点A的位置
(x′,y′): 变换后图像中A点对应的位置
平移(translation)
若将原图像沿x和y方向分别平移 和,即:
写成矩阵形式如下:
缩放(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)
-
ST
ST由三个模块组成: -
Localisation Network:该模块学习仿射变换矩阵(附件A);
-
Parameterised Sampling Grid:根据Localisation Network得到仿射变换矩阵,得到输出Feature Map和输入Feature Map之间的位置映射关系;
-
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是一个小型的卷积网络 ,其输入是,输出是仿射矩阵 的六个值。因此输出层是一个有六个节点回归器。
下面的是源码中给出的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产生的 进行仿射变换,即由输出Feature Map上的某一位置 根据变换参数 得到输入Feature Map的某一位置 :
里需要注意两点:
-
可以是一个更通用的矩阵,并不局限于仿射变换,甚至不局限于6个值;
-
映射得到的 一般不是整数,因此不能 不能使用 的值,而是根据它进行插值,也就是我们下一节要讲的东西。
Differentiable Image Sampling
如果 为一整数,那么输出Feature Map的 处的值便可以从输入Feature Map上直接映射过去。然而在的1.2节我们讲到, 往往不是整数,这时我们需要进行插值才能确定输出其值,在这个过程叫做一次插值,或者一次采样(Sampling)。插值过程可以用下式表示:
在
上式中,函数 f() 表示插值函数,本文将以双线性插值为例进行解析, 为 f() 中的参数, 为输入Feature Map上点 (n, m, c) 处的值, 便是插值后输出Feature Map的 处的值。
H’,W’ 分别为输出Feature Map的高和宽。当 H’=H 并且 W’=W 时,则ST是正常的仿射变换,当 H’=H/2 并且 W’=W/2 时, 此时ST可以起到和池化类似的降采样的功能。
以双线性插值为例,插值过程即为:
上式可以这么理解:遍历整个输入Feature Map,如果遍历到的点 (n,m) 距离大于1,即 | ,那么 ( n 处同理),即只有距离 最近的四个点参与计算。且距离与权重成反比,也就是距离越小,权值越大,也就是双线性插值的过程,如图3。其中 ,则:
图3:STN中的双线性插值示例
上式中的几个值都是可偏导的:
再对 求导为:
ST的可导带来的好处是其可以和整个卷积网络一起端到端的训练,能够以layer的形式直接插入到卷积网络中。
- STN
1.3节中介绍过,将ST插入到卷积网络中便得到了STN,在插入ST的时候,需要注意以下几点:
在输入图像之后接一个ST是最常见的操作,也是最容易理解的,即自动图像矫正;
理论上讲ST是可以以任意数量插入到网络中的任意位置,ST可以起到裁剪的作用,是一种高级的Attention机制。但多个ST无疑增加了网络的深度,其带来的收益价值值得讨论;
STM虽然可以起到降采样的作用,但一般不这么使用,因为基于ST的降采样产生了对其的问题;
可以在同一个卷积网络中并行使用多个ST,但是一般ST和图像中的对象是 1:1 的关系,因此并不是具有非常广泛的通用性。