- 论文: Spatial Transformer Networks
- 作者:Max Jaderberg Karen Simonyan Andrew Zisserman Koray Kavukcuoglu
- code1:https://github.com/oarriaga/STN.keras
- code2:https://github.com/kevinzakka/spatial-transformer-network
CNN在图像分类中取得了显著的成效,主要是得益于 CNN 的深层结构具有 : 平 移 不 变 性 、 缩 小 不 变 性 \color{red}平移不变性、缩小不变性 平移不变性、缩小不变性;还对缺失的 空 间 不 变 性 ( s p a t i a l l y i n v a r i a n c e ) \color{red}空间不变性(spatially\;invariance) 空间不变性(spatiallyinvariance)做了相应的实验。
空 间 不 变 性 ( s p a t i a l l y i n v a r i a n c e ) \color{red}空间不变性(spatially\;invariance) 空间不变性(spatiallyinvariance)这些不变性的本质就是图像处理的经典手段:空间变换,又服从于同一方法:坐标矩阵的仿射变换。因此DeepMind设计了 S p a t i a l T r a n s f o r m e r N e t w o r k s \color{red}Spatial\;Transformer\;Networks SpatialTransformerNetworks(简称STN),目的就是显式地赋予网络对于以上各项变换(transformation)的不变性(invariance) .
–
主要是要处理 ( 2 × 3 ) (2\times 3) (2×3)的变换矩阵:
T θ = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] (2.1) \mathcal{T}_{\theta} = \begin{bmatrix} \theta _{11} & \theta _{12} & \theta _{13} \\ \theta _{21} & \theta _{22} & \theta _{23} \end{bmatrix}\tag{2.1} Tθ=[θ11θ21θ12θ22θ13θ23](2.1)
平移:
[ 1 0 θ 13 0 1 θ 23 ] [ x y 1 ] = [ x + θ 13 y + θ 23 ] (2.2) \left[\begin{array}{ccc} 1 & 0 & \theta_{13} \\0 & 1 & \theta_{23} \end{array}\right]\left[\begin{array}{l}x \\y \\1 \end{array}\right]=\left[\begin{array}{l} x+\theta_{13} \\y+\theta_{23} \end{array}\right]\tag{2.2} [1001θ13θ23]⎣⎡xy1⎦⎤=[x+θ13y+θ23](2.2)
缩放:
[ θ 11 0 0 0 θ 22 0 ] [ x y 1 ] = [ θ 11 x θ 22 y ] (2.3) \left[\begin{array}{ccc} \theta_{11} & 0 & 0 \\0 & \theta_{22} & 0 \end{array}\right]\left[\begin{array}{l}x \\y \\1 \end{array}\right]=\left[\begin{array}{l} \theta_{11} x \\\theta_{22} y\end{array}\right]\tag{2.3} [θ1100θ2200]⎣⎡xy1⎦⎤=[θ11xθ22y](2.3)
旋转:
对于旋转操作,设绕原点顺时针旋转 α \alpha α 度,坐标仿射矩阵为:
[ cos ( α ) sin ( α ) 0 − sin ( α ) cos ( α ) 0 ] [ x y 1 ] = [ cos ( α ) x + sin ( α ) y − sin ( α ) x + cos ( α ) y ] (2.4) \left[\begin{array}{ccc} \cos (\alpha) & \sin (\alpha) & 0 \\ -\sin (\alpha) & \cos (\alpha) & 0 \end{array}\right]\left[\begin{array}{l}x \\y \\1 \end{array}\right]=\left[\begin{array}{c}\cos (\alpha) x+\sin (\alpha) y \\-\sin (\alpha) x+\cos (\alpha) y \end{array}\right]\tag{2.4} [cos(α)−sin(α)sin(α)cos(α)00]⎣⎡xy1⎦⎤=[cos(α)x+sin(α)y−sin(α)x+cos(α)y](2.4)
由于图像的坐标不是中心坐标系,通常需要做Normalization,把坐标调整到 [ − 1 , 1 ] [-1,1] [−1,1]。这样,就绕图像中心旋转了。
假设fixed image 的坐标点是 [ x t a r , y t a r ] [x^{tar}, y^{tar}] [xtar,ytar],source iamge 的坐标点是 [ x s o u r , y s o u r ] [x^{sour}, y^{sour}] [xsour,ysour],则一般的坐标映射可以表示为:
[ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] [ x s o u r y s o u r 1 ] = [ x t a r y t a r 1 ] (2.5) \begin{bmatrix} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta _{21} & \theta _{22} & \theta _{23} \end{bmatrix}\begin{bmatrix} x^{sour} \\ y^{sour} \\ 1 \end{bmatrix}=\begin{bmatrix} x^{tar} \\ y^{tar} \\1 \end{bmatrix}\tag{2.5} [θ11θ21θ12θ22θ13θ23]⎣⎡xsourysour1⎦⎤=⎣⎡xtarytar1⎦⎤(2.5)
逆向坐标映射表示为( θ ′ \theta' θ′ and θ \theta θ are different):
[ θ 11 ′ θ 12 ′ θ 13 ′ θ 21 ′ θ 22 ′ θ 23 ′ ] [ x t a r y t a r 1 ] = [ x s o u r y s o u r 1 ] (2.6) \begin{bmatrix} \theta'_{11} & \theta'_{12} & \theta'_{13} \\ \theta' _{21} & \theta' _{22} & \theta' _{23} \end{bmatrix}\begin{bmatrix} x^{tar} \\ y^{tar} \\ 1 \end{bmatrix}=\begin{bmatrix} x^{sour} \\ y^{sour} \\1 \end{bmatrix}\tag{2.6} [θ11′θ21′θ12′θ22′θ13′θ23′]⎣⎡xtarytar1⎦⎤=⎣⎡xsourysour1⎦⎤(2.6)
STN采用逆向映射,因为:target image 是固定的,正向的插值过程,都是引用像素坐标是浮点数,相对来说很难插值;对应逆向变换,得到的Source坐标是浮点数,用Source像素插值更加便捷。
一个[1,10]图像放大10倍问题,我们需要将10个像素,扩展到为100的数轴上,整个图像应该有100个像素。
但其中90个对应Source图的坐标是非整数的,是不存在的,如果我们用黑色(RGB(0,0,0))填充,此时图像是惨不忍睹的。所以需要对缺漏的像素进行插值,利用图像数据的局部性近似原理,取邻近像素做平均生成。
插值一般表达式:
V i c = ∑ n H ∑ m W U n m c k ( x i s − m ; Φ x ) k ( y i s − n ; Φ y ) ∀ i ∈ [ 1 … H ′ W ′ ] ∀ c ∈ [ 1 … C ] (2.7) V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} k\left(x_{i}^{s}-m ; \Phi_{x}\right) k\left(y_{i}^{s}-n ; \Phi_{y}\right) \forall i \in\left[1 \ldots H^{\prime} W^{\prime}\right] \forall c \in[1 \ldots C]\tag{2.7} Vic=n∑Hm∑WUnmck(xis−m;Φx)k(yis−n;Φy)∀i∈[1…H′W′]∀c∈[1…C](2.7)
双线性插值的公式:
V i c = ∑ n H ∑ m W U n m c max ( 0 , 1 − ∣ x i s − m ∣ ) max ( 0 , 1 − ∣ y i s − n ∣ ) (2.8) V_{i}^{c}=\sum_{n}^{H} \sum_{m}^{W} U_{n m}^{c} \max \left(0,1-\left|x_{i}^{s}-m\right|\right) \max \left(0,1-\left|y_{i}^{s}-n\right|\right)\tag{2.8} Vic=n∑Hm∑WUnmcmax(0,1−∣xis−m∣)max(0,1−∣yis−n∣)(2.8)
这个插值核函数做的是利用 U U U中离 当前源坐标 ( x i s , y i s ) \left(x_{i}^{s}, y_{i}^{s}\right) (xis,yis) (小数坐标) 最近的 4个整数坐标 ( n , m ) (n, m) (n,m) 处的像素值做双线性插值然后拷贝到 V V V中的 ( x i t , y i t ) \left(x_{i}^{t}, y_{i}^{t}\right) (xit,yit) 坐 标处。
Spatial Transformer Networks的结构,主要的部分—共有三个,它们的功能和名称如下:
- 这里是因为 V V V的大小是先定义好的,当然可以得到 V V V的所有坐标点,而填充 V V V中每个坐标点的像素值的时候,要从 U U U中去取,所以根据 V V V中每个坐标点和变化参数 θ \theta θ进行运算,得到一个坐标。
- 在sampler中就是根据这个坐标去 U U U中找到像素值,这样子来填充 V V V。
根据Grid generator得到的一系列坐标和原图 U U U(因为像素值要从 U U U中取)来填充,因为计算出来的坐标可能为小数,要用另外的方法来填充,比如双线性插值。
论文中多次出现[局部梯度] (Sub-Gradient) 的概念。采样核函数,是不连续的,不能如下直接求导:
g = ∂ V i c ∂ θ (3.5) g=\frac{\partial V_{i}^{c}}{\partial \theta}\tag{3.5} g=∂θ∂Vic(3.5)
而应该是分两步,先对 x i S 、 x i S x_{i}^{S} 、 x_{i}^{S} xiS、xiS 求局部梯度: ∂ V i c ∂ x i c 、 ∂ V i c ∂ y i c \frac{\partial V_{i}^{c}}{\partial x_{i}^{c}} 、 \frac{\partial V_{i}^{c}}{\partial y_{i}^{c}} ∂xic∂Vic、∂yic∂Vic ,后有:
{ g = ∂ V i c ∂ x i S ⋅ ∂ x i S ∂ θ g = ∂ V i c ∂ y i S ⋅ ∂ y i S ∂ θ (3.6) \left\{\begin{aligned} g=\frac{\partial V_{i}^{c}}{\partial x_{i}^{S}} \cdot \frac{\partial x_{i}^{S}}{\partial \theta} \\ g=\frac{\partial V_{i}^{c}}{\partial y_{i}^{S}} \cdot \frac{\partial y_{i}^{S}}{\partial \theta} \end{aligned}\right.\tag{3.6} ⎩⎪⎪⎪⎨⎪⎪⎪⎧g=∂xiS∂Vic⋅∂θ∂xiSg=∂yiS∂Vic⋅∂θ∂yiS(3.6)
有趣的是,对于Theano这种目动求导的 Tools,局部梯度可以直接被忽视。
因为Theano的Tensor机制,会聪明地讨论并且解离非连续函数,追踪每一个可导子式,即便你用了作者们的优雅的采样函数, Tensor.grad函数也能精确只对许出的4个点求导,所以在Theano里讨论非连续函数和局部梯度,是会贻笑大方的。
这个试验的数据集 是 MNIST,不过与原版的MNIST 不同,这个数据集对图片上的数字做了各种形变操作,比如平移,扭曲,放缩,旋转等。
其中CNN的模型与 LeNet是一样的,包含两个池化层。为了公平,所有的网络变种都只包含 3 个可学习参数的层,总体网络参数基本一致,训练策略也相同。
- 左侧:不同的形变策略以及不同的 Spatial Transformer网络变种与 baseline的对比;
- 右侧:一些CNN分错,但是ST-CNN分对的样本
- (a ):输入
- (b ):Spatial Transformer层 的 源坐标(Tθ(G) )可视化结果
- (c ):Spatial Transformer层输出- 很明显:ST-CNN优于CNN, ST-FCN优于FCN,说明Spatial Transformer确实增加了 空间不变性
- FCN中由于没有 池化层,所以FCN的空间不变性不如CNN,所以FCN效果不如CNN
- ST-FCN效果可以达到CNN程度,说明Spatial Transformer确实增加了 空间不变性
- ST-CNN效果优于ST-FCN,说明 池化层 确实对 增加 空间不变性很重要
- 在 Spatial Transformer 中使用 plate spline transformation (TPS) 变换效果是最好的
- Spatial Transformer 可以将歪的数字扭正
- Spatial Transformer 在输入图片上确定的attention区域很明显利于后续分类层分类,可以更加有效地减少分类损失
Street View House Numbers是一个真实的 街景门牌号 数据集,共200k张图片,每张图片包含1-5个数字 ,数字都有形变。
结果: