前言: 主要总结一下自己最近看文章和代码的心得。
1. CNN用于分类:具体的过程大家都知道,无非是卷积,下采样,激活函数,全连接等。CNN用于分类要求它的输入图片的大小是固定的(其实不单单是CNN,很多其它的方法也是这样的),这是它的一个不足之处之一。目前的大部分CNN都是用来做分类比较多。
2. CNN用于检测:主要的方法有两种,细分一下有三种,
第一种最为简单和暴力的,通过滑动窗口的方法,提取一个固定大小的图像patch输入到CNN网络中,得到该patch的一个类别,这样得到一个图片密集的类别得分图。显然,这种方法的一个弊端就是运算量太大,如果图片的分辨率比较的大,就根本无法进行下去,更何况,这还是在没有考虑图片多尺度检测的情况。
第二种方法,在第一种方法的基础之上,采用了动态规划的思想,避免了重复计算问题。对于CNN来说,直到第一个全连接层之前,它的输入图片大小是可以不固定的,但是有了全连接层之后,就要求输入大小保持一致,第二种方法是先把任意大小的图片进行输入CNN直到第一个全连接层,然后再在它的基础上进行固定大小的滑动窗口输入到全连接层中,由于第一个全连接层之前进行了大量的下采样操作,所以这时候的滑动窗口的数目就大大的减少了,而且前面的卷积操作就要计算一次,没有重复计算的问题。CNN里面有一个trick就是把训练好了的用于分类的网络,把它的全连接层参数转化为卷积层参数。这样改造后的CNN就成了全卷积CNN,它的输入是可以任意的,而它的输出是patch
的类别得分。这个在Caffe里面有一个例子说明怎么转换。网址在这里:http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb
第三种方法,跟前两种不同的是,它不是采用滑动窗口的方法,而是采用提取子窗口的方法,这种方法最典型的是今年的CVPR2014的R-CNN方法,它先采用一个方法来进行生成1000-2000左右的窗口区域(类似于目标显著性检测,但又不同,英文的说法叫Objectness,不好翻译),然后再把这些窗口归一化到相同的大小放到CNN里面去做分类。(当然RCNN的方法只是用训练好了的CNN进行提特征,它还需要进行对每一个类别进行训练SVM分类器)。显然这种方法的优点的是比前两种快,因为分类的窗口少,但是它也有不足就是,它要保证要检测的目标在这些1000-2000个提取的窗口中的概率要足够的高,也就是要有比较高的召回率。再者,它要保证这1000-2000个窗口的提取要足够的快,(在R-CNN中,由于它采用的方法生成窗口很慢,所以实际上整个检测是比较慢的。)
以上就是我总结的最近学习的一点内容,错误之处还请指出。