Spatial Transformer Networks
文章链接:https://arxiv.org/abs/1506.02025
motivation
对于一般的计算机视觉任务(图像分类,目标检测等),我们希望训练的模型对于目标的位置及姿态等各种变化具有鲁棒性,例如图像分类中的平移不变性和目标检测中的平移等价性。在CNN架构当中,卷积运算具有平移等价性,Pooling操作具有小范围的平移不变性,但是当遭受大的目标变化时,这些操作就有些不够用了。
本文中,作者用神经网络对transformation建模,通过对输入特征的变换为下一层提供合适的输入。
方法
其实原理还是很简单的,对于一些空间变换,可以通过变换参数对输入坐标变换后可以得到对应的输出坐标映射,之后将输入坐标上的像素值放到输出坐标上就好了。
STN模块由三部分组成[1]
- Localisation net:一个轻量网络,用来预测变换参数
θ
\theta
θ,用来映射U和V的坐标。
θ = f l o c ( U ) \theta=f_{\mathrm{loc}}(U) θ=floc(U) ,其中 θ \theta θ的维度由变换类型决定,例如仿射变换为6维 - Grid generator:根据V中的坐标点
(
x
i
t
,
y
i
t
)
\left(x_{i}^{t}, y_{i}^{t}\right)
(xit,yit)和变换参数
θ
\theta
θ,计算出在U中的坐标点
(
x
i
s
,
y
i
s
)
\left(x_{i}^{s}, y_{i}^{s}\right)
(xis,yis)。可以发现这里的变换顺序和我们刚开始的想法是反着的(如下图[2])。这是因为我们最后要完成从U中取出像素值,然后放到V中,V的大小是预先定义的,我们可以轻松的获得V中的坐标值
(
x
i
t
,
y
i
t
)
\left(x_{i}^{t}, y_{i}^{t}\right)
(xit,yit)。这样做的一个好处就是可以节省存储方便计算[2],而我想另外还有一个重要的原因是可以合理的将U中的像素值映射到V中,具体而言由从V的坐标算起可以通过插值在U中得到像素值,相反可能就是单纯的点对点也很难反向传播。
( x i s y i s ) = T θ ( G i ) = A θ ( x i t y i t 1 ) = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] ( x i t y i t 1 ) \left(\begin{array}{c}{x_{i}^{s}} \\ {y_{i}^{s}}\end{array}\right)=\mathcal{T}_{\theta}\left(G_{i}\right)=\mathrm{A}_{\theta}\left(\begin{array}{c}{x_{i}^{t}} \\ {y_{i}^{t}} \\ {1}\end{array}\right)=\left[\begin{array}{ccc}{\theta_{11}} & {\theta_{12}} & {\theta_{13}} \\ {\theta_{21}} & {\theta_{22}} & {\theta_{23}}\end{array}\right]\left(\begin{array}{c}{x_{i}^{t}} \\ {y_{i}^{t}} \\ {1}\end{array}\right) (xisyis)=Tθ(Gi)=Aθ⎝⎛xityit1⎠⎞=[θ11θ21θ12θ22θ13θ23]⎝⎛xityit1⎠⎞ - Sampler:我们得到的
(
x
i
s
,
y
i
s
)
\left(x_{i}^{s}, y_{i}^{s}\right)
(xis,yis)可能是实数,但是要求坐标值必须是整数,为了解决这个矛盾,必须要用到插值。
参考资料
[1] https://www.cnblogs.com/liaohuiqiang/p/9226335.html
[2] https://www.cnblogs.com/neopenx/p/4851806.html