RCNN论文笔记

    RBG大佬的论文<Rich feature hierarchies for accurate object detection and semantic segmentation>

素质三连

1.论文贡献

提出R-CNN(Regions with CNN features)算法,这是一个两阶段目标检测算法。

关键点 :

1)使用selective search生成region proposals

1)使用CNN提取region proposals的特征

2)数据不足时,现在进行预训练,然后进行特定领域的微调。

2.实验结果

在VOC 2012上,该算法的mAP比之前的模型提高了30%,达到53.3%的mAP

3.待解决的问题

速度太慢了,训练过程过于麻烦,不是端对端的模型。

预备知识

1.目标检测

    目标检测是我们用于识别图像中目标位置的技术。如果图像中有单个目标,并且我们想要检测该目标的位置,则称为图像定位。如果想要坚持图像中多个目标的位置,就是目标检测。

 1.jpg

    近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类:

    一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage的,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。

    另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。

    第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。


2.Intersection-Over-Union (IoU)

    物体检测需要定位出物体的bounding box,定位精度评价公式IOU:IOU=(A交B)/(A并B),用面积来看,公式为IOU=Sab/(Sa+Sb-Sab),图:

2.png

3.Mean Average Precision (mAP)

    类别平均精度均值。使用loU判断检测是否正确需要设定一个阈值,最常用的阈值是0.5,即如果loU>0.5,则认为是真实的检测(true detection),否则认为是错误的检测(false detection)。计算图片得到的每个检测框(置信度大于阈值)的loU值,用计算出的loU值与设定的loU阈值比较,就可以计算出该图片中类C的正确检测次数True Positives。对于每个图像,我们都有ground truth的数据(即知道每个图像的真实目标信息),因此也知道了该图像中类C的实际目标的数量Total Objects。

    因此可以计算该图片中类C的检测精度:3.png

    计算所有图片中类C的平均精度:4.png

    计算所有类别的平均精度的平均值(mAP,Mean Average Precision)5.png

4.Non-Maximum Suppression (NMS)

    非极大值抑制

