RCNN
问题引入
RCNN提出的问题背景是
在2012年ILSVRC研讨会上,关于ImageNet结果的重要性得到了激烈的讨论,核心问题可以归结为:ImageNet上的CNN分类结果在多大程度上可以推广到PASCAL VOC挑战上的目标检测结果。
RCNN原论文的作者通过缩小图像分类和目标检测之间的差距来回答这个问题。作者关注的两个问题是:
- 用深度网络进行对象的定位
- 用较少的有注释的标注数据训练一个大容量的模型。
作者如何利用深度网络进行对象定位
与图像分类不同,目标检测需要在图像中定位(可能有很多)对象。一种方法将定位定义为一个回归问题。这种策略在实践中可能并不成功。另一种方法是构建一个滑动窗口检测器(CNNs已经以这种方式使用了至少20年,通常用于约束对象种类,例如人脸和行人)。为了保持较高的空间分辨率,这些CNNs通常只有两个卷积层和池化层。RCNN作者考虑采用滑动窗口方法,并且他们的网络中有 5 5 5个卷积层,在输入图像中有非常大的接受域( 195 × 195 195×195 195×195像素)和步长( 32 × 32 32×32 32×32像素),这使得在滑动窗口范例中精确定位成为一个开放的技术挑战。
作者通过在“区域识别”范式内操作来解决CNN的定位问题,该范式在对象检测和语义分割两方面都取得了成功。测试阶段,作者的方法对输入图像生成
2000
2000
2000个左右的独立分类的候选区域,利用CNN从每个建议区域中提取一个固定长度的特征向量,然后用特定分类的线性SVM对每个区域进行分类。并且作者使用了一个简单的技术(仿射图像扭曲)来计算每个建议区域的固定大小的CNN输入,而不管该区域的形状如何。由于该系统将候选区域与CNN相结合,所以该方法被命名为RCNN:具有CNN特征的区域(Region)。
该系统包含了如下的步骤:
- 获取一个输入图像
- 提取 2000 2000 2000个左右自底向上的候选区域
- 使用一个大型卷积神经网络(CNN)计算每个建议区域的特征
- 使用特定类别的线性支持向量机对每个区域进行分类
作者如何解决少量标注数据训练问题
检测面临的第二个挑战是标记数据稀缺,目前可用的数量不足以训练一个大型CNN。解决这个问题的传统方法是使用无监督预训练,然后进行有监督的微调。RCNN的第二个主要贡献是证明了在大辅助数据集(ILSVRC)上进行有监督的预训练,然后在小数据集(PASCAL)上进行特定区域的微调,这种方法是在数据匮乏时学习大容量CNNs的有效范例。
用RCNN进行目标检测
RCNN的目标检测系统由三个模块组成:
- 第一个模块是产生与类别无关的region proposal。这些推荐定义了一个候选检测区域的集合。
- 第二个模块是一个大型卷积神经网络,用于从每个区域抽取特定大小的特征向量。
- 第三个模块是一组指定类别的线性支持向量机。
模块设计
区域推荐
。近来有很多研究都提出了产生类别无关区域推荐的方法。比如: objectness(物体性),selective search(选择性搜索),category-independent object proposals(类别无关物体推荐),constrained parametric min-cuts(受限参最小剪切, CPMC),multi-scal combinatorial grouping(多尺度联合分组),以及Ciresan等人的方法,将CNN用在规律空间块裁剪上以检测有丝分裂细胞,也算是一种特殊的区域推荐类型。由于R-CNN对特定区域算法是不关心的,所以作者采用了选择性搜索以方便和前面的工作进行可控的比较。
特征提取
。作者使用Krizhevsky等人所描述的CNN的一个Caffe实现版本对每个推荐区域抽取一个
4096
4096
4096维度的特征向量把一个输入为
277
×
277
277×277
277×277大小的图片,通过五个卷积层和两个全连接层进行前向传播,最终得到一个
4096
−
D
4096-D
4096−D的特征向量。可以参考AlexNet获得更多的网络架构细节。为了计算region proposal的特征,首先要对图像进行转换,使得它符合CNNs的输入(架构中的CNNs只能接受固定大小:
277
×
277
277×277
277×277)。这个变换有很多办法,作者使用了最简单的一种。无论候选区域是什么尺寸和宽高比,作者都把候选框变形成想要的尺寸。具体来讲,变形之前,先在候选框周围加上
16
16
16的padding填充,再进行各向异性缩放。
测试阶段的目标检测
测试阶段,在测试图像上使用selective search抽取 2000 2000 2000个推荐区域(实验中,作者使用了选择性搜索的快速模式)。然后变形每一个推荐区域,再通CNN前向传播计算出特征。然后使用对每个类别训练出的SVM给整个特征向量中的每个类别单独打分即对每一个框使用每个类别的SVM进行预测打分。然后给出一张图像中所有的打分区域,然后使用NMS(每个类别是独立进行的),拒绝掉一些和高分区域的IOU大于阈值的候选框。
训练
RCNN的训练过程包括了三个阶段。
-
CNN有监督预训练
作者在大型辅助训练集ILSVRC2012分类数据集(没有约束框数据)上预训练了CNN。 -
CNN在窗口内的参数调优
为了让CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口),作者只使用变形后的推荐区域对CNN参数进行SGD训练。作者替换掉了ImageNet专用的1000-way分类层,换成了一个随机初始化的21-way分类层,(其中20是VOC的类别数,1代表背景)而卷积部分都没有改变。对于所有的推荐区域,如果其和真实标注的窗口的IoU ≥ 0.5 ≥0.5 ≥0.5就认为是正例,否则就是负例。SGD初始学习率为 0.001 0.001 0.001(是初始化预训练时的十分之一),这使得调优得以有效进行而不会破坏初始化预训练的成果。每轮SGD迭代,作者统一使用 32 32 32个正例窗口(跨所有类别)和 96 96 96个背景窗口,即每个mini-batch小批量的大小是 128 128 128。另外,作者称其倾向于采样正例窗口,因为和背景相比正例窗口很稀少。 -
目标种类分类器
考虑一种检测汽车的二分类器。很显然,一个图像区域紧紧包裹着一辆汽车应该就是正例。同样的,没有汽车的就是背景区域,也就是负例。较为不明确的是怎样标注哪些只和汽车部分重叠的区域。作者使用IoU重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值作者选择了 0.3 0.3 0.3,是在验证集上基于 { 0 , 0.1 , … 0.5 } \{0, 0.1, … 0.5\} {0,0.1,…0.5}通过网格搜索得到的。作者发现认真选择这个阈值很重要。如果设置为 0.5 0.5 0.5,可以降低 m A P mAP mAP 5 5 5个点,设置为 0 0 0,就会降低 4 4 4个点。正例就是严格标注的窗口。
RCNN预训练意外的两个阶段对于正例和负例的定义有所不同。