个人心得:
1. 流程:输入图像,产生2k个候选区域,输入CNN,得到特征向量输入SVM进行分类
2. CNN的输入是固定的(因为全连接的尺寸),但是候选区域的尺寸不固定了,所以要resize
3. 需要思考3个问题,为什么要用SVM分类?如何NMS?如何BB regression?
CVRP 2014,原文链接:http://xxx.itp.ac.cn/abs/1311.2524
原文代码,基于Caffe:https://github.com/rbgirshick/rcnn
有人居庙堂,有人守边疆
同友同行,为太平故,为逝者祈福
愿疫过民安,合家团圆
本文作于2020年4月4日。
Object detection performance, as measured on the canonical PASCAL VOC dataset, has plateaued in the last few years. The best-performing methods are complex ensemble systems that typically combine multiple low-level image features with high-level context.
目标检测的性能是用经典的PASCAL VOC数据集来衡量的,在近几年里都停滞不前。之前最好性能的方法是复杂的集成系统,通常将多个低级图像特征与高级上下文结合在一起。
In this paper, we propose a simple and scalable detection algorithm that improves mean average precision (mAP) by more than 30% relative to the previous best result on VOC 2012—achieving a mAP of 53.3%.
在本文中,我们提出了一个简易的、可扩展的检测算法,其将VOC 2012的mAP提高了超过30%,达到了53.3%。
Our approach combines two key insights: (1) one can apply high-capacity convolutional neural networks (CNNs) to bottom-up region proposals in order to localize and segment objects and (2) when labeled training data is scarce, supervised pre-training for an auxiliary task, followed by domain-specific fine-tuning, yields a significant performance boost.
我们的方法结合了2个重要的想法:(1)可以将大型卷积神经网络(CNN)应用于自下而上的区域候选,以便对目标进行定位和分割;(2)当标记的训练数据稀少,有监督的预训练时当做一个辅助任务,进行特定于域的微调,可以显著提高性能。
Since we combine region proposals with CNNs, we call our method R-CNN: Regions with CNN features. We also compare R-CNN to OverFeat, a recently proposed sliding-window detector based on a similar CNN architecture. We find that R-CNN outperforms OverFeat by a large margin on the 200-class ILSVRC2013 detection dataset.
因为我们使用基于CNN的区域候选,因此我们把这个方法称为R-CNN:Regions with CNN features。我们也将R-CNN和OverFeat(基于相似的CNN架构的滑动窗口目标检测框架)进行比较,我们发现在ILSVRC2013上R-CNN的性能超过了OverFeat一大截。
特征很重要。在过去的十年中,各种视觉识别任务的进展都很大程度上取决于SIFT和HOG的使用。但是,如果我们查看经典的视觉识别任务PASCAL VOC目标检测的性能变化,通常会发现到在2010-2012年间进展缓慢,可以说,通过构建集成系统和采用一些较成功方法的较小改变的变体获得的收益很小。
SIFT和HOG是块状方向直方图,可以大致与V1(灵长类动物视觉通路的第一个皮质区域)中的复杂细胞相关联。但是我们也知道,识别发生在下游的几个阶段,这表明可能存在用于计算特征的层次化、多阶段的过程,这些过程对于视觉识别来说甚至更有意义。
Fukushima的“neocognitron”,一种受生物学启发用于模式识别的层次化、移动不变性模型,算是这方面最早的尝试。然而,neocognitron缺乏监督学习算法。Lecun等人的工作表明基于反向传播的随机梯度下降(SGD)对训练卷积神经网络(CNNs)非常有效,也可以说CNN是被认为是继承neocognitron的一类模型。
CNN在1990年代被广泛使用,但是因为支持向量机的出现而退出了研究领域。2012年,Krizhevsky等人在ILSVRC上的出色表现(AlexNet)重新燃起了世界对CNNs的兴趣。他们的成功在于在120万的标签图像上使用了一个大型的CNN,并且对LeCun的CNN进行了一些改造(比如ReLU和Dropout)。
这个ImangeNet的结果的重要性在ILSVRC2012 workshop上得到了热烈的讨论。中心的议题可以被归纳为,ImageNet上的CNN分类结果可以多大程度的推广到目标检测的PASCAL VOC上?
我们将图像分类和目标检测连接在一起,回答了这个问题。这篇文章第一次表明了CNN可以显著地在PASCAL VOC上提高目标检测的性能,相比于之前基于HOG特征的系统。我们主要关注了2个问题:使用深度网络定位目标和只用一小部分标注的数据来训练一个大型的模型。
和图像分类不同的是,检测要求在图像中确定目标的位置。一种方法是把定位当做一个回归问题。然而,Szegedy等人成果说明这个idea其实不是很行(效果远低于R-CNN)。另一个替代的方法是使用滑动窗口。CNN被用于滑动窗口有起码20年的历史了,特别是在特定目标的中,如人脸、行人。为了保持高空间分辨率,CNN通常只有2层卷积和池化。我们也考虑过使用滑动窗口,但是由于网络层次更深(有5层),输入图片有非常大的感受野(195×195)和stride(32×32),这使得采用滑动窗口的方法是一个开放的技术挑战。
相比之下,我们使用“recognition using regions”的方法解决了CNN的定位问题,这个方法在目标检测和语义分割领域都很成功。在测试时,我们会为输入的图像生成近2000个类别无关的候选区域,然后对每个候选区域使用CNN来提取一个固定长度的特征向量,最后使用线性支持向量机对每个候选区域进行分类。我们可以不管区域的尺寸,使用仿射图像变形的方法来对每个不同形状的候选区域产生一个固定长度的作为CNN输入的特征向量。下图是我们的方法的流程,由于结合区域候选和CNN,因此我们的方法取名为R-CNN。
在本文的更新版本中,我们通过在200类ILSVRC2013检测数据集上运行R-CNN,提供了R-CNN与最近提出的OverFeat检测系统的直接对比。OverFeat使用滑动窗口CNN进行检测,到目前为止,这是ILSVRC2013检测中性能最好的方法。我们显示,R-CNN明显优于OverFeat,mAP达到了31.4%。
检测中面对的第二个挑战是标签数据太少,现在可获得的数据远远不够用来训练一个大型卷积网络。传统的方法使用无监督预训练,然后在监督学习微调。本文第二个核心贡献是在辅助数据集(ILSVRC)进行监督训练,然后再针对小数据集进行特定地微调,这是在数据稀少的情况下一个非常有效的训练大型卷积神经网络的网络。在我们的实验中,对检测的微调使mAP增加了8%。在经过微调后,我们的系统在VOC 2010达到了54%的mAP,远远超过高度优化的deformable part model(DPM)。我们还向读者指出Donahue等人的同期著作,Krizhevsky的CNN可以用作黑箱特征提取器(无需微调),从而在包括场景分类,细粒度分类和域自适应在内的多种识别任务上表现出出色的性能。
我们的系统是相当高效的。唯一的特定于类的计算是一个相当小的矩阵向量乘积和贪婪的非极大抑制。此计算属性源自所有类别之间共享的特征,并且维数也比以前使用的区域特征低两个数量级。
了解我们的方法的失败模式对于改进它也是至关重要的,因此我们报告了Hoiem等人的检测分析工具的结果。作为此分析的直接结果,我们证明了一种简单的边界框回归方法可以显着减少误定位,这是主要的误差模式。
在描述技术细节之前,我们注意到,由于R-CNN在区域上运行,因此很自然地将其扩展到语义分割的任务。稍作修改,我们在PASCAL VOC分割任务上也取得了竞争性结果,在VOC 2011测试集上,平均细分精度为47.9%。
我们的物体检测系统由三个模块组成。第一个模块生成与类别无关的区域候选框。这些候选框定义了我们的检测器可用的一组候选检测区域的集合。第二个模块是一个大型卷积神经网络,它从每个区域提取一个固定长度的特征向量。第三个模块是一组特定于类别的线性SVM。在本节中,我们介绍每个模块的设计决策,描述测试阶段的用法,详细了解如何学习其参数以及显示PASCAL VOC 2010-12和ILSVRC2013上的检测结果。
区域候选:近来有很多研究都提出了产生类别无关区域候选的方法。由于R-CNN对特定区域算法是不关心的,所以我们采用了选择性搜索(selective search)以方便和前面的工作进行可控的比较。
特征提取:会从
在测试时,我们对测试图像进行selective search,以提取大约2000个候选区域(我们在所有实验中均使用selective search的“快速模式”)。我们对每个候选区域进行变形,然后依次通过CNN进行传播以计算特征。然后,对于每个类别,我们使用针对该类别训练的SVM对每个提取的特征向量进行评分。给定图像中所有计分的区域,我们应用贪婪的非极大抑制(每个类别都是独立进行),如果该区域的交叉重叠(IoU)重叠且评分较高的选定区域大于a,则抛弃掉该区域。
运行分析:有2个特性会让检测变得很效率。(1)所有的CNN参数都是共享的;(2)过CNN计算的特征向量相比其他通用方法(spatial pyramids with bag-of-visual-word encodings)维度是很低的。UVA检测系统的特征比我们的要多两个数量级(360k vs 4k)。
这种共享的结果就是计算候选区域的特征的耗时可以分摊到所有类别的头上(GPU:每张图13s,CPU:每张图53s)。唯一的和具体类别有关的计算是特征向量和SVM权重和点积,以及非极大抑制。实践中,所有的点积都可以批量化成一个单独矩阵间运算。特征矩阵的典型大小是2000×4096,SVM权重的矩阵是4096xN,其中N是类别的数量。
实验分析表明,R-CNN可以扩展到上千个类别,而不需要借用近似技术(如hashing)。即使有10万个类别,矩阵乘法在现代多核CPU上只需要10s而已。但这种高效不仅仅是因为使用了区域候选和共享特征。由于较高维度的特征,UVA系统存储100k linear predictors需要134GB的内存,而我们只要1.5GB,比我们高了两个数量级。
有趣的是,R-CNN和最近Dean等人使用DPMs和hashing做检测的工作相比,他们用了1万个干扰类,每五分钟可以处理一张图片,在VOC 2007上的mAP能达到16%。我们的方法1万个检测器,由于没有做近似,可以在CPU上一分钟跑完,达到59%的mAP。
监督预训练:我们仅使用图像级注释在大型辅助数据(ILSVRC2012分类)上有区别地预训练了CNN(边界框标签不适用于此数据)。使用开源Caffe CNN库进行预训练。简而言之,我们的CNN几乎与Krizhevsky等人的表现相当,在ILSVRC2012分类验证集上获得了最高2.2个百分点的top-1错误率,这种差异是由于训练过程的简化。
特定领域的微调:为了让我们的CNN适应新的任务(检测)和新的领域(变形后的候选窗口)。我们只使用变形后的候选区域对CNN参数进行SGD训练。我们替换掉了ImageNet的1000类分类层,换成了一个随机初始化的21类分类层(其中20是VOC的类别数,1代表背景),而卷积部分都没有改变。我们对待所有的候选区域,如果其和真实标注的框的IoU>= 0.5就认为是正例,否则就是负例。SGD开始的learning_rate为0.001(是初始化预训练时的1/10),这使得调优得以有效进行而不会破坏初始化的成果。每轮SGD迭代,我们统一使用32个正例窗口(跨所有类别)和96个背景窗口,即每个mini-batch的大小是128。另外我们倾向于采样正例窗口,因为和背景相比它们很稀少。
目标类别分类器:思考一下检测汽车的二分类器。很显然,一个图像区域紧紧包裹着一辆汽车应该就是正例。同样的,没有汽车的就是背景区域,也就是负例。较为不明确的是怎样标注哪些只和汽车部分重叠的区域。我们使用IoU重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值我们选择了0.3,是在验证集上基于
一旦特征提取出来,并应用标签数据,我们优化了每个类的线性SVM。由于训练数据太大,难以装进内存,我们选择了标准的hard negative mining method。高难负例挖掘算法收敛很快,实践中只要在所有图像上经过一轮训练,mAP就可以基本停止增加了。附录B中,我们讨论了,为什么在fine-tunning和SVM训练这两个阶段,我们定义得正负样例是不同的。我们也会讨论为什么训练一个分类器是必要的,而不只是简单地使用来自调优后的CNN的最终fc8层的输出。
下图展示了在VOC 2010的结果,我们将自己的方法同四种先进的基准方法作对比,其中包括SegDPM,这种方法结合了DPM检测器和语义分割系统的输出,并使用了附加的检测器间上下文和图像分类器记录。更加恰当的比较是同Uijling的UVA系统比较,因为我们的方法同样基于候选框算法。对于候选区域的分类,他们通过构建一个4层的金字塔,并且将之与SIFT模板结合,SIFT为扩展的OpponentSIFT和RGB-SIFT描述子,每一个向量被量化为4000-word的codebook。分类任务由一个直方图交叉核的SVM承担,对比这种方法的多特征方法,非线性内核的SVM方法,我们在mAP达到一个更大的提升,从35.1%提升至53.7%,而且速度更快。我们的方法在VOC2011/2012测试集上达到了相似的检测效果mAP53.3%。
- Results on ILSVRC2013 detection
我们使用与用于PASCAL VOC相同的系统超参数在200类ILSVRC2013检测数据集上运行R-CNN。我们仅遵循两次将测试结果提交到ILSVRC2013评估服务器的相同协议,一次带有边界框回归,一次带有边界框回归。
下图将R-CNN与ILSVRC 2013竞赛中的参赛的model以及竞赛后的OverFeat结果进行了比较。R-CNN的mAP达到31.4%,大大超过了OverFeat的24.3%。大多数竞争者(OverFeat,NEC-MU,UvA-Euvision,Toronto A和UIUC-IFP)都使用了卷积神经网络,这表明在如何将CNN应用于对象检测方面存在很大的细微差别,从而导致结果差异很大。
第一层过滤器可以直接可视化并且易于理解。它们捕获定向的边缘和对手的颜色。了解后续图层更具挑战性。Zeiler和Fergus提出了一种视觉上有吸引力的反卷积方法。我们提出一种简单(且互补)的非参数方法,该方法直接显示网络学到的知识。
想法是挑选出网络中的特定单元(功能),并像使用它本身就是对象检测器一样使用它。就是说,我们根据一大批保留候选区域(大约1000万)计算单位的激活,将候选区域从最高激活排序到最低激活,执行非极大抑制,然后显示得分最高的区域。我们的方法通过确切显示触发的输入,让选定的单元“为自己说话”。我们避免求平均值,以便看到不同的视觉模式并深入了解由设备计算出的不变性。
我们将第5层(即网络的第五个也是最后一个卷积层)的最大池化输出可视化。pool5特征图为6×6×256 = 9216维。忽略边界效应,每个pool5单元在原始227×227像素输入中具有195×195像素的接收场。一个中央游泳池5的单位几乎具有全局视野,而靠近边缘的单位则具有较小的固定支持。
上图中的每一行显示了CNN的pool5单元的前16个激活区域,我们在VOC 2007训练中对其进行了微调。可视化256个功能独特的单元中的六个。选择这些单元以显示网络学习内容的代表性示例。在第二行中,我们看到一个在狗脸和点阵列上触发的单元。与第三行相对应的单位是红色斑点检测器。还有用于人脸和更抽象的图案的检测器,例如带有窗口的文本和三角形结构。该网络似乎正在学习一种表示形式,该表示形式将少量的类调整特征与形状、纹理、颜色和材料属性的分布式表示形式结合在一起。后续的完全连接层fc6具有对这些丰富特征的大量组合进行建模的能力。
主要比较了没有微调的各层性能和调优后的各层性能。
本文的大多数结果使用Krizhevsky等人的网络体系结构。但是,我们发现架构的选择对R-CNN的检测性能有很大的影响。在表3中,我们显示了Simonyan和Zisserman最近提出的使用16层深度网络(VGG)进行VOC 2007测试的结果。在最近的ILSVRC 2014分类挑战中,该网络是表现最好的网络之一。该网络具有一个均匀的结构,该结构由13层3×3的卷积核组成,其中散布了五个最大池化层,并在其上放置了三个完全连接的层。 对于牛津网络(VGG),我们将此网络称为“ O-Net”;对于多伦多网络(AlexNet),我们将其基准称为“ T-Net”。
为了在R-CNN中使用O-Net,我们从Caffe Model Zoo下载了VGG ILSVRC 16层模型的公开可用的预训练网络权重。然后,我们使用相同的方法对网络进行了微调,用于T-Net。唯一的区别是根据需要使用较小的批处理(24),以适合GPU内存。结果表明,带有O-Net的R-CNN明显优于带有T-Net的R-CNN,mAP从58.5%增加到66.0%。但是,在计算时间方面存在很大的缺陷,O-Net的前向传递比T-Net花费大约7倍的时间。
为了揭示出我们方法的错误之处, 我们使用Hoiem提出的优秀的检测分析工具,来理解调参是怎样改变他们,并且观察相对于DPM方法,我们的错误形式。这个分析方法全部的介绍超出了本篇文章的范围,笔记就不做介绍了。
基于错误分析,我们使用了一种简单的方法减小定位误差。受到DPM中使用的约束框回归训练启发,我们训练了一个线性回归模型在给定一个选择区域的pool5特征时去预测一个新的检测窗口。详细的细节参考附录。该方法修复了大量的错位检测,提升了3-4个百分点。
主要是一些图片展示检测性能的。
主要是在ILSVRC 2013的竞赛细节。
区域分类是语义分割的一种标准技术,使我们能够轻松地将R-CNN应用于PASCAL VOC分割挑战。为了和当前主流的语义分割系统(称
我们将Hariharan等人提供的额外标注信息补充到PASCAL分割训练集中。设计选择和超参数都在VOC 2011验证集上进行交叉验证。最后的测试结果只执行了一次。
为了计算CPMC区域上的特征,我们执行了三个策略,每个策略都先将矩形窗口变形到227×227大小。第一个策略完全忽略区域的形状(full ignore),直接在变形后的窗口上计算CNN特征,就和我们检测时做的一样。但是,这些特征忽略了区域的非矩形形状。两个区域也许包含相似的约束框却几乎没有重叠。因此,第二个策略(fg,foreground)只计算前景遮罩(foreground mask)的CNN特征,我们将所有的背景像素替换成平均输入,这样减除平均值后他们就会变成0。第三个策略(full+fg),简单的并联全部(full)特征和前景(fg)特征;我们的实验验证了他们的互补性。
我们给出了VOC 2011测试集上的结果。比较我们的最佳执行方法,fc6(full+fg),对抗两个强大的baselines。我们的方法在21个类别中的11个达到最高的分割精度,最高的总体分割精度为47.9%,平均跨类别(但可能与O2P结果在任何合理的误差范围内)。通过微调可能会取得更好的成绩。
最近几年,目标检测陷入停滞,表现最好的检测系统是复杂的将多个低层级的图像特征与高层级的物体检测器环境与场景识别相结合。本文提出了一种简单并且可扩展的物体检测方法,达到了VOC 2012数据集相对之前最好性能的30%的提升。
我们取得这个性能主要通过两个方面:第一是应用了自底向上的候选框训练的大型卷积神经网络进行定位和分割物体。另外一个是使用在标签数据匮乏的情况下训练大规模神经网络的一个方法。我们展示了在有监督的情况下使用丰富的数据集(图片分类)预训练一个网络作为辅助性的工作是很有效的,然后采用稀少数据(检测)去微调定位任务的网络。我们猜测“有监督的预训练+特定领域的调优”这一范式对于数据稀少的视觉问题是很有效的。
最后,我们注意到能得到这些结果,将计算机视觉中经典的工具和深度学习(自底向上的区域候选框和卷积神经网络)组合是非常重要的。而不是违背科学探索的主线,这两个部分是自然而且必然的结合。
部分翻译参考自:https://blog.csdn.net/zkddt/article/details/100713823