深度学习目标检测之R-CNN

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31531635/article/details/79414123

为什么提出

R-CNN文章名字为”Rich feature hierarchies for accurate object detection and semantic segmentation”,即精准目标检测和语义分割的丰富功能层次结构,可以看出R-CNN即利用CNN网络结构用来进行目标检测和语义分割任务的。

提出的背景

目前目标检测权威用的是PASCAL VOC数据集来检验一个目标检测算法的好坏,当时最好的效果来自于结合多种低层特征为一个高级特征的这么一种集成系统的方法。而本文提出的方法在mAP(mean average precision)上相对于之前最好的算法提升了超过百分之30,实现mAP为53.5%。

基本思想及其过程

R-CNN结合了两个关键点:
(1)将卷积神经网络CNN运用到自下而上的region proposals上来定位和分割目标。
(2)当标签训练样本不足时,可以在相关监督学习任务上进行精调,能产生显著的性能提升。
为了达到目标检测的效果,需要解决主要的两个问题即利用深度网络来定位目标并且只用少量标注的检测数据来训练一个高效的模型。
利用CNN来进行目标检测的方法最初是利用滑窗的方法,但是这种方法太受限,常用于人脸和行人的检测,为了有高的分辨率,同时比较实时,只能选择两层卷积层和池化层,这样达到非常精确的定位也非常难。
为了解决这个问题,本文利用“recognition using regions”,在测试的时候,在输入图像上利用CNN找到了大约2000个种类独立的region proposals,然后对每个都利用线性SVM进行分类。

这里写图片描述

(1)得到输入图片
(2)提取大约2000个自下而上的region proposals
(3)利用CNN计算每个proposal的特征
(4)对每个proposal使用线性svm进行分类。
检测领域第二个挑战就是标注数据不足的问题,因此不足训练一个大的CNN,传统的做法就是先进行无监督的预训练,在进行有监督的精调。而本文则是在一个大的辅助训练集(ILSVRC)上进行有监督的预训练,然后在一个小的数据集(PASCAL)上进行特定领域的精调。特定类的计算相当于一个小的矩阵向量乘上一个贪婪的非极大值抑制。这种特定类的计算的属性是在所有类别共享的特征之后,数量也比先前使用的区域特征要少两个数量级。

利用R-CNN进行目标检测

此目标检测系统由三个模块组成,第一个产生类别独立的region proposals,这些proposals定义了可能的候选检测子。第二个模块是一个从每个区域用来提取固定长度特征向量大型卷积神经网络。第三个模块是用来分类的线性SVM。

模块设计

Region proposals,使用selective search选择性搜索。
Feature extraction,对每个region proposals都利用caffe实现的alexnet提取了4096维的特征向量。输入为227x227的RGB图像,利用了5层卷积层和2层全连接层。由于网络要求输入都为227x277,但是截取到的region proposals形状各异,因此需要用一个窄边框将其变形到所需的227x277的要求的尺寸大小。在变形之前,先将窄边框扩大范围以便于在变形尺寸后一定包含图片内容(前景类别,原始边框)至少p(p=16)个像素。

这里写图片描述

时间测试检测

测试时,对测试图片利用selective search提取大约2000个region proposals,然后将其变形放入CNN中提取特征,然后,对每一类,对每个提取到的特征向量利用SVM来进行打分分类。对于一张图的所有打分区域,运用贪心的非极大值抑制的方法来拒绝某些与高得分区域有重叠交叉(IoU,intersection-over-union)的区域。
运行时间分析,有两个属性使检测有效。第一,所有CNN的参数被所有类别共享。第二,由CNN计算的特征向量对比于其他方式都是低维特征,比如运用词包的空间金字塔。
这种共享的结果就是计算region proposals和特征的时间被分摊到所有类别(在GPU中大约13s一张图片,CPU上53秒一张图片)。特定类的计算在特征和SVM权重的点乘和非极大值抑制之间。
事实上,对于一幅图片的所有的点乘被批处理为单个矩阵和矩阵的乘积。特征矩阵的大小为2000x4096,而SVM的权重矩阵为4096xN,N为类别的个数。
上述分析展示了R-CNN能够扩大到成千上万的目标类别而不用诉诸于相似的理论上,比如哈希。即使有100万个类别,结果矩阵的乘法在现代多核CPU上运行也只要10秒钟。这种效率不仅仅是使用region proposals和共享特征的结果。

训练