6.png

    如上图,定位车辆,算法生成了一堆bounding box,我们需要判别哪些是没用的。假设有6个矩形框,根据分类器给出的置信度做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

    (1)从最大概率的矩形框F开始,分别判断A~E与F的重叠度IoU是否大于某个设定的阈值;

    (2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

    (3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

    就这样一直重复,找到所有被保留下来的矩形框。


5.Hard Negative Mining (难例挖掘)

    目标检测中的正负样本:在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),则认为它是positive sample,否则为negative sample。考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练。

    困难负样本(hard negative):困难负样本是指哪些容易被网络预测为正样本的proposal,即假阳性(false positive),如roi里有二分之一个目标时,虽然它仍是负样本,却容易被判断为正样本,这块roi即为hard negative,训练hard negative对提升网络的分类性能具有极大帮助,因为它相当于一个错题集。

    难例挖掘(hard negative mining):我们先用初始样本集去训练网络,再用训练好的网络去预测负样本集中剩余的负样本,选择其中得分最高,即最容易被判断为正样本的负样本为困难样本,加入负样本集中,重新训练网络,循环往复。然后我们会发现:网络的分类性能越来越强了。


6.Visual Object Classes Challenge (VOC)

    PASCAL VOC 挑战赛主要有 Object Classification 、Object Detection、Object Segmentation、Human Layout、Action Classification 这几类子任务。网站:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/


RCNN的提出

    特征抽取问题:之前,CV领域主要由SIFT和HOG推动的,SIFT和HOG都是blockwise orientation histograms,因此可以将其与灵长类视觉通路的第一个皮层区域V1中的复杂细胞联系起来。但是众所周知,视觉识别发生在视觉信息流下游的几个阶段,这表明人脑中的特征抽取可能有层次的,多阶段的,RCNN就是一个多阶段的目标检测模型。

    将CNN应用在目标识别任务,需要解决两个问题:

    第一个问题是,目标检测不仅需要分类,同时要给出目标的位置。一个方法是回归,但效果不是很好;还有就是滑动窗口,但这里的模型使用了5个卷积层,这使得特征图有很大的receptive field(195x195)和stride(32x32),使用滑动窗口难以精确定位。因此这里使用选择性搜索(SS)算法 生成region proposals。

    测试时,一张输入图片生成2000个region proposals,用CNN对每个proposal抽取固定长度的特征向量,然后使用SVM对特征向量进行分类。但是CNN的输入图片的分辨率是固定的,因此需要使用affine image warping将每个proposal缩放至CNN输入的分辨率。

    上述的方法称为R-CNN:Regions with CNN features,过程如下图:

7.png

    第二个问题是,数据集的缺乏,当前可用的数据集不足以训练一个大型的卷积神经网络。解决办法是先unsupervised pre-training,接着supervise fine-tunning。论文的第二大贡献是迁移学习,即先在通用数据集上进行预训练,接在在特定任务数据集上进行微调。RCNN模型先在大型数据集ILSVRC上训练,然后在小型数据集PASCAL上进行fine-tuning。实验表示在VOC2010上fine-tuning使得mAP提高了8%,mAP达到54%。相比之下,DPM方法才到33%。

    可视化:HOG类似的特征提取算法的一个优点是简单性:很容易理解它们携带的信息。作者也尝试分析卷积神经网络是如何工作的:通过’lobotomized’ CNN模型,发现94%的全连接层参数都可以去掉,影响不大;学习特征的主要是卷积层。

    BBR:最后通过对模型的输出进行分析,作者还发现简单的bounding box regression方法可以显著减少错误定位。


模型细节

    RCNN的目标检测系统由三部分组成:产生region proposals;CNN从region proposals中抽取特征;SVM用于将特征向量分类。

1.Region proposal

    产生Region proposal的方法有很多,包括:objectness,  selective search,  category-independent object proposals,  constrained parametric min-cuts(CPMC),  multi-scale combinatorial grouping,  Ciresan 等。这里使用的是SS方法,有关SS算法可以翻阅《选择性搜索(SS)算法》。

2.Feature extraction

    使用AlexNet抽取每个region Proposal 的特征向量。AlexNet输入是减去训练集均值的227x227的rgb图像。因此每个region proposal需要缩放至227x227x3。这里缩放的方法是直接warping(扭曲)至227x227。在warping之前,拓展bounding box的边界使其在warping之后有p=16个像素的margin。warping之后的图片如下:

8.png

3.SVM

    测试阶段,先在图片上运行selective search(使用fast mode),产生2000个region proposals。然后warp每个region proposal,传入CNN生成特征向量。接着使用训练好的SVM对抽取的特征进行评分。最后应用NMS,即如果某个region和更高分的region的IoU(intersection-over-union)大于某一阈值的话,则去掉低分的region。

    RCNN有两个比传统方式高效的地方:1.CNN参数对所有分类参数共享;2.CNN计算得到的特征向量是低维的,这意味着SVM的参数不会太多。

    计算proposal和特征提取所需的时间:13s在GPU上,53s在CPU上。而之后是SVM分类和NMS,时间计算依赖于类别数。因为SVM分类就是一个矩形乘法,2000x4096的特征矩阵乘以4096xN的SVM权重,其中N是类别数。

4.训练过程

    有监督预训练(Supervised pre-training):先在ILSVRC2012数据集上进行图片分类训练,这里使用Caffe库的AlexNet。

    特定领域的微调(domain-specific fine-tuning):为了适应新的任务(目标检测)和新的数据集上训练(waped VOC windows),需要对预训练的模型fine tuning,使用SGD,数据集是VOC的warped region proposals。使用预训练的CNN层的权重,重新初始化FC层,VOC数据集有20分类,因此FC的输出有21个(20分类+1背景)。

    对于SS得到region proposal,只有与ground-truth(真实数据)的IoU>=0.5才是正样本postives,其余为负样本(negatives)。

    SGD的初始学习率为0.001,是初始预训练的1/10。训练样本倾向于正样本,因为与背景相比,他们更加罕见。每次SGD迭代的时候,所有分类均匀采样32正样本,96背景样本,所以一个mini-batch是128。

    分类器:比如训练一个二分类器检测车辆,当region中包含一整辆车的时候是正样本,不包含车的时候是负样本。那如果包含一部分呢?方法是计算与ground truth的IoU,当IoU大于某一阈值时为正样本,小于则为负样本。经过对比,这里设置IoU阈值为0.3。

    得到特征向量之后和标签之后,对每一类训练一个线性SVM,采用standard hard negative mining method(难例挖掘)训练分类器。

4.结果

    作者在VOC2007上调参,然后在VOC2012上fine tune CNN和在训练SVM,最终在VOC2010-2012上验证。下面是各个算法在VOC2010上测试的结果:

9.png

    可以看到RCNN相比于传统的目标检测算法性能大幅提升。


CNN可视化

    这里提出一个简单无参数的方法之间显示网络学到了什么。主要思想是从特征图中挑选出特定unit作为目标检测器。方法是这样的:先数据集中所有抽取出来的proposal region(大约1000万),计算每个proposal region对应某层输出特征图的通道的激活值,然后按激活值对这些region进行排序,然后进行最大值抑制,最后展示激活值最高的若干个区域。

    可视化第5个池化输出特征图,维度是6x6x256=9216,每个unit对应原始227x227图片中的195x195个像素。下图中的每一行显示了CNN中pool5特征图某通道的前16个激活,模型在VOC 2007上fine tuning:

 10.png

    从上图可以看到,每个卷积通道学习到的特征是不一样的。比如第二行学习到的就是狗和点的阵列,第三行学习到的是红色斑点。卷积网络似乎学到了一些类别调优相关的特征,这些特征都是形状、纹理、颜色和材质特性的分布式表示。而后续的fc6层则对这些丰富的特征建立大量的组合来表达各种不同的事物。


Ablation studies(消融研究)

    ablation study 就是为了研究模型中所提出的一些结构是否有效而设计的实验。如你提出了某某结构,但是要想确定这个结构是否有利于最终的效果,那就要将去掉该结构的网络与加上该结构的网络所得到的结果进行对比,这就是ablation study。(控制变量法)

Performance layer-by-layer, without fine-tuning: 为了了解哪一层是影响模型性能的关键,作者在VOC 2007上对模型的最后几层进行分析。作者首先分析没有fine tuning的模型。下表是总的测试结果:

  11.png

从上表中可以看到,FC7的特征泛化性能差于FC6的,也就是说FC7可以去掉,而且去掉F6结果也还行。去掉FC层可以省掉大部分参数。

Performance layer-by-layer, with fine-tuning:从Table2的4-6行中可以发现,fine-tuned对FC层的提升很大,而对ConvNet的提升不大,表明卷积层学到的主要是通用特征。

Comparison to recent feature learning methods:RCNN的特征提取方法优于传统的方法。


Detection error analysis

    应用检测分析工具[Diagnosing error in object detectors]去分析RCNN的误差,理解fine-tuning如何提升模型。相关结果:

12.png

13.png


RCNN用于语义分割

    (对语义分割不了解。。。略)


结论

    RCNN开创了目标检测的新时代。



参考文献

[1]Ross Girshick,etc .Rich feature hierarchies for accurate object detection and semantic segmentation

[2] 理想几岁. 目标检测模型的性能评估--MAP(Mean Average Precision). https://www.cnblogs.com/zongfa/p/9783972.html.2018-09-03

[3] 计算机视觉life. 目标检测综述. https://blog.csdn.net/electech6/article/details/95240278. 2019-07-09

[4] v1_vivian. R-CNN论文详解(论文翻译). https://blog.csdn.net/v1_vivian/article/details/78599229. 2018-05-08

[5] 热带巨兽. 图像处理中的hard negative mining(难例挖掘). https://blog.csdn.net/qq_36570733/article/details/83444245. 2018-10-27

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于