R-CNN论文详细解读

R-CNN是13年https://arxiv.org/abs/1311.2524的论文。对计算机视觉的影响很大!

基础知识掌握:

①先来简单区分计算机视觉的任务:

R-CNN论文详细解读_第1张图片

简单来说,分类(classify)、定位(localization)和检测(detection)的区别如下: 
classify:是什么? 
localization:在哪里?是什么?(单个目标) 
detection:在哪里?分别是什么?(多个目标)

 

②物体检测算法中常用到的几个概念:Bbox,IoU,非极大值抑制

Bounding Box(bbox):

bbox是包含物体的最小矩形,该矩形既不太大以至于留出太多非物体空间,也不太小以至于没包住物体。

物体检测中关于物体位置的信息输出是一组(x,y,w,h)数据,其中x,y代表着bbox的左上角(或者其他固定点,可自定义),对应的w,h表示bbox的宽和高.一组(x,y,w,h)可以唯一的确定一个定位框。

Intersection over Union(IoU):

对于两个区域R和R′,则两个区域的重叠程度overlap计算如下:
O(R,R′)=|R∩R′| / |R∪R′|

在训练网络的时候,我们常依据侯选区域和标定区域的IoU值来确定正负样本。

非极大值抑制(Non-Maximum Suppression又称NMS):

非极大值抑制(NMS)可以看做是局部最大值的搜索问题,集通过IOU计算分数最高的框,然后计算与刚刚最高分数那个框有太多重合的部分的框都去掉,这样就可以去掉那些不准确的框。

 

有了基础知识,下面来介绍R-CNN的内容:

 

R-CNN论文详细解读_第2张图片

如上图所示,R-CNN这个物体检查系统可以大致分为四步进行:
1、获取输入图像,提取约2000个候选区域

2、将候选图片进行缩放

3、将候选区域分别输入CNN网络

4、将CNN的输出输入SVM中进行类别的判定

5、将特征输入训练好的线形回归器中,得到更为精确的位置定位

 

上述五个步骤是一个大致的过程,而且是一个检测的过程,实际上训练过程比较麻烦,下面开始详细介绍。

一、候选区域的提取

近来有很多研究都提出了产生类别无关区域推荐的方法。比如: objectness(物体性),selective search(选择性搜索),category-independent object proposals(类别无关物体推荐),constrained parametric min-cuts(受限参最小剪切, CPMC),multi-scal combinatorial grouping(多尺度联合分组),以及Ciresan等人的方法,将CNN用在规律空间块裁剪上以检测有丝分裂细胞,也算是一种特殊的区域推荐类型。由于R-CNN对特定区域算法是不关心的,所以我们采用了选择性搜索(selective search以方便和前面的工作进行可控的比较。

选择性搜索知识可以看这篇文章

 

二、缩放候选区域

特征提取(Feature extraction) 
我们使用Krizhevsky等人所描述的CNN的一个Caffe实现版本对每个推荐区域抽取一个4096维度的特征向量把一个输入为277*277大小的图片,通过五个卷积层和两个全连接层进行前向传播,最终得到一个4096-D的特征向量。读者可以参考AlexNet获得更多的网络架构细节。 
为了计算region proposal的特征,我们首先要对图像进行转换,使得它符合CNNC的输入(架构中的CNNC只能接受固定大小:277*277)。这个变换有很多办法。看下面

缩放分为两大类(该部分在原文附录A):

1)各向同性缩放,长宽放缩相同的倍数

  • tightest square with context:
    把region proposal的边界进行扩展延伸成正方形,灰色部分用原始图片中的相应像素填补,如下图(B)所示
  • tightest square without context:
    把region proposal的边界进行扩展延伸成正方形,灰色部分不填补,如下图(C)所示

2)各向异性缩放, 长宽放缩的倍数不同
不管图片是否扭曲,长宽缩放的比例可能不一样,直接将长宽缩放到227*227,如下图(D)所示

R-CNN论文详细解读_第3张图片

最后发现候选框周围加上16的padding的效果最好。所以作者选择了候选框周围加上16的padding,再进行各向异性缩放

 

三、测试方法

测试时其实分两个结果
1.分类
在测试的时候,先对带检测图像提取出约2000个候选区域,将每个区域都进行缩放,然后将缩放后的图片输入CNN进行特征提取,对CNN输出的特征用SVM进行打分(每类都有一个SVM,21类(20个分类+背景1个=21个)就有21个SVM分类器),对打好分的区域使用NMS即非极大值抑制(每类都单独使用)。

到这里分类就完成了,但是得到的位置只是候选区在图像中的位置,而候选区的位置并不一定就是ground truth,即检测目标的真实位置