有监督的预训练,利用了alexnet的CNN网络模型结构,只对ILSVRC2012数据集进行了图片的标注而没有进行边框的划分标注。
特定领域的精调,为了采用上述的CNN网络到检测任务上以及新的变形的proposal windows上,继续利用SGD随机梯度下降的优化方法只使用变形region proposals来训练CNN参数。除了用一个随机初始化的(N+1)类分类层(N表示目标类别,1表示背景)来代替CNN的ImageNet的特定1000类分类层,CNN的网络结构不变,对于VOC数据集,N=20,对于ILSVRC3,N=200,对于region proposals 与ground_truth 的框重叠IoU大于0.5的为正样本,剩下的为负样本。开始SGD的学习率0.001,能在不破坏初始化的情况下通过精调来取得进展。在每次SGD迭代中,在所有类别中均匀的采样32个正样本,以及96个背景窗口来构建一个128小的batch。由于相对于背景图片,正样本非常稀少,因此更加偏向于在正样本中进行采样。
目标类别分类器,考虑训练一个二进制分类起来检测车辆,很显然,紧紧包围车的那个框一定是正样本,同样的,一个不含车的背景图片就是负样本了。但是迷糊的地方是如何标记只含部分车辆的区域框,本论文利用IoU即将重叠交叉的区域面积设定为阈值,低于这个阈值的都设定为负样本,这个阈值的选择非常关键,如果设定阈值委0.5,mAP的值降低5%,设定为0则减少4%,则正样本将被简单定义为每类的ground-truth。
一旦特征被提取并且训练标签被运用,然后运用线性SVM来分类。由于训练数据在内存中太大了,采用标准的硬性负采矿法,硬性负采矿法收敛更快并且在实际中在所有图像中只经过一次扫描后,mAP就停止增加。

可视化,消融和错误模型

可视化学习到的特征
第一层滤波器可以直接被可视化并且很容易理解。其包含了有方向性的边缘和颜色成分。理解随后的层就有挑战性了。ZFNet提出了一个视觉上的可视化解卷积的方法,而本文提出了一个非参数的方法来直接展示网络怎么被学习的。
思想就是单独出来一个网络中的特定的单元(特征),然后在其右边像一个目标检测子一样来使用。
在一个大约1千万的支持的region proposals中计算这个单元的激活函数。从最高到最低的激活来进行分类,表现为非极大值抑制,然后展示出得分最高的区域,并且避免利用平均值为了看到不同视觉模式的不同处以及获得被计算的单元的内部不变性。
没有精调的层之间的表现
为了理解哪一层对于检测性能才是至关重要的,利用VOC2007数据集对CNN的最后三层进行了研究。到第五层卷积层,网络展现出学出了一种结合一个少量类别调整的特征和一种分布式的形状,纹理,颜色和材质属性的表达。随后的第六层的全连接层则是将一系列这些富特征结合起来,属于一个中间过渡层。第七层全连接层是网络的最后一层。
没有精调的CNN只由ILSVRC2012数据集上进行预训练,其检测平均准确率比较如下。

这里写图片描述

没有精调的后三层的检测平均准确率如上图第一至三行,发现第七层的泛化能力不如第六层,意味着29%或者说大约1680万的CNN参数可以被移除而不会影响性能,而更令人惊讶的是即使同时移除了第六层和第七层,只有第五层也能有很好的结果,但是仅仅用了占CNN参数的6%,说明CNN的表达能力基本上来源于它的卷积层而不是更加稠密的全连接层,这个发现表明仅仅利用卷积层来进行特征提取的潜在用法,类似于仅利用HOG来提取特征,而第四至六行为在ILSVRC2012数据集上预训练然后在VOC2007训练集上进行精调的结果,第七行包含了一个简单的边框回归来减少定位错误。第八至十行为DPM方法,第八行为只用了HOG,剩下两个使用了不同的特征学习方法来增量或者代替HOG。

精调后的层之间的表现

看到在VOC2007训练集上进行精调之后的结果后,这个提升是非常可观的,说明大多数的改进来源于学习特定领域的非线性分类器。

网络结构

这里写图片描述

上图为在不同CNN网络下的在VOC测试数据集下的检测平均准确率,前面两个为8层的AlexNet网络下的结果,后面两个为16层的VGGNet网络下的结果。两个网络的训练方式以及学习率等参数都不变,只有网络结构的变换,因为VGGNet网络比较大,为了适应GPU的显存大小,因而VGGNet精调的时候batch_size设置更小了为24。虽然从上图看VGGNet使得mAP从58.5%提升到了66%,但是测试时间却为原来的7倍!

