微信公众号:AI那点小事 知乎专栏:AI那点小事 CSDN博客:https://daipuweiai.blog.csdn.net/ 作者:戴璞微 原文链接:https://zhuanlan.zhihu.com/p/76619825 https://daipuweiai.blog.csdn.net/article/details/98463403
在上一篇博客:【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制主要讲解了IoU与非极大抑制相关概念与python实现,接下来在这篇博客中主要讲解了R-CNN论文中模型结构及其相关技术细节。
R-CNN在2014年横空出世,作者是目标检测领域的大神Ross Girshick,Ross Girshick也是其后序迭代版本Fast RCNN和Faster RCNN联名作者。RCNN属于是目标检测中two-stage(两阶段)算法中的鼻祖,其最终迭代版本——Faster RCNN更是成为了two-stage算法的标杆。
R-CNN在这篇论文里,Ross Girshick提出了一种简单并且可扩展的检测算法,在权威数据集PASCAL VOC2012上,RCNN将mAP提高了30%以上,达到了—53.3%。这也使得RCNN成为了第一个工业级的目标检测算法。之所以R-CNN能得到如此优秀的效果,主要得益于如下两个方面:
在这篇论文中,作者将Region proposal和CNNs结合起来,所以该方法被称为R-CNN:Regions with CNN features。我们也把R-CNN效果跟OverFeat比较了下(OverFeat是R-CNN之前目标检测性能最好算法),结果发现R-CNN在200类ILSVRC2013检测数据集上的性能明显优于OverFeat。
在目标检测中,提取出图像中有效特征是最关键的一步工作。在R-CNN提出之前近十年时间里,SHIFT和HOG特征是各种视觉任务的基础。但是SIFT和HOG是块方向直方图(blockwise orientation histograms),一种类似大脑初级皮层V1层复杂细胞的表示方法。但我们知道识别发生在多个下游阶段,即我们是先看到了一些特征,然后才意识到这是什么东西。也就是说对于视觉识别来说,更有价值的信息,是层次化的多阶段特征。
这也就导致了在2010-2012年目标检测进展缓慢,取得的微小进步都是通过构建一些集成系统和采用一些成功方法的变种才达到的。因此,传统的人工特征并不能适应于当前海量数据的目标检测问题,必须采用由浅入深、多层次自动提取深层特征的CNN来作为目标检测中核心特征提取器。
目标检测的第二个挑战是标签数据太少,可获得的数据远远不够用来训练一个大型卷积神经网络。传统方法多是采用无监督与训练,再进行有监督调优。但是在R-CNN提出之前,ImageNet数据集因AlexNet高出第二名15%的分类精度而变得受人关注。因此在R-CNN中,大型卷积神经网络是在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优。即首先R-CNN网络的初始参数是已经在ILSVRC数据集上已经训练好的网络参数,之后利用小样本的PASCAL VOC数据集对参数进行调优(微调,fine-tuning),使得R-CNN能够充分实现分类与定位两项任务。
首先进行有监督预训练,之后在特定数据集下进行微调的训练方式被称作为迁移学习。迁移学习是在训练数据稀少的情况下一个非常有效的训练大型卷积神经网络的方法。在R-CNN论文的实验中,针对目标检测的调优将mAP提高了8%。调优后,R-CNN在VOC2010数据集上达到了54%的mAP,远远超过高度优化的基于HOG的可变性部件模型(deformable part model,DPM)。
R-CNN模型的架构如下图所示。从图中可以看出,R-CNN首先在输入图像中提取接近2000个目标框(区域),之后将这些区域送入CNN中进行提取深度特征,最后利用这些深度特征进行目标的分类与定位两大任务。由于该模型结合了推荐区域(Region proposals)和CNN,所以起名为R-CNN:Regions with CNN features。
在这里插入图片描述
接下来我们也将围绕目标框的提取、深度特征的提取和分类定位几个方面全面解读R-CNN。
首先来看下目标框即推荐区域的提取。在2014年R-CNN被提出之前,目标框的提取主要分为三种。
第一种就是滑动窗口。滑动窗口本质上就是穷举法,利用不同的尺度和长宽比把所有可能的大大小小的块都穷举出来,然后送去识别,识别出来概率大的就留下来。很明显,这样的方法复杂度太高,产生了很多的冗余候选区域,在现实当中不可行。
第二种是规则块。在穷举法的基础上进行了一些剪枝,只选用固定的大小和长宽比。但是对于普通的目标检测来说,规则块算法依然需要访问很多的位置,复杂度高。
第三种是选择性搜索(selective search,ss)。从机器学习的角度来说,前面的方法召回是不错了,但是精度差强人意,所以问题的核心在于如何有效地去除冗余候选区域。其实冗余候选区域大多是发生了重叠,选择性搜索利用这一点,自底向上合并相邻的重叠区域,从而减少冗余。
因此在R-CNN中选取了选择性搜索算法来生成后序后续送入CNN的推荐区域(Region Proposal)。
在利用选择性搜索算法获取到原始图像中的推荐区域之后,R-CNN将这些推荐区域送入到CNN中来提取深度特。在2014年R-CNN提出之前,AlexNet夺得了ImageNet竞赛的冠军,展现出了强大的图像特征提取能力。因此,R-CNN采用了AlexNet作为提取图像特征的主干网络。不同的是,我们将AlexNet最后的ImageNet专用的1000-way分类层舍弃,采用了一个21维的分类层(20个目标分类+1个背景)。
同时由于AlexNet对于输入图像必须要求是227*227的RGB彩色图像,因此在R-CNN中,作者是将选择性搜索得到的推荐区域的图像尺寸首先进行了区域的转化成227 x 227。
由于分类与定位两大任务在训练和测试阶段有所区别,因此这两部分我们将分别在训练和测试两个任务中进行描述。首先我们来看下训练阶段。训练阶段AlexNet的模型训练采用的有监督预训练和特定领域内参数微调的训练方式。梯度下降算法采用的SGD,学习率为0.001,小批量样本规模是128,其中正例32个(包括所有类别的推荐区域以及真实框),反例96个(即背景)。区分正例与反例的标准为目标框与真实框(Ground Truth)之间的IoU>=0.5,即IoU>=0.5则记作正例,反之记作反例(即背景)。
在提取特征完成之后,我们要做的还有就是训练每个类别SVM分类器将提取得到的特征向量用于优化每个类别的SVM二分类器。这个时候每个目标框标签的就要从物体分类的多变量one-hot标签转化成二分类的0/1标签。标签制定标准为目标框与真实框之间IoU是否大于0.3。若IoU<0.3则记作负样本即标签为0,真实框作为正例,其余的全部舍弃。
R-CNN不仅要完成AlexNet、SVM的训练,而且还要完成定位任务。在这里我们将AlexNet获得特征向量按类别送入x,y,w,h这四个分量回归器,利用梯度下度算进行训练每个分量回归器的权重,在这里特征向量的选择必须是与真实框(Ground Truth)之间IoU大于0.6的对应推荐区域提取出来的特征向量。R-CNN的训练流程图如下图所示。
在这里插入图片描述
在测试阶段我们,我们首先使用选择性搜索进行获取目标检测框,并将目标框填充至正方形然后转换尺寸到227*277,之后通过AlexNet进行提取特征,然后利用每个类别训练好的SVM二分类器对AlexNet提取得到的特征向量的每个类别进行打分。接下来分别将每个类别的特征向量送入已经训练好的每个类别的边界框回归器进行定位预测。得到分类打分和定位信息之后,可能会出现多个目标框之间IoU较高,即产生了目标框重叠,因此我们需要利用非极大抑制(NMS)算法进行去除IoU大于阈值的重复目标框。测试阶段的流程图如下图所示。
在这里插入图片描述
上述4小节主要讲述了R-CNN模型主体框架及其训练和测试阶段的流程。接下来我们相关重点问题进行解释。
第一个问题就是为什么必须选用各向异性缩放与填充的图像尺度变换?
作者在附录中指出:
在这里插入图片描述
经过作者一系列实验表明采用padding=16的各向异性缩放即下图第二行第四列效果最好,能使mAP提升3-5%。
第二个问题是为什么微调时和训练SVM时所采用的正负样本阈值不一致?
微调阶段是由于CNN对小样本容易过拟合,那么需要大量训练数据,故对IoU限制宽松。在微调时,Ground Truth+与Ground Truth相交IoU>0.5的建议框为正样本,否则为负样本。SVM则是适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。换句话说,微调阶段属于宽粒度训练,需要大量训练样本,IoU阈值设置宽松,但是SVM则属于强分类器,适合小样本训练,因此对IoU阈值设置严格。
第三个问题是为什么不直接在微调结束后,在AlexNet后直接加上21维的Softmax分类层而是采用SVM进行分类?
作者在附录中指出,因为微调时和训练SVM时所采用的正负样本阈值不同,微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;并且微调阶段的负样本是随机抽样的,而SVM的负样本是经过hard negative mining方法筛选的;导致在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。 第四个问题是为什么必须利用特定领域的数据集进行微调?直接使用AlexNet预训练的网络参数进行特征提取进而训练SVM不可以吗?
作者设计了没有进行微调的对比实验,分别就AlexNet的pool5、fc6、fc7层进行特征提取,将提取的特征输入SVM进行训练,这相当于把AlexNet CNN网络当做类似于HOG、SIFT一样的特征提取器,不针对特定提取任务。实验结果发现f6层提取的特征比f7层的mAP还高,pool5层提取的特征与f6、f7层相比mAP差不多;在PASCAL VOC 2007数据集上采取了微调后fc6、fc7层特征较pool5层特征用于SVM训练提升mAP十分明显。
由此作者得出结论:不针对特定任务进行微调,而将CNN当成特征提取器,pool5层得到的特征是基础(共性)特征,从fc6和fc7等全连接层中所学习到的特征是针对特征任务特定样本的特征。
因此在有监督预训练(迁移学习)之后利用特定任务特定样本对网络参数进行微调时非常有必要的。
显然R-CNN存在以下几个缺点: