Spatial Transformer Networks空间变换网络

一、相关背景

如果网络能够对经过平移、旋转、缩放及裁剪等操作的图片得到与未经变换前相同的检测结果,我们就说这个网络具有空间变换不变性(将平移、旋转、缩放、裁剪不变性统称为空间不变性)。具有空间变换不变性的网络能够得到更精确的分类结果。传统CNN网络的池化层具有平移不变性(网络在平移小于池化矩阵的范围时具有平移不变性。所有只有平移小于这个范围,才能保证平移不变性。)但是CNN网络对于大尺度的空间变换并不具备不变性。STN提出的空间网络变换层,具有平移不变性、旋转不变性以及缩放不变性等强大的性能。

如下图所示:输入手写字体,我们感兴趣的时黄色框中的包含数字的区域,那么在训练的过程中,学习到的空间变换网络会自动提取黄色框中的局部数据特征,并对框内的数据进行空间变换,得到输出output。综上所述,空间变换网络主要有如下三个作用:

  • 可以将输入转换为下一层期望的形式
  • 可以在训练的过程中自动选择感兴趣的区域特征
  • 可以实现对各种形变的数据进行空间变换
    在这里插入图片描述
    图1.空间变换网络作用示意图

二、相关理论

在理解STN之前,先简单了解一下基本的仿射变换、双线性插值

1.仿射变换(Affine transformation)

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

  • (x,y):原图像中某一点A的位置
  • (x‘,y’):变换后图像中A点对应的位置

平移(translation)
若将原图像沿x和y方向分别平移 delta x 和delta y,即:
在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述
缩放(Scaling)
假设将图像分别沿x和y方向分别缩放p倍和q倍,且p>0,q<0,即:
在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述
旋转(Rotation)
在这里插入图片描述
图2.旋转变换示意图

如上图所示,点A旋转θ角到点B,由B点可得
在这里插入图片描述
由A点可得:
在这里插入图片描述
整理可得:
在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述
剪切(shear)
剪切变换指的时类似于四边形不稳定性那种性质,方形变平行四边形。任意一边都可以被拉长,以一定比例的x补偿y,也以一定比例的y补偿x。
在这里插入图片描述
仿射变换(Affine transformation)
其实上面几种常见变换都可以用同一种变换来表示,就是仿射变换,它有更一般的形式,如下:
在这里插入图片描述
a,b,c,d,e,f取不同的值就可以表示上述不同的变换。当6个参数取其上述变换以外的值时,为一般的仿射变换,效果相当于从不同的位置看同一个目标。

2.双线性插值(Bilinear Interpolation)

在对图像进行仿射变换时,会出现一个问题,当原图像中某一点的坐标映射到变换后图象时,坐标可能会出现小数,而我们知道,图像上某一像素点的位置坐标只能是整数,那该怎么办?这时候双线性插值就起作用了。在介绍双线性插值之前,先讲一下线性插值的计算方法:已知点(x0,y0)与(x1,y1),要计算[x0,x1]区间内某一位置x在直线上的y值,可以采用两点式写出直线方程并求得y的取值如下:
在这里插入图片描述
双线性插值的基本思想是通过某一点周围四个点的灰度值来估计出该点的灰度值,如图3所示
在这里插入图片描述
图3.双线性插值示意图

已知Q11、Q12、Q21、Q22四点的坐标,要求点P的坐标。分成两步,首先在x方向进行线性插值,得到:在这里插入图片描述
在这里插入图片描述
然后在 y 方向进行线性插值,得到:
在这里插入图片描述
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。整合上述公式有:
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。整合上述公式有:
在图像处理的时候,我们先根据
  srcX=dstX* (srcWidth/dstWidth),
  srcY = dstY * (srcHeight/dstHeight)
来计算目标像素在源图像中的位置,这里计算的srcX和srcY一般都是浮点数,比如f(1.2, 3.4)这个像素点是虚拟存在的,先找到与它临近的四个实际存在的像素点
  (1,3) (2,3)
  (1,4) (2,4)
写成f(i+u,j+v)的形式,则u=0.2,v=0.4, i=1, j=3
在沿着X方向差插值时,f(R1)=u(f(Q21)-f(Q11))+f(Q11)
沿着Y方向同理计算。
或者,直接整理一步计算,
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)

三、算法概述

在这里插入图片描述
STN网络包括三部分:

  • Localisation Network-局部网络
  • Parameterised Sampling Grid-参数化网格采样
  • Differentiable Image Sampling-差分图像采样

1.Localisation Network-局部网络

输入:特征图

输出:变换矩阵 ,用于下一步计算( 输出规模视具体的变换。以仿射变换为例, 是一个[2,3]大小的6维参数)
注: θ被初始化为恒等变换矩阵,通过损失函数不断更正θ的参数,最终得到期望的仿射变换矩阵。得到输出特征图后最重要的是得到输出特征图每个位置的像素值。(图像对于计算机来说就是一个0-255的像素值组成的矩阵,图像经过空间变换后每个点的像素值肯定会发生变化,下面就介绍如何确定变换后的特征图每个位置的像素值)

2. Parameterised Sampling Grid-参数化网格采样

此步骤的目地是为了得到输出特征图的坐标点对应的输入特征图的坐标点的位置。计算方式如下:
在这里插入图片描述
在这里插入图片描述
式中s代表输入特征图像坐标点,t代表输出特征图坐标点, A_{\theta} 是局部网络的输出。这里需要注意的是坐标的映射关系是从目标图片——>输入图片。这是因为输入图片与目标图片坐标点均是人为定义的标准化格点矩阵,x,y的值在-1到1之间,图片任何一个位置的坐标点是固定不变的。这就好比两个坐标完全一样的图像,无论用谁乘以仿射变换矩阵,都可以得到经过仿射变换后的图像与原坐标点的映射关系。也就是说这里即使把坐标的映射关系变为输入图片——>目标图片得到的也是一样的映射关系。至于为什么要使用前者来求解这种映射关系,个人理解的是目标图片是我们期望的输出,我们通常以输出为参考,依次获得目标图片在每个坐标点的像素值。比如目标图片坐标点(0,0)对应输入图片坐标点(3,1),我们就先取出输入图片坐标点(3,1)处的像素值,这样依次获得目标图片在每个坐标点的像素值。通过上面的解释相信你们也能理解为什么没有使用仿射变换的逆矩阵。

通过这一步,我们已经得到变换后的输出特征图每个位置的坐标在输入特征图上的对应坐标点。下面我们就可以直接提取出输入特征图的每个位置的像素值(tensorflow有专门的函数可以得到指定位置的像素值)。在提取像素值之前,我们应该注意到一点:目标图片的坐标点对应的输入图片的坐标点不一定是整数坐标点(例如目标图片坐标点(0,1)对应输入图片坐标点(3.2,1.3)),而仅仅整数坐标才能提取像素值,所以需要利用插值的方式来计算出对应该点的灰度值(像素值)。可以看出,步骤一为步骤二提供了仿射变换的矩阵,步骤二为步骤三提供了输出特征图的坐标点对应的输入特征图的坐标点的位置,步骤三只需要提取这个对应的坐标点的像素值(非整数坐标需要使用双向性插值提取像素值)就能最终得到输出特征图V。
在这里插入图片描述
左图为输出特征图 右图为输入特征图

3.Differentiable Image Sampling-差分图像采样
这一步完成的任务就是利用期望的插值方式来计算出对应点的灰度值。这里以双向性插值为例讲解,论文中给出了双向性插值的计算公式如下:
在这里插入图片描述
在这里插入图片描述
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。整合上述公式有:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值