检测错误分析

这里写图片描述

上图为其误报率(假正例,预测为真,实际为假)的分布图,每个假正例被分类成四种类型:
(1)Loc:定位错误(一种与正确类重叠交叉面积在0.1到0.5之间的检测方式或者)
(2)Sim:与相似类别混淆
(3)Oth:不同类别之间的混淆
(4)BG:对于背景上的假正例

这里写图片描述

上图为对目标特性的敏感程度,展示了六个不同目标特性(occ:occlusion,闭塞;trn:truncation,缩短;size:bounding-box area,边框面积;asp:aspect ratio,长宽比;view:viewpoint,观看位置;part:part visibility,部分可见度)上图中的FT表示fine-tuning精调。总体来看,精调没有减少敏感度,但是对于几乎所有的特性都大体上提升了最高和最差的表现,并且精调在长宽比和边框面积上还是有一定的提升,推测可能是因为对网络输入进行了变形的缘故。相反,精调对于所有的特性包括闭塞,缩短,观察位置和部分可见度上都提升了鲁棒性。

区域提取子

在每个验证集1,验证集2以及测试集中使用选择性搜索的“fast mode”,一个小的修改是处理选择性搜索时不是尺度不变,所以产生的区域的数量决定于图片分辨率的大小。在验证集中,选择性搜索造成每张图平均有2403个区域提取子,在IoU阈值0.5下,伴随有91.6%的所有ground-truth边框的召回率。这个召回率相比较PASCAL数据集98%是非常低的,这表明在区域提取子阶段还有很大的改进余地。

训练数据

对于训练数据,制作了从验证集1中一系列包含所有选择性搜索和ground-truth框的图片和边框,每类共N个ground-truth框,从训练集(如果在训练集中一类有少于N个ground-truth框,就把他们全部选择。)在消融研究中,展示了在验证集2中的mAP对于N取值{0,500,1000}。
训练数据在R-CNN中被用作三段程序:
(1)CNN精调
CNN精调在上述训练集中运行大约5万次SGD迭代,在一块NVIDIA Tesla K20使用caffe花费大约13小时。
(2)检测子SVM训练
来自训练集的所有ground-truth框对于他们各自类都用作正样本,在5000张来自验证集1的图片上随机选择来挖掘出难例(hard negative),一个最初的实验显示挖掘所有验证集1中的负样本对比于在一个5000图片的子集上(大约全部样本的一半),只造成了在mAP上0.5的下降,但是时间成本却降低了一半。不从训练集中照负样本,因为标注不够彻底。不使用额外的证实为负样本的图片。
(3)边框回归训练
边框回归在验证集1上训练。

验证集与评估

在提交结果到评估服务器上之前,使用上述数据集验证数据使用选择和在验证集2上精调和边框回归的影响。所有系统超参数(SVM C超参数,用于区域弯曲的填充,NMS阈值,边框回归超参数)都和PASCAL数据集上使用的一样。淡然,有些超参数用在ILSVRC还是没有那么理想,然而任务的目标都是为了在ILSVRC数据集上产生一个初步的R-CNN结果不带广泛的数据集的调整。在验证集2中选择了最好的选择之后,提交了两个结果文件到服务器,第一个不带边框回归,第二个带边框回归。为了这些提交,各自扩大了SVM和边框回归训练集来使用val+train1k和val,使用CNN在val1+train1k上精调来避免重新运行精调和特征计算。

消融研究

这里写图片描述
上图显示了不同数量训练集,精调以及边框回归影响的消融研究。首先观察到在val2上的mAP和test上的mAP匹配比较接近,说明val2和test上的表现还是能有比较好的显示度,说明力。第一个结果20.9%是R-CNN使用ILSVRC2012分类数据集预训练(没有精调)并且给予少量训练数据到val1中(召回val1中大约一半类的15到55个样本左右)。然后扩大训练集到val1+trainN将mAP提升到24.1%,N=500到1000之间本质上没有什么变化。说明训练集扩大,不一定效果会越来越好,会趋于稳定。然后只使用来自val1的数据集精调CNN,mAP有些许上升到了26.5%,然而由于少量的正训练样本,出现了轻微的过拟合。扩大精调的数据集到val1+train1k(从训练集中每类增加了1000个正样本),精度提升到了29.7%,边框回归帮助提升mAP到了31.0%,这个帮助甚微。

与Overfeat的关系

