STN系列之Spatial Transformer Networks

来源:互联网 发布:网络作家收入怎么收税 编辑:程序博客网 时间:2024/06/10 00:41

本来是要看这篇paper的:Supervised Transformer Network for Efficient Face Detection. Dong Chen, Gang Hua, Fang Wen, and Jian SunMicrosoft Research

这是一篇2016年做人脸检测的工作,主要的idea是通过一个transform net来把人脸对齐的过程变成end-to-end,隐式的来做。其先导工作为
Spatial Transformer Networks. Max Jaderberg Karen Simonyan Andrew Zisserman Koray KavukcuogluGoogle DeepMind, London, UK。也是利用spatial transformer network来解决pose、distortion、rotation比较大的这类识别任务,比如ocr、finegrind等。

所以花了些时间先来看了Spatial Transformer Networks.这个工作,还是个相当漂亮的工作。大部分计算机视觉任务都有个绕不开的问题就是形变,拍摄的角度、物体本身的形变都会导致检测、识别变得更加困难。传统的方法一般是定义一些关键点,然后根据关键点和标准物体图像的对应关系来做形变的矫正。那么end2end大法被验证是更优的方案之后,已经有很多传统方法被加入网络结构中成为深度学习中的一层,比如conv/pooling/normalize/embedding之类的。所以作者提出了一个很好的idea,做形变矫正这件事情也可以作为网络的一个层来表示,也就是这样:

原理上,一个feature map上学一个变换参数出来,这个参数作用到feature map上得到一个采样器G,然后用G对输入的feature map做采样,就得到了输出V,也就是V上的每个点由U上的点进行采样得到,具体写成公式是这样的:


其中对于V上的每个feature map上的每个点i,它的值是由一个采样的kernel计算得到的,这个kernel对输入的feature map上的每个点的坐标(n,m)和output坐标所对应的input坐标(xi,yi)做运算,这个运算可以是identity mapping,也可以是affine也可以是projective或者bilinear之类的。xi和yi是输入feature map上的坐标,其计算方式就是根据transform的的kernel来得到的,当kernel是个仿射变换的时候,其公式为:


对于最近邻插值来说,公式3就是:


即把距离(xi,yi)最近的一个坐标值Unm赋给Vi。本质上这是为了解决BP时对于坐标变换如何求导问题的解决方法:即把坐标变换变成对所有input坐标上的值的一个核运算,然后这个核可以求导,这样整个过程就可以BP了,这个地方应该是整个STN理论上可以加入神经网络的重要数学表示变化。paper里推导了bilinear插值时的BP求导:

公式6是output->input的BP,公式7是output->stn层参数的BP,附录里列举了一个3D仿射变换的例子,

这个公式链式法则继续求导,就可以得到output->θ的导数。到此为止,spatial transform这件事情在数学上已经成功的被加入到cnn的结构里面了,整个设计并不是很难理解但是做的还是很优雅。那么接着问题就来了,一个层加进来之后,应该用多少个这样的层呢,这个层和其他层用什么样的连接方式呢?作者也给出了方案:

1. 每个channel可以有自己单独对应的一个stn参数,这样可以用不同的spatial transform来描述feature的空间变换

2. 一个channel可以同时连多个stn,用来处理图片中有多个目标时的情况

这个第2点看上去是个比较糟糕的情况,一个画面中如果有多个目标,每个目标的形变可能都不一样,那么用同样的stn对全图做变化是不太合理的,但是在并不知道图里有多少个目标的情况下,只能设置一个固定的值。

实验细节和结果:

1.MNIST手写数字识别,对比了不同的网络结构和spatial transform的kernel,结果是带TPS的CNN效果最好,因为cnn里面有pooling所以对spatial会更鲁棒一些。

2. street view house numbers

这个实验里每隔几层conv就放一个stn,这样就是在feature上做spatial transform了,做了可视化之后可以发现stn不止做空间变化,还有crop的效果,类似attention,所以在运算上也会有些加速。

3. fine-grind classification

这个实验验证多个stn并行作用在同一个feature map上的效果,从结果上看stn变多了对结果还是有帮助的,这个原因解释为更多的stn可以更好的对不同part做spatial transform并且关注不同的区域特征,这个对我们之前做多patch人脸识别的任务有类似的启发,其实可以用attention的方式自动去学习使用哪些part。

总结一下,这个stn是个挺朴素的把原有机器学习和图像处理的经验知识移入cnn网络结构的想法,思路上非常没毛病,实现的过程也很优雅有种数学的美感。在一些关键问题上也做了对比的实验,这几个试验任务不知道是不是benchmark上比较好的结果,整个工作对于做cv来说还是很有意义和启发作用的。

阅读全文
0 0
原创粉丝点击