Spatial Transformer Networks(空间变换神经网络)

Reference:Spatial Transformer Networks [Google.DeepMind]
Reference:[Theano源码,基于Lasagne]

闲扯:大数据不如小数据

这是一份很新的Paper(2015.6),来自于Google旗下的新锐AI公司DeepMind的三位剑桥Phd研究员。

他们针对CNN的特点,构建了一个新的局部网络层,称为空间变换层,如其名,它能将输入图像做任意空间变换。

在我的论文[深度神经网络在面部情感分析系统中的应用与改良]中,提出了一个有趣观点:

大数据不如小数据,如果大数据不能被模型有效利用。

该现象是比较常见的,如ML实战的一个经典问题:数据不均衡,这样模型就会对大类数据过拟合,忽略小类数据。

另外,就是[Evolving Culture vs Local Minima:文化、进化与局部最小值]提到的课程学习观点:

将大数据按照难易度剖分,分批学习,要比直接全部硬塞有效得多。

当前,我们炙手可热的模型仍然是蒟蒻的,而数据却是巧夺天工、超乎想象的。

因而,想要通过模型完全摸清数据的Distribution是不现实的,发明、改良模型结构仍然是第一要务,

而不单纯像Li Feifei教授剑走偏锋,用ImageNet这样的大数据推进深度学习进程。

空间变换的重要意义

在我的论文[深度神经网络在面部情感分析系统中的应用与改良]中,分析了CNN的三个强大原因:

[局部性][平移不变性][缩小不变性],还对缺失的[旋转不变性]做了相应的实验

这些不变性的本质就是图像处理的经典手段,[裁剪][平移][缩放][旋转]。

这些手段又属于一个家族:空间变换,又服从于同一方法:坐标矩阵的仿射变换。

那么,神经网络是否有办法,用一种统一的结构,自适应实现这些变换呢?DeepMind用一种简易的方式实现了。

图像处理技巧:仿射矩阵、逆向坐标映射、双线性插值

1.1 仿射变换矩阵

实现[裁剪][平移][缩放][旋转],只需要一个$[2,3]$的变换矩阵:

$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}$

—————————————————————————————————————————————————————————

对于平移操作,坐标仿射矩阵为:

$\begin{bmatrix}1 & 0 & \theta_{13} \\ 0& 1 & \theta_{23}\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}x+\theta_{13}\\
y+\theta_{23}\end{bmatrix}$

—————————————————————————————————————————————————————————

对于缩放操作,坐标仿射矩阵为:

$\begin{bmatrix}\theta_{11} & 0 & 0 \\ 0& \theta_{22} & 0\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}\theta_{11}x\\
\theta_{22}y\end{bmatrix}$

—————————————————————————————————————————————————————————

对于旋转操作,设绕原点顺时针旋转$\alpha$度,坐标仿射矩阵为:

$\begin{bmatrix}cos(\alpha) & sin(\alpha) & 0 \\ -sin(\alpha)& cos(\alpha) & 0\end{bmatrix}\begin{bmatrix}x\\ y\\1\end{bmatrix}=\begin{bmatrix}
cos(\alpha)x+sin(\alpha)y\\ -sin(\alpha)x+cos(\alpha)y\end{bmatrix}$

这里有个trick,由于图像的坐标不是中心坐标系,所以只要做下Normalization,把坐标调整到[-1,1]。

这样,就绕图像中心旋转了,下文中会使用这个trick。

—————————————————————————————————————————————————————————

至于裁剪操作,没有看懂Paper的关于左2x2 sub-matrix的行列式值的解释,但可以从坐标范围解释:

只要$x^{‘}$、$y^{‘}$的范围比$x$,$y$小,那么就可以认为是目标图定位到了源图的局部。

这种这种仿射变换没有具体的数学形式,但肯定是可以在神经网络搜索过程中使用的。

1.2 逆向坐标映射

在线性代数计算中,一个经典的求解思路是:

$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}\begin{bmatrix}x^{Source}\\ y^{Source}\\ 1\end{bmatrix}=\begin{bmatrix}x^{Target}\\ y^{Target}\end{bmatrix}$

这种做法在做图像处理时,会给并行矩阵程序设计造成尴尬——需要牺牲额外的空间存储映射源,:

由于$(x^{Target},y^{Target})$必然是离散的,当我们需要得到$Pixel(x^{Target},y^{Target})$的值时,

如果不及时保存$(x^{Source},y^{Source})$,那么就必须即时单点复制$Pixel(x^{Source},y^{Source})->Pixel(x^{Target},y^{Target})$

显然,这种方法的实现依赖于$For$循环:

$For(0....i....Height)\\ \quad For(0....j....Width) \\ \quad \quad Calculate\&Copy$

为了能让矩阵并行计算成为可能,我们需要逆转一下思路:

$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}^{‘}\begin{bmatrix}x^{Target}\\ y^{Target}\\ 1\end{bmatrix}=\begin{bmatrix}x^{Source}\\ y^{Source}\end{bmatrix}$

之后,构建变换目标图就转化成了,数组下标取元素问题:

$PixelMatrix^{Target}=PixelMatrix^{Source}[x^{Source},y^{Source}]$

这依赖于仿射矩阵的一个性质:

$\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}^{‘}=\begin{bmatrix}\theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21}& \theta_{22} & \theta_{23}\end{bmatrix}^{-1}$

即,由Target变换为Source时,新仿射矩阵为源仿射矩阵的逆矩阵。

1.3 双线性插值

考虑一个$[1,10]$图像放大10倍问题,我们需要将10个像素,扩展到为100的数轴上,整个图像应该有100个像素。