2.定位(回归)
将CNN对候选区域提取出的特征输入训练好的线形回归器中,得到更为精确的位置定位,具体情况会在下面训练方法中详细介绍。但要明确的是,这些回归器是按照类来训练的,即每类分类完后进行回归。

 

四、训练方法

1、有监督的预训练
预训练采用了Caffe的CNN库。训练的时候,文章用了个trick,他先用ILSVRC2012数据库训练Alexnet,训练的时候目标时图片分类,因为ILSVRC2012数据库没有分类的标定数据。这步称为预训练

 

2、fine-tuning

为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口)。我们只使用变形后的推荐区域对CNN参数进行SGD训练。我们替换掉了ImageNet专用的1000-way分类层,换成了一个随机初始化的21-way分类层,(其中20是VOC的类别数,1代表背景)而卷积部分都没有改变。我们对待所有的推荐区域,如果其和真实标注的框的IoU>= 0.5就认为是正例,否则就是负例。SGD开始的learning_rate为0.001(是初始化预训练时的十分之一),这使得调优得以有效进行而不会破坏初始化的成果。每轮SGD迭代,我们统一使用32个正例窗口(跨所有类别)和96个背景窗口,即每个mini-batch的大小是128。另外我们倾向于采样正例窗口,因为和背景相比他们很稀少。

微调(fine-tuning)是当数据量不够的时候,常用的一种训练方式,即先用别的数据库训练网络,然后再用自己的数据库微调训练。

 

3、目标种类分类器

思考一下检测汽车的二分类器。很显然,一个图像区域紧紧包裹着一辆汽车应该就是正例。同样的,没有汽车的就是背景区域,也就是负例。较为不明确的是怎样标注哪些只和汽车部分重叠的区域。我们使用IoU重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值我们选择了0.3,是在验证集上基于{0, 0.1, … 0.5}通过网格搜索得到的。我们发现认真选择这个阈值很重要。如果设置为0.5,会降低mAP5个点,设置为0,就会降低4个点。正例就严格的是标注的框。

一旦特征提取出来,并应用标签数据,我们优化了每个类的线性SVM。由于训练数据太大,难以装进内存,我们选择了标准的hard negative mining method难负例挖掘算法,用途就是正负例数量不均衡,而负例分散代表性又不够的问题,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到你的成绩不再提升为止.这一个过程就叫做’hard negative mining‘)

①在fine-tunning和SVM训练这两个阶段,作者定义得正负样例是不同的

因为在训练SVM时,正样本为groundtruth,负样本定义为与ground truth的IoU小于0.3的候选区域为负样本,介于0.3与0.7之间的样本忽略。
fine-tuning是担心过拟合的原因,要扩大正样本的样本量,所以定义比较宽松,但是SVM是最终用于分类的分类器,而且SVM原理就是最小的距离最大化,越难分的数据越有利于SVM的训练,所以对样本的定义比较严格。

为什么单独训练了一个SVM而不是直接用softmax呢

因为在训练softmax的时候数据本来就不是很准确,而SVM的训练使用的是hard negative也就是样本比较严格,所以SVM效果会更好。

 

4、回归器训练
回归器是线性的,输入为Alexnet pool5的输出。
bbox回归认为候选区域和ground-truth之间是线性关系(因为在最后从SVM内确定出来的区域比较接近ground-truth,这里近似认为可以线性关系)

训练回归器的输入为N对值,,分别为候选区域的框坐标和真实的框坐标,下面在不必要时省略i。这里选用的Proposal必须和Ground Truth的IoU>0.6才算是正样本。

从候选框P到预测框的基本思路如下:

因为我们在分类之后得到候选框P ,其中和为候选框的中心点,和为候选框的宽高,下面介绍中所有框的定位都用这种定义,即x和y表示中心点坐标,w和h表示框的宽高。知道候选框的表示,那么只要估计出出候选框与真实框的平移量和尺度缩放比例,就可以得到我们的估计框了

1)先求平移量(Δx,Δy)

Δx= , Δy=

即R-CNN论文里面的:
,

2)算尺度放缩量

我们要学习的是这四个变换,就可以得到估计框了。

这四个变换可以用下列公式表示:

上式中为Alexnet pool5输出的特征,所以要求这四个变换,只需求出即可。

该回归器的损失函数为:

上式中的可以通过如下公式求出:




所以通过输入的特征值训练,从而求出,就可以得到回归器

 

参考https://www.jianshu.com/p/5056e6143ed5

 

 

 


 

 

 

你可能感兴趣的:(深度学习)