Overfeat可以看作是R-CNN的一个特例,即利用一个规律的正方形区域多尺度金字塔来代替选择性搜索,并且改变每类边框回归子为一个单一的边框回归子,然后系统就相同了(在训练方式上存在一些潜在性的不同:CNN检测荆条,使用SVM等),值得注意的是,Overfeat相比于R-CNN有着显著的速度优势。大约快9倍,这个速度来源于Overfeat的滑窗不是在图像层面的变形弯曲,因此计算能在重叠区域变的更加容易共享,共享通过卷积的方式在任意尺寸输入上运行整个网络来实现的。应该以各种方式加速R-CNN并且作为未来的工作。

语义分割

对于语义分割来说,区域分类是一个标准的理论,R-CNN能轻易运用到PASCAL VOC分割挑战。为了便于与当前领先的语义分割系统进行比较(二阶池化,O2P),运行了此系统的开源框架,O2P使用CPMC来对每张图片产生150个区域提取子,然后预测对于每类每个区域的质量,使用支持向量回归SVR,由于CPMC区域的质量和多特征种类的(丰富的SIFT和LBP的变体)有力的二阶池化,并且在最近使用一个CNN作为多尺度逐像素分类器在多个密集场景标记数据集上(不包括PASCAL)展示了良好的效果。语义分割主要遵循Semantic segmentation using regions and parts.和Semantic segmentation with second-order pooling.两篇论文。

CNN特征用于分割

对于CPMC区域上计算特征的三种策略进行了评估,所有都开始于弯曲规则的窗口到227x277,第一种策略忽略了区域的形状且直接在变形的窗口上进行CNN特征计算,和在做检测时一样。然而,这些特征忽略了区域的非矩形形状。第二种区域可能在有少量重叠时有非常相似的边框,因此,第二种策略只在一个区域的前景掩膜上计算CNN特征。利用平均输入来代替背景以便于做平均减法时背景区域都是零。第三种策略简单的串联上述两种策略,下面为实验结果。

这里写图片描述

上图显示了VOC2011验证集上与O2P方法的比较,并且利用三种策略方法,其中fc6层的效果总是比fc7层效果更好,fg策略比full效果更好说明掩蔽的区域形状提供了一个更强的信号,与直觉相匹配。然而,full+fg实现了47.9%,说即使给出了fg特征,由full特征提供的上下文也是有高度信息性的并且,速度还是比02P快了10多倍。

这里写图片描述

上图展示了在VOC2011测试集上的效果,本文方法实现了共21项中11项取得了最好结果的表现,平均准确率也达到了最高的47.9%,如果进行精调能达到更好的效果。

结论

最近这些年(当时),目标检测表现处于停滞不前的状态,最好的表现系统由结合多种低层次图像特征和来自目标检测子与场景分类器的高层上下文的集成而成,本文展示了一个简单的可扩展的目标检测算法,在PASCAL VOC2012数据集上提升了最好表现的大约30%。
通过两个方面实现了这个表现,第一个是应用了高容量的卷积神经网络来自下而上的的到区域提取子来定位和分割目标。第二个是作为一个当标签训练数据不足时如何训练大型CNN的范例,有监督的预训练网络是非常高效的,作为一个有大量数据(图像分类)辅助任务然后利用稀缺的目标数据来对网络进行精调(检测),有监督的预训练/特定域精调的范例对于大量数据不足的视觉问题都会变的高效。
最后得出结论,通过结合使用计算机视觉和深度学习两个经典工具(自下而上区域提取子和卷积神经网络)来实现这些结果是非常重要的。

A. 目标提取子转换

使用卷积神经网络要求固定的227x227的分辨率,对于检测,考虑目标提取子为任意图像矩形,因此评估了两种将目标提取子转换为有效的CNN输入的方法。
(1)第一种方法即利用上下文来缩小方格大小,将每个目标检测子都包含在最紧密的方格内,然后将包含在内的图像缩放(各向同性)为CNN输入尺寸。

这里写图片描述

上图即为不同目标提取子转换,(A)原始目标提取子相对于转换的CNN输入的实际比例。(B)利用上下文紧密包含目标。(C)不利用上下文而紧密包含目标。(D)弯曲变形,即各向异性的将每个目标提取子缩放为CNN的输入尺寸。每一列的示例中,上面的行对应没有上下分的填充p=0,而下面行有p=16的上下文填充。
对于每个这些转换,也考虑了围绕原始目标提取子的包含额外的图像上下文,上下文填充p的数量被定义为在变换后的输入坐标系中围绕原始对象提取子边界尺寸。在所有方法中,如果源矩形窗口超过了图像,缺失的数据由图像均值(在输入到CNN之前被减去)代替。一组实验表明,使用上下文填充(p=16)进行弯曲的方式大大超越了替代方案(3-5mAP),显然,更多的选择也是有可能的,不一定是均值填充,还可以利用复制的方法等。

