RCNN

最近想系统学习如何使用深度学习来进行物体检测,因此重新阅读了以前看的一些文章,在这里进行一些记录,不多说了,开始吧。

RCNN的基本思想,将物体检测问题当作一个分类问题来进行解决,这是因为具体的边框是提前生成的,模型要做的就是判断这个边框中图像属于那个类别(也可能是背景)。

RCNN主要是由3个模块构成:

第一个是region proposals,也就是从原始图像中生成2k(论文中)候选框,因此最后产生的物体检测结果一定是在这2k个候选框之一或者是对这些候选框进行操作之后的结果(这里的操作在文章中指的是greedy non-maximum suppression)。暂时不考虑后面模块的操作,如果第一个模块挑选的候选框质量不高,那么最终的结果一定也不会很好。

这里其实可以好好思考一下,如果这里不使用这种方式产生2k个候选框,那么就需要在整张图像上进行穷举,如果想达到令人满意的精度,那么产生图像的数量是巨大的(自己脑补一下按照不同的尺寸大小在整张图像上进行$\Delta$滑动的场面),因此这种方式其实就是一种局部最优解,当然如果这2k个候选框选择恰当,后面的模块也很给力,那么就有可能是最优解了。

第二个是一个预训练的CNN网络模型(当时是13年,最好的网络模型就是VGG了),目的为了提取特征(按照深度学习的说法,其实在我看来就是进行了一个复杂的空间映射,只是这个空间是很不直观的).

第三个是class-specific linear SVMs.这是因为前面的网络模型已经进行了高度的非线性映射,因此这里使用简单的线性分类器就可以。不要问我为什么使用svm而不其他的分类器,我不知道,想知道给作者写邮件去。

END ^_^

怎么样,简单吧。要是真这么简单,那么人人都成了rbg。在深度学习里面,没做实验前有些好的想法,很正常,关键是做实验后效果好才行,这里面的细节部分好好看吧。

Region proposals:

虽然有很多方法,作者这里选择了selective search,原因如下:While R-CNN is agnostic to the particular region proposal method, we use selective search to enable a controlled comparison with prior detection work.

可是我觉得,作者可能下面进行了其他方法实验,可能这个方法最好或者和其他方法和这个比较起来性能差别不大,才这样说的吧,如果选择不同的Region proposal方法对结果影响很大,那为什么不选择那个性能结果最好的呢。

Feature extraction:

这里使用的AlexNet,也叫做caffenet。由于经过第一个模块SS出来的图像大小不一致,因此第一步就是要让SS出来的图像适配网络模型的输入,应该怎么办呢?

本文研究了两种方法。(1)在原始图像中扩展SS出来的矩形框为一正方形(任意尺寸大小),然后scale到网络输入大小。另外的一种扩展方法是直接进行填充成为正方形(应该怎么填充呢,自己看论文,看你能看到不能,反正我是不会告诉你的),然后在进行scale。前者称为tightest square with context,后者称为tightest square without context。(2)就是直接将图像wrap到网络输入大小的规模,这种是最简单粗暴的。

为了性能上的考量,作者这里进行了一些优化上面的探索。

具体来讲就是在SS选出来的图像周围进行扩展p个像素(在能够扩展p个像素的情况下),对于超出了原始图像的部分,就使用图像的均值来进行填充。作者进行了实验,使用p=16进行填充的情况下比不适用填充要高3-5个mAP(简直太恐怖了,还好是mAP不太高的情况下)。

论文中实现的方式使用的是第二种,也就是wrap的方式。

是不是觉得眼睛好蒙啊,这都写的是什么啊!我当时看的时候可是前前后后看了4遍,这次看也显得力不从心。另外不要觉得很麻烦,这个在SS的时候就可以直接给搞出来,也就是几个循环结构而已,不会是真的SS以后扣出原图在进行这些细节,现在想想,也没有那么麻烦。

好了,到目前为止网络输入的问题已经解决了,接下来就是将这每幅图片的2k个候选框给输送到网络,得到2k*4096维的特征就行了。

SVM classifier:

这部分没什么好说的,研究有20多年了,还是最简单的线性分类器。


 以上这些都是这个模型框架的细节部分,下面将从整体上来介绍模型中数据的流转。

训练阶段:

首先为了得到能够提取特征的模型,作者首先利用imagenet上面有标签的图像数据训练了一个和anlenet一样的模型结构。这里要说明一下,由于目标检测训练集上面的图像是有GroundTruth和class信息,因此,对于每个SS出来的图像都可以得到对应的类别信息,这涉及到IoU。如果图像本身是C类,由于SS出来的图像可能是背景,因此整个数据集上有C+1类。

接下来为了让模型更加的匹配对应的数据集,作者使用wrap的数据进行了fine tune,规定>0.5 * IoU的为对应box类别的positives sample(这里说box,而不是image是因为一个image可能有多个不同的box类别),其他的为negative sample。这里经过fine tune后的网络模型将作为最后测试集上的最终网络模型。一定要注意,这里是规定>0.5 * IoU为正样本。因为下面在训练SVM的时候有不同的评判标准。

最后就是分类器的设计了。文章中训练了C个而分类器,用来判别属于那个类别。为了解决这个问题,作者使用IoU overlap threshold的方式,低于这个值全部定义为负样本。作者使用网格搜索的方式来寻找较好的阈值。发现这个值挺重要的,如果设置为0.5将比设置为0.3下降大概5个mAP。这里之所以采用的标准和上面的标准不一致,是因为,上面的分类只能进行分类的微调,而下面的SVM以后还要进行其他的操作,比如说non maximum suppression,这样的话就要考虑到这个框中包含物体所占的比例了。上面不也说了,如果同样使用>0.5的IoU会下降大概5个mAP。需要注意的是,训练SVM的数据使用的是最后的4096为的向量以及对应的类别标签信息(类别信息的获取根据上面描述的原则),每一类都进行训练,因此最后会得到C个分类器。

当然这里为什么会有这样的调整,作者也没有讲明白,仅仅将这个原因归于数据集,只是说如果这样做的话,会带来效果的提升,并没有解释清楚,当然,在深度学习里面,有很多东西是讲不清楚的。

这样整个网络的训练就结束了,网络模型参数训练好了,每个SVM模型的超参数也训练好了,接下来就可以进行测试了。

测试阶段:

首先生成2k个候选框,

然后每个输入到网络里面,会得到对应的类别信息,以及对应的4096维向量(毕竟训练的网络是一个分类的网络模型)。

然后将这个向量输入到对应类别的SVM中,得到是否是对应物体的一个得分。

上面说的是对于一个候选框,对于一个图片的多个候选框,对得到不同类别物体的多个得分,对于每个类别的物体使用non maximum suppression,判断最后的得分接受或者拒绝(使用给定的阈值判断)作为最后的结果。

讲到这里应该已经差不多理解了吧,有些事情真的是需要点时间才能真正琢磨透,对了,要是找到了这个网络模型python的源码,记得给我分享一下,找了半天都没找到。

详细的实验结果分析,就不陈述了,毕竟现在看来并不是很好的结果,自己慢慢参悟吧。

最后说一下,相比较Fast RCNN和Faster RCNN,我最喜欢的就是RCNN,原因就是思路很明确,只要每个模块都达到最优,那么整个目标检测系统就会达到最优,因此就可以分开来进行调整。相比较而言,Fast RCNN和Faster RCNN中多了很多晦涩的概念,至少现阶段还没有彻底理解,可能水平也就这样了。当然也承认RCNN中也有自己的缺陷。就这样吧。

posted @ 2017-08-21 15:23  niudong  阅读(223)  评论(0编辑  收藏  举报