一、论文概要
目标检测在过去几年取得了很好的成果,但是表现最好的方法通常是将多个底层特征和高层上下文组合在一起的复杂的集成系统。本文提出了一种简单的可扩展的目标检测算法,相对于之前在 VOC 2012 上的最佳结果, mAP提高了 30% 以上——实现了 53.3% 的 mAP。
本文提出的方法包括两点关键思想:
1.为了定位分割对象,将大容量的CNN自下而上的选择候选区域
2.当标注训练数据不足时,监督预训练作为辅助的任务,再加上特定区域的微调,可以达到一个很好的性能提升
因为本文提出的方法讲CNN和候选区域结合在一起,因此我们命名本文的这种方法为 R-CNN。本文将R-CNN 与 OverFeat(近期提出的基于相似的CNN结构预设滑动窗口的检测器)进行了对比。我们发现在ILSVRC2013检测数据集上R-CNN比OverFeat效果有很大的提升。
R-CNN源码
二、核心思想
【背景】
现在特征变得越来越重要,过去十年各种视觉识别的任务建立在SIFT,HOG的使用上,但是如果看权威视觉识别的任务,比如PASCAL VOC目标检测,会发现2010-2012年基本没有什么进展。
SIFT 和 HOG 是块方向直方图,我们可以粗略地将这种表示与 V1 中的复杂细胞联系起来,V1 是灵长类视觉通路中的第一个皮层区域。但是识别发生时一般会涉及到一些下游阶段,所以在视觉识别里计算特征时一个分层级,多阶段的处理过程或许能够提供更多的信息。
比如neocognitron,就是受生物启发的具有分层和平移不变性的用于模式识别的模型,就是这样的一个尝试,但是它缺乏监督训练。
2012年后,CNN的崛起重新引起了关注,大家关心的问题是主要是,CNN的在图片分类上的表现能够给目标检测领域带来多大的提升。
我们在本文回答了这个问题,将图片识别和目标检测之间建立起一个桥梁。本文首先会展现相比较HOG类似特征的检测系统,CNN可以取得非常高的目标检测表现的提升。为达成这个结果,我们专注于解决两个问题:1.通过一个深层网络定位目标 2.用很小的一部分标注的检测数据训练一个大容量的网络。
不同于图片分类,检测需要目标进行定位。一种方法是将定位看作回归问题。但是Szegedy的工作和我们同期的工作同时表明,这种策略在实践中效果可能并不是很好(他们在VOC 2071中取得了30.5%的mAP,本文的方法取得了58.5%)。另一种方法是建立一个滑动窗口检测器。CNN在特定对象类别上(比如人脸检测,行人检测)在过去20年内就是使用了这种方法。为了保持高空间分辨率,这些CNN网络通常只有两个卷积层和池化层。但是,我们的网络里拥有5个拥有很大感受野(195 * 195)和步长(32*32)的卷积层,这使滑动窗口中的精确定位成为一个开放式的技术挑战。
我们使用利用regions识别来实现CNN中的定位问题。我们为输入图像生成大概2k个区域建议,使用CNN从每个提议的区域中提取固定长度的特征向量,然后使用SVM进行分类。通过仿射图形变化来使每个区域的CNN输入在计算时保持固定。本文提出的方法如下图所示:
另一个存在的问题是标注数据稀缺当前的数量不足以训练一个较大的网络。对于这个问题,我们的解决方案是使用无监督预训练,然后再有监督的微调。本文另一个贡献是证明了在一个大数据集(ILSVRC)上的有监督预训练后,在小数据集上进行特定领域的微调,在数据稀少时训练大容量网络是一个有效的方法。在我们实验里,微调提高了8个点的mAP。由于我们唯一特定于类的计算是一个相当小的矩阵向量乘积和贪婪的非极大值抑制,所以我们的方法也是很高效的。
【R-CNN结构】
R-CNN包含三个模块,第一个模块用来生成不依赖分类信息的候选区域。第二个模块是一个很大的卷积网络,用以从每个候选区域提取固定长度的特征。第三个模块是一组特定分类的线性SVM。
候选区域生成
近期提供生成类别无关的候选区域的方法有:objectness, selective search, CPMC等,R-CNN选的是selective search方法来生成候选区域。
特征提取
每一个候选区域我们提取4096维的特征向量。通过对减去均值的227 * 227 输入进行五次卷积两次全连接得到4086的特征。对一个候选区域提取特征前,我们需要先将它处理成277*277的统一格式。我们用最简单的方法,直接变形。在变形之前,会扩大边界框把候选区域周边的一些像素( 数量为p)也包含进去,来表达上下文。本文使用p = 16。变形后的候选区域如下图所示:
测试阶段的检测
测试时,我们先在测试图片上通过selective search预选出2k个候选区域,然后变形每个候选区域并通过CNN得到4096维的特征表达。然后,对每个类别,我们都用当前的候选框的特征通过SVM得到一个得分。拿到所有候选区域所有类别的得分后,通过贪心非极大值抑制去掉一些与最高分的区域IoU高于某个阈值的区域。
在CNN阶段,不同的分类都是参数共享的,提取的特征也降到了较低的维度(4096),唯一和类别相关的就是SVM和非极大值抑制。实际上,所有的点乘操作都集中在一个大矩阵里进行,比如拿到图片的候选区域的特征形状是20004096,SVM权重矩阵是4096N。即使有 100k 个类,在现代多核 CPU 上生成的矩阵乘法也只需 10 秒。
训练过程
我们先使用大型辅助数据集对CNN网络进行预训练,在这一步我们仅有图像级的标注信息,没有边界框的标注。为了将CNN适配我们检测任务以及适应变形候选区域图片,我们继续使用变形的候选框通过SGD对CNN的参数进行训练。除了将CNN最后1000类输出改成(N+1)类,其他结构不变。对于所有提出的候选框,与标注框IoU大于0.5的我们认为是正样本,其他则是负样本。初始学习率设置为0.001,是预训练初始率的1/10,来进行微调。每一次迭代中,batch-size为128,其中32个正样本,96个背景样本。我们将采样偏向于正窗口,因为与背景相比,它们非常罕见。特征被提取后,我们需要优化每个类别的线性SVM。因为训练数据过大,我们采取了难负样本挖掘,帮助快速收敛。在实际中,遍历完一次全部图片后,mAP就停止增加了。
训练结果
可视化特征
本文将一个网络中的神经单元挑出来把它当作一个特征检测器,以此来可视化特征。即在大量(千万级别)的候选框中计算这个单元的激活函数,然后根据结果从上到下排序候选框,执行非极大值抑制,然后展示得分最高的一些候选框。这种方法即“让神经单元为自己说话”。我们从pool5层中卷积层中选择神经单元,它是网络第5层的最大池化输出,也是网络的最后一层。这一层特征的形状为66256 = 9216维。每一个单元在227227的原图上相当于有195195的感受野。以下是我们在VOC2007上微调的网络里pool5的神经单元前16个得分最高的激活结果。
可以看到,每个激活单元负责检测了自己的检测任务,有负责检测房子的,有负责检测人脸的。可以看出来网络学到的表达是通过组合一组经过类别调整的特征将形状、纹理、颜色、材料等分布表示组合在一起,接下来的全连接层fc6得以将这些丰富的特征大量组合成模型。
消融实验
接下来作者进行了一些消融实验,实验发现在未经微调的网络的最后三层中,pool5的重要性大于后两层。在微调的网络中,fc6 和 fc7 的微调提升比 pool5 大得多,这表明pool5从 ImageNet 学习到的特征是通用的,微调带来的8%的mAP提升主要来源于特定领域的非线性分类器。在网络结构上,不同的选择对R-CNN的表现也有显著的影响。当换成13层卷积+5层最大池化+3层全连接层的网络时,mAP提高到66%,但是时间也慢了7倍。如下图所示,新网络用O-Net表示区分于原设计网络(T-Net)。
误差分析
对FP结果进行分析,FP被分到4个分类里:Loc:定位不佳(IoU 与正确类别在 0.1 到 0.5 之间重叠的检测,或重复)Sim:与相似类别的混淆; Oth:与不同的对象类别混淆; BG:检测到了背景。发现大部分是Loc问题导致的。松散的定位可能源于我们自下而上的提出候选区域造成的。
每个图显示了六种不同对象特征(遮挡、截断、边界框区域、纵横比、视点、部分可见性)内最高和最低性能子集的均值(超过类)归一化 AP。FT代表经过微调,BB代表加上了边界框数据进行回归。从图里可得,微调没有减少最高性能和最低性能的差值,但是提高了整体均值,说明微调提高了所有特征的鲁棒性,包括遮挡、截断、视点和零件可见性。
边界框回归
基于误差分析,受DPM中的边界框回归启发,我们实践了一种减少定位误差的简单的方法。我们训练了一个线性回归模型来处理pool5的特征以预测一个新的检测窗口。
【 ILSVRC2013检测数据】
数据
我们将ILSVRC2013分为:395,918张训练图片,20,121张验证图片,40,152张测试图片。验证集和测试集都背完财政的标注了,每一张都有分类标签和边界框。训练数据没有被完整的标注,所以无法用来做难负例挖掘。所以我们把验证集分为两部分(val1, val2)来使用,我们生成大量的候选分割,然后选择各分类最平衡的分割方法。
候选区域
我们使用selective search来生成候选区域,但是selective search不具备缩放不变性,所以候选框的数量多少由图片的像素决定。ILSVRC的图像尺寸范围很大,所以我们在selective search之前统一将图片处理为500像素宽。验证时,平均每张图产生2043个候选框,IoU阈值为0.5,此时检测框的召回率为01.6%,与PASCAL的98%相比,在候选区域生成上还存在很大的改善空间。
训练数据
我们从验证数据两部分中的val1中选取一组图片和检测框,确保每个分类都有N个检测框(如果一个分类所有的检测框少于N个,就有多少用多少)。我们叫这组数据为val1+trainN。在后面的消融实验中,我们将展示N在{0,500,1000}的范围内对mAP的影响。这些训练数据将在三个流程中被使用到:1.CNN的微调部分 2.SVM检测的训练 3.检测框回归训练。CNN微调的过程将在这部分数据集上跑50k次迭代。SVM训练中,所有gt框都会当作各自分类的正样本,难负样本将从val1中堆积选取5k张中决定。早期的实验证明从5k张中选相对于从全部val1中选,只会使mAP降低0.5个点,但是时间却节省一半。检测框回归训练将直接使用val1训练。
控制变量对比实验
实验控制了训练数据的数量、微调、检测框回归等因素探寻其重要性。
可以看到,在val1+train1k被增加进训练数据微调,并训练SVM检测器,并且用val1训练检测框回归后,在val2数据上的mAP达到了31.0
【附录】
候选目标变形
CNN网络部分的输入要求是227 * 227的输入,这边我们有两种方式变形候选目标。
设A为候选目标,
B.把候选目标套进原图最紧密的正方形里,将该正方形缩放成227227
C.长边自适应不包括周围像素
D.直接缩放图片到227227
每一个候选目标在变形时我们都会加上候选框外的一些像素作为图片的上下文,候选框边框上下文的大小我们定义为p,上图中第一行p=0,第二行p=16。所有方法中,如果候选框超出了图片范围,缺失的数据将用图像的mean值补全,(在送入CNN前所有像素减去平均值的操作时会被减去),实验证明取上下文p =16的处理能够提高3-5个点的mAP。还有很多处理可以选择,比如用复制而不是取平均值填充,不过这部分尝试将留给以后的工作。
正负样本及softmax
在本文提出的方法中,有两个设计可以拿来讨论:
为什么在微调CNN阶段和训练SVM分类器阶段正负样本的定义不同?
我们在微调CNN阶段定义的正样本为:每个候选框与gt的框最大的IoU大于0.5则定义为正样本,否则为负样本。
在训练SVM检测器阶段,我们只把gt的框作为对应类别的正样本,与一个类所有gt框IoU都小于0.3的候选框认为是负样本。其他的候选框不会使用。
我们之所以这样定义是因为开始时我们用来训练SVM的特征是由预训练的CNN生成的,在那个时候微调并不是需要考虑的一个因素。在这一步上,我们发现这样的定义在训练SVM上效果是最佳的。开始微调时,我们一开始使用的是SVM对正负样本的定义,但是我们发现这样的效果比后来的定义要差很多。
我们认为对正负样本定义的差别并不是根本上最重要的,之所以有这样的问题,是因为微调数据受限。另一个问题是:为什么在微调之后还要训练SVM?
直接用微调后网络的最后一层作为21类的softmax分类器会简单很多,我们尝试了这种方案,发现在VOC2007上的表现从54.2%掉到了50.9%。这可能是由一系列因素导致的,其中包括:微调阶段定义的正样本不能很好的强调精确定位;softmax分类起随机的在一部分负样本上训练而不是SVM中使用的难负样本。
(看到这里我有个疑问,SVM不是把IoU小于0.3作为负样本吗,这种怎么能叫难负样本,这种不是很好分的负样本吗。。)
我们推测,在微调后无需SVM也可保持同样的表现是有可能的,可能需要通过一些对微调的额外调整能够实现,如果是这样,我们可以简化并加速R-CNN训练。
检测框回归
在每个候选框通过SVM检测器打分后,我们使用当前分类对应的边检框回归器为检测预测一个新的检测框。
回归器的输入是N个训练对{(Pi, Gi)}i=1,....,N
Pi = (Pxi, Pyi, Pwi, Phi) 其中x,y是候选框中心的坐标。同理,G = (Gx, Gy, Gw, Gh),我们需要学习到一种变化让P接近gt box G.
我们用4个参数描述这种变换: dx(P), dy(P), dw(P), dh(P),前两个参数用来表达平移变换,后两个参数用来表达尺度变换。
我们将pool5的特征记做phi_5(P), x,y,w,h对应的权重乘以这个特征就得到了变换的变量:d*(P),
因此可以利用最小二乘法或梯度下降进行求解:
其中:
我们通过将 IoU大于阈值的候选框P 分配给最大 IoU 的真实框 G。所有未分配的提案都将被丢弃。我们对每个目标的分类都这样做一次,以学习一组特定于类的边界框回归器。
三、总结
近年来表现较好的目标检测通常是将多个低维图片特征和高级别的上下问组合起来的复杂系统,本文提出了一个简单的尺寸可变的目标检测方法,并在PASCAL VOC2012上取得了比以往最好表现提升30%的表现。
我们通过两点取得这个效果:1.使用高容量的卷积神经网络来自下而上的提出候选区域来定位和分割目标。2.当标注数据稀缺时对训练大型CNN的处理:先使用大量数据对网络进行预处理,然后用稀缺数据进行微调,实验证明这是很有效的方式。