B. 正负样本和softmax
两个设计选择值得进一步讨论。第一个是,为什么相对于训练目标检测SVM,精调CNN的正负样本定义不同?简短的说,为了精调,映射每个目标提取子到有最大IoU重叠(如果有的话)ground-truth实例上,并且如果IoU至少为0.5,则对匹配到的ground-truth类标记为正类,所有其他的提取子被标记为“背景”(对于所有类都为负样本)。但对于训练SVM,相反,只将ground-truth边框作为对应相应类的正样本,并且如果标签提取子与那类的IoU少于0.3则标记为负样本。其余“抖动”样本(超过0.3的IoU的重叠提取子,并且不是ground-truth)将被忽略。
这种正负类定义的差异不是重要的,关键在于没有足够的数据来进行CNN精调,因此才将抖动数据也加入正类进行训练。
这就引出了第二个问题,为什么精调之后还要全部训练SVM?简单应用网络精调的最后一层即一个21路softmax回归分类器作目标检测子将会更加简洁,试过之后发现mAP从54.2%下降到了50.9%,这种下降的表现产生于多个因素的结合,包括使用在精调中的正样本的定义没有突出定位准确性和softmax分类器是在一个随机采样的负样本中训练的而不是在使用在SVM训练中的难例的子集当中训练。
这个结果说明精调之后没有训练SVM是有可能获得相同的表现效果的。推断使用一些额外的调整来精调剩余表现差距可能行不通,如果可以,可能能简化并加速R-CNN在没有精度损失下的表现。

C.边框回归
通过使用简单的边框回归来提升定位表现,在利用一个特定类检测SVM给每个选择性选择提取子打分之后,使用一个特定类边框回归子来为了检测而预测一个新的边框。有点类似于可变性部件模型中的边框回归。这两种方法的主要区别在于,这里从CNN计算的特征回归,而不是从推断的DPM部分位置计算的几何特征。
输入到训练算法中的是一系列N个训练对{(Pi,Gi)}(i=1…N),这里Pi=(Pxi,Pyi,Pwi,Phi)特指提取子的中心位置Pi的边框的坐标,以及其边框宽度和长度。现在来分析单独一个,则i不需要考虑。每一个ground-truth边框G与上述表示相同为,G=(Gx,Gy,Gw,Gh),目标是学习到一个映射一个提取子边框P到一个ground-truth边框G的转换。
利用四个函数dx(P),dy(P),dw(P),dh(P)来参数化这个转换,首先两个特指一个对于P的边框的中心的大小不变的转换。后两个特指P的边框的宽度和长度的对数空间的转换。学习到这些函数后,就能转换一个输入提取子P到一个预测的ground-truth边框G’了。如下图

这里写图片描述

每一个函数di(P),i指(x,y,w,h)是由提取子P的第五层池化特征的一个线性函数建模而成,定义为ϕ5(P)。因此有di(P)=wiTϕ5(P),其中wi是一个可学习的模型参数的向量。学习wi通过优化正则化最小二乘目标(岭回归):

这里写图片描述

其中回归目标t对于训练对(P,G)为

这里写图片描述

作为一个标准的正则化最小二乘问题,这可以很有效的解决。
在实现边框回归时,发现了两个微妙的问题。第一个是在一个验证集上设置λ=1000对正则化来说非常重要。第二个为选择要使用的训练对的时候要非常的注意。直觉而言,如果P离所有的ground-truth边框都很远,那么将P转换到G的任务则没有意义。因此,只从在至少一个ground-truth边框附近的提取子P用来学习。这个“附近”的含义为P与G的最大IoU重叠有且只有一个大于阈值(在验证集中设置为0.6),则定义为“附近”。其余的提取子就将被丢弃。对每类都这样做来学习一系列特定类的边框回归。
在测试时,为每个提取子打分并且预测一次他的新的检测窗口一次。原则上会迭代这个过程(重新为新的预测边框打分,然后预测一个新的边框),然而,这种迭代对效果并没有提升。

展开阅读全文

没有更多推荐了,返回首页