R-CNN
全名:
Rich feature hierarchies for accurate object detection and semantic segmentation
Tech report (v5)
代码地址:
http://www.cs.berkeley.edu/~rbg/rcnn.
Abstract
我们的方法结合了两个关键的见解:
(1)可以将大容量卷积神经网络(CNNs)应用到自底向上的区域建议中,对目标进行定位和分割
(2)当标记的训练数据稀缺时,对辅助任务进行监督预训练,其次是特定于域的微调,可以显著提高性能。
由于我们将区域建议与CNNs相结合,我们将我们的方法称为R-CNN:具有CNN特征的区域。
2、Object detection with R-CNN
我们的目标检测系统由三个模块组成:
- 第一个生成分类独立的区域建议。这些建议定义了我们的探测器可用的候选检测集。
- 第二个模块是一个大型的卷积神经网络,它从每个区域提取一个固定长度的特征向量。
- 第三个模块是一组特定类别的线性支持向量机。
在本节中,我们将介绍每个模块的设计决策,描述它们的测试时间使用情况,详细说明如何学习它们的参数,并在PASCAL VOC 2010-12和ILSVRC2013上显示检测结果。
2.1、Module design
- Region proposals
使用selective search。
- Feature extraction
我们使用Krizhevsky等人描述的CNN中的Caffe实现从每个区域提案中提取4096维的特征向量。
通过5个卷积层和2个全连接层的前向传播,平均减去227×227的RGB图像,计算特征。
为了计算区域建议的特征,我们必须首先将该区域的图像数据转换成与CNN兼容的形式(其架构需要固定的227×227像素大小的输入)。
在任意形状区域的许多可能的转换中,我们选择最简单的。不管候选区域的大小或长宽比如何,我们都会将它周围的所有像素弯曲成所需的大小。在进行翘曲之前,我们扩展了紧边界框,这样在翘曲大小处,原始框周围正好有p个翘曲图像上下文像素(我们使用p = 16)。
2.2、Test-time detection
在测试时,我们对测试图像进行selective search,以提取出大约2000个区域建议(我们在所有实验中都使用了selective search的“快速模式”)。
为了计算特征,我们对每个提议进行变形,并通过CNN进行传播。
然后,对于每个类,我们使用针对该类训练的SVM对每个提取的特征向量进行评分。
给定图像中所有得分区域,我们应用一个NMS(对每个类独立地),如果一个区域有一个IoU与一个高于学习阈值的得分较高的选定区域重叠,则该区域被舍弃。
- Run-time analysis
两个特性使检测变得高效:
- 所有CNN参数在所有类别中共享。
- CNN计算的特征向量是低维的。
共享可以使计算region proposals和features所花费的时间被分摊到所有类上。唯一的类特定计算是特征和支持向量机权重之间的点积和非最大值抑制。
实际上,一幅图像的所有点积都被批处理成单个矩阵-矩阵乘积。特征矩阵通常为2000×4096,支持向量机权重矩阵为4096×N,其中N为类数。
R-CNN效率高不仅仅是使用了区域建议和共享特征,还是因为低维的特性。
2.3、Training
- Supervised pre-training
我们在一个大的辅助数据集(ILSVRC2012分类)上对CNN进行了有区别的预训练,仅使用图像级注释(此数据不提供boundingbox标签)。使用开源的Caffe CNN库进行预训练。
- Domain-specific fine-tuning
为了使我们的CNN适应新的任务(检测)和新的领域(扭曲的建议窗口),我们继续使用扭曲的区域建议对CNN参数进行随机梯度下降(SGD)训练。
除了将CNN的ImageNet-specific1000路分类层替换为随机初始化的(N+1)路分类层(其中N是对象类的数量,再加上1作为背景)之外,CNN的体系结构保持不变。
对于VOC,N = 20,对于ILSVRC2013,N = 200。
我们将所有与ground-truth盒子重叠且IoU≥0.5的区域提案视为该盒子类别的正面,其余部分视为负面。
我们以0.001的学习速率(初始预训练速率的1/10)开始SGD,这允许微调在不破坏初始化的情况下取得进展。在每个SGD迭代中,我们统一采样32个正窗口(在所有类上)和96个背景窗口,以构建大小为128的微型批处理。我们将采样偏向正窗口,因为与背景相比,它们极为罕见。
- Object category classifiers
我们使用IoU重叠阈值解决与目标重叠的部分,在该阈值以下将区域定义为负例。重叠阈值0.3是通过在验证机上{0,0.1,...,0.5}进行网格搜索来选择的。
提取特征并应用训练标签后,我们将为每个类优化一个线性SVM。由于训练数据太大而无法存储在内存中,因此我们采用标准的硬负挖掘方法。硬负挖掘收敛快,实际上,仅对所有图像进行一次遍历之后,mAP就会停止增加。