@coolwyj
2015-10-30T15:22:56.000000Z
字数 2799
阅读 10737
DeepLearning
论文
这篇文章看了好久,有些地方不是很懂,参考了别人写的一些理解才懂了。目测是自己英语太渣了,sad story。不过除了别人所述,也算有一点自己的体会吧。
先上参考的链接:
http://blog.csdn.net/whiteinblue/article/details/43374195
http://zhangliliang.com/2014/07/11/paper-note-overfeat/
简单来说,本文主要介绍了使用DeepLearning来解决classification,localization,detection的pipeline。把detection问题划分为了classification和localization两个子问题来解决。
先简单解释一下三个问题分别是啥。
classification:给定一张图片,以及一个标签指明图片中主要物体的类别,程序猜k次其类别,看是否和标签一致。
localization:与classification类似,区别在于它需要给出你猜的这些类别的物体的框,而且这个框与真实值的差距不能小于50%。
detection:事先不知道这张图片有没有可以分类的物体,有的话他们的数量是多少,需要给出物体的框以及其类别。
下面介绍一下各个方面idea的要点,至于模型啥样的,达到了啥成绩就不废话了。
基于Krizhevsky的论文[笔记],区别在于:
在提取特征的时候Krizhevsky的论文使用了multi-view
的方法,也就是对给定的图片分别取四个角,中间以及翻转的图块输入到CNN中,得到的结果取均值。这个方法的缺陷在于有些区域的组合会被忽略(比如ground truth在中间偏右,但是此方法并没有检测这个框),只关注了一个scale导致结果的置信度不高,而且重叠区域的计算很耗时。
本文对其的改进是使用了multi-scale
。
传统的检测/定位算法是固定输入图像不变,采用不同大小的滑窗来支持不同尺度的物体。对于CNN来说,滑窗的大小就是训练时输入图像的大小,是不可以改变的。那么,CNN支持多尺度的办法就是,固定滑窗的大小,改变输入图像的大小。具体来说,对于一幅给定的待处理的图像,将图像分别resize到对应的尺度上,然后,在每一个尺度上执行上述的密集采样的算法,最后,将所有尺度上的结果结合起来,得到最终的结果。
然而,对于上文所述的密集采样算法来说,采样的间隔(也就是滑窗的 stride
)等于执行所有卷积和pooling操作后图像缩小的倍数,也就是所有卷积层和pooling层的 stride
的乘积。如果这个值较大的话,采样就显得sparse,图像中的某些位置就无法采样得到。这时,或者减小卷积层和pooling层的 stride
,或者干脆去掉某个pooling层,或者采用某种方法替代某个pooling层。
文章采用的方法是使用模型前5层卷积层来提取特征,layer 5在 pooling 之前给定 x,y 一个偏移feature map
,那么下一层的 feature map
总数为9*前一层的 num_output
。
至此,整个分类过程结束。其过程可以简单理解为:给定一张框定的图片,已知这张图片有某种可分类物体,但是由于框给的不是很合适,没有alignment,和训练的时候有差异,所以取不同scale图片进行检测,得到结果。对于CNN,使用不同scale需要放缩图片,由于最后的FC层的输入大小是固定的(比如5x5),所以不同scale输入经过pool5之后的 'feature map' 大小不一,此时取所有可能5x5作为输入得到特征向量。
最后的预测方法如下:对某一个类别,分别对不同scale矩阵取最大值,然后取该类别中不同矩阵最大值的均值,最后输出所有类别的top-1 or top-5。
经过FC层形成的矩阵中,一个像素就相当于原来图像中的一个图块。
示意图:
定位问题的模型也是一个CNN,1-5层作为特征提取层和分类问题完全一样,后面接两个全连接层,组成 regressor network
。训练时,前面5层的参数由 classification network
给定,只需要训练后面的两个全连接层。这个 regressor network
的输出就是一个 bounding box
,也就是说,如果将一幅图像或者一个图像块送到这个 regressor network
中,那么,这个 regressor network
输出一个相对于这个图像或者图像块的区域,这个区域中包含感兴趣的物体。这个 regressor network
的最后一层是class specific的,也就是说,对于每一个class,都需要训练单独最后一层。这样,假设类别数有1000,则这个 regressor network
输出1000个 bounding box
,每一个 bounding box
对应一类。
对于定位问题,测试时,在每一个尺度上同时运行 classification network
和 regressor network
。这样,对于每一个尺度来说, classification network
给出了图像块的类别的概率分布,regressor network
进一步为每一类给出了一个 bounding box
,这样,对于每一个 bounding box
,就有一个置信度与之对应。最后,综合这些信息,给出定位结果。
算法还给出了一个合并多余框的方法:
令Cs为top-k(例如5)标准中每个scale下找到的可能类别。
令Bs为Cs中这些类别的预测框。而B集合是Bs的并集。
找B集合里面两个框的中心距离和相交面积之和最小的一对,如果他们的和大于给定阈值t,则结束,否则从B中删去两个框,合并这一对用他们的均值构成新的一个框,加入B
其实就是上述两个结合一下,( ╯□╰ )