但其中90个对应Source图的像素坐标是非整数的,是不存在的,如果我们用黑色( $RGB(0,0,0)$ )  ,此时图像是惨不忍睹的。

所以需要对缺漏的像素进行插值,利用图像数据的局部性近似原理,取邻近像素做平均生成。

双线性插值是一个兼有质量与速度的方法(某些电子游戏里通常这么排列:线性插值、双线性插值....):

如果$(x^{Source},y^{Source})$是实数坐标,那么先取整(截尾),然后沿轴扩展$d$个坐标单位,得到$P_{21}$、$P_{12}$、$P_{22}$

一般的(源码中),取$d=1$,式中分母全被消去,再利用图中双线性插值式进行插值,得到$Pixel(x^{Source},y^{Source})$的近似值。

时间: 2024-08-10 23:26:18

Spatial Transformer Networks(空间变换神经网络)的相关文章

【论文笔记】Spatial Transformer Networks

参考文献:**Jaderberg M, Simonyan K, Zisserman A. Spatial transformer networks[C]//Advances in Neural Information Processing Systems. 2015: 2017-2025. 摘要 卷积神经网络(CNN)已经被证明能够训练一个能力强大的分类模型,但与传统的模式识别方法类似,它也会受到数据在空间上多样性的影响.这篇Paper提出了一种叫做空间变换网络(Spatial Transfor

spatial transformer networks 这篇论文

大致看了看这个paper, 很novel. 我的观点: 在traditional convolutional neural netwoks 中,我们通常会depend 于 extracting features.       而本paper把 hand-crafted 和 feature extraction 结合在了一起,用于处理 invariance of various inputs. spatial transformer 可以包括:平移.旋转.放缩等操作.      在数学上的名称有:

Spatial Transformer Networks

参考:http://blog.csdn.net/xbinworld/article/details/69049680 论文的关键在理解这句话: 先通过V中坐标(xtarget,ytarget)以此找到它在U中的坐标,然后再通过双线性插值采样出真实的像素值,放到(xtarget,ytarget).

纯干货:深度学习实现之空间变换网络-part2

https://www.jianshu.com/p/854d111670b6 纯干货:深度学习实现之空间变换网络-part1 在第一部分中,我们主要介绍了两个非常重要的概念:仿射变换和双线性插值,并了解到这两个概念对于理解空间变换网络(Spatial Transformer Networks)非常重要. 在这篇文章中,我们将详细介绍一篇空间变压器网络这一论文--Go ogle Deepmind的研究人员Max Jaderberg,Karen Simonyan,Andrew Zisserman和K

Spatial Transformer Network

https://blog.csdn.net/yaoqi_isee/article/details/72784881 Abstract: 作者说明了CNN对于输入的数据缺乏空间变换不变形(lack of spatially invariant ability to input data),因此作者引入了一个spatial transformer module,不需要额外的监督,能够以data-driven的方式学习得到输入图像的空间变换参数,赋予网络spatial invariant能力. Int

OpenGL中的空间变换

OpenGL中的空间变换 在使用OpenGL的三维虚拟程序中,当我们指定了模型的顶点之后,在屏幕上显示它们之前,一共会发生3种类型的变换:视图变换.模型变换.投影变换. 视图变换:指定观察者(摄像机)的位置: 模型变换:在场景中移动物体: 投影变换:改变可视区域的大小: 视口变换:这是一种伪变换,它对窗口上的最终输出进行缩放. 视觉坐标 它表示一种虚拟的固定坐标系统,通常作为一种参考系使用.它是根据观察者(摄像机)的角度而言的,与可能发生的变换无关.我们接下来所讨论的所有变换都是根据它们相对于视

PIE SDK彩色空间变换

1. 算法功能简介 使用彩色空间变换工具可以将三波段红.绿.蓝图像变换到一个特定的彩色空间,并且能从所选彩色空间变换回 RGB.两次变换之间,通过对比度拉伸,可以生成一个色彩增强的彩色合成图像.此外,颜色亮度值波段或亮度波段可以被另一个波段(通常具有较高的空间分辨率)代替,生成一幅合成图像(将一幅图像的色彩特征与另一幅图像的空间特征相结合). 彩色变换的一般工作流程:选择波段进行 RGB 合成显示→进行彩色变换→进行其他的图像处理→进行彩色逆变换→RGB 合成显示. PIE SDK支持算法功能的

坐标变换,空间变换的本质

坐标变换或空间变换,本质是相对坐标的变化,绝对坐标没变. 世界空间有两个物体A,B.将A变换到B的坐标空间意思是:将A从世界空间变换到B的局部坐标空间,也就是在B的局部坐标系中重新表示A的坐标(也就是求出A在B坐标系中的相对坐标) 做法很简单: 1,A - B 得到一个向量 V, 2,把V分解(投影)到B的局部坐标的各轴上,一般用单位向量的点乘实现,因为点乘表示投影,即  x = dot(V, X), y=dot(V, Y), z=dot(V, Z),X,Y,Z是B坐标系的三个轴 得到的结果就是

“生动”讲解——矩阵的空间变换

几何图形的矩阵表示: 我们把每个顶点坐标看成一个行向量,采用齐次坐标法,即每个顶点坐标增加一个相同的分量1作为矩阵的一行,这样就可以用矩阵表示图形了.如: 点A(1,-1),增加一个分量1,将其作为一个矩阵的行向量A=[1?11]; 以此类推,所以这个图形可以用矩阵来表示,即: P=?????131?2?113?21111????? 平移变换: 如果平移向量是(a, b),点(x, y)平移后的点为(x+a, y+b). 如下图所示: 平移变换矩阵: 平移变换矩阵为:???10a01b000??