这周看了一篇论文,是学校要求的,题目叫做Sketch-a-Net that Beats Humans,由QM的老师发表在BMVC 2015。 这篇论文我看了一下,感觉思路上还是很有趣的,而且解决的问题也比较有价值,但为什么只发在了一个C类会议上,有点诧异。
论文是基于CNN做了一点improvement的。我也是借这个机会稍微了解了一下CNN, 之前看过neutral network,所以看CNN还是没费什么劲的。有关neural network和CNN。这里有几个比较好的连接分享一下
BP神经网络:
http://www.cnblogs.com/xbf9xbf/p/4712785.html
卷积神经网络(CNN):
http://www.cnblogs.com/ronny/p/ann_03.html
http://www.36dsj.com/archives/24006
http://www.aichengxu.com/view/2552005
http://blog.csdn.net/celerychen2009/article/details/8973218
按我自己的理解,传统的BP神经网络之所以没有被用到图像识别上,是因为神经网络之间的连接太多了,而图像由一个个pixcel组成,一个pixel就是一个输入数据,导致需要学习的参数过多,不仅容易造成overfitting的问题,电脑能不能做出efficient 的计算也是一个很大的问题。
CNN之所以牛逼,当然不仅仅是因为使得计算doable,还因为在卷积神经网络的第一层就是特征提取层,也就是不需要我们自己做特征提取的工作,而是直接把原始图像作为输入,这带来了很大的便利,归根结底还是归功于卷积运算的神奇。
结构上,CNN相当于在传统的神经网络(在cnn里貌似被称作是全连接层?)之前加上了几层卷积层和池化层(一般加到五层就能有很不错的效果了)。
所谓卷积,可以看做是共用的一组加权参数,从图片中提取features,用于做卷积的参数矩阵可以被称作卷积核或者filter。
当然往往只用一个卷积核是不够的,这样的特征提取是不充分的,我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。
而池化则是进一步的减少数据量,常用的池化方法是max-pooling, 也就是在卷积以后得到的matrix中,每相邻的四个格子中挑选值最大的那个作为代表。
经过了多层convolution 和 pooling以后得到的数据送入full-connected的神经网络进行学习。
回到sketch-a-Net 这篇论文,这篇文章主要要解决的问题就是识别人手在触感devices上画出的sketches,比如在pad上画一个小飞机之类的。 文章根据sketches与传统拍摄的照片的不同之处,在CNN上做出了一些改进:
这篇文章中用的filter比别人的大,现在比较popular的方法是取small filter,比如3*3的,按我自己的理解,为什么这么取是因为:由于是sketches,并不是所有地方都是有information的,比如你画一个飞机,随手画都很简略,有线条的地方还不一定比空白处多,用大一点的filter能保证在提取feature的时候都是有效的。
这篇文章没有加上Local Response Normalization的一项(虽然我也不知道在传统的CNN里有这一项),文章中说 Local Response Normalization 是用来描述光照变化(brightness)的,而sketch是没有这个特征的,加上这一项不仅没有用,还会增加运算的难度。
这篇文章用的pooling不是传统的max-pooling,也就是2*2的格子以2为步长游走, 而是采用3*3九个格子以2为步长,这样虽然造成一点additional computation,但是效果会提升一点儿。(这个没怎么看懂)
他们还加入了人类在画画时候的ordering带来的information,比如画飞机的时候,是先画一个外壳,再画翅膀,再画窗户。 文章中实现这个想法的方法是: 先把飞机拆成了三个最基础的单元,分别作为三张图片,然后再组合两部分成为第四章图,在组合另外两部分成为第五张图片,最后把整体作为第六张图片,这六张图片作为六个channel输入到CNN的第一层,再进行卷积,池化等操作。
他们还考虑到了不同人画同一个物件的viration, 比如小孩画飞机就比大人要少很多details。他们的做法是对同一张图片用做不同的down sampling,得出不同size的图片(高coarseness 的相当于少details)。认为一副图片是由几幅不同down sampling之后的图片的均值加上方差得到的。
然后通过Joint Beysian method的likelihood ratio test
作为metric来优化 学习得到方差,最后的真实值就由均值和方差采样得到。
整体流程如下: