Faster R-CNN原理

R-CNN -> Fast R-CNN -> Faster R-CNN

一、R-CNN(Region with CNN feature)

R-CNN是利用深度学习进行目标检测的开山之作。

RCNN算法流程可分为4个步骤:

  1. 一张图像生成1K~2K个候选区域(使用Selective Search算法);
  2. 对每个候选区域,使用深度网络提取特征(这里的深度网络就是图片分类网络);
  3. 特征送入每一类的SVM分类器,判别是否属于该类;
  4. 使用回归器精细修正候选框位置。

Faster R-CNN原理_第1张图片

1.候选区域的生成

利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含可能的物体。

比如下方这张图,对这张图使用Selective Search算法,就可以得到一些矩形框,这些矩形框当中就可能包含了所需要检测的目标。

Faster R-CNN原理_第2张图片

 2.对每个候选区域,使用深度网络提取特征

将2000候选区域缩放到227 X 227pixel,接着将候选区域输入事先训练好的AlexNet CNN网络获取4096维的特征得到2000 X 4096维矩阵。

在将候选框输入到CNN网络之前,首先要进行处理,缩放到227 X 227的大小,之后放到图像分类网络(CNN)得到特征向量。

Faster R-CNN原理_第3张图片

3.特征送入每一类的SVM分类器,判别类别 

将2000 X 4096维特征与20个SVM(SVM分类器是一个二分类的分类器)组成的权值矩阵4096 X 20相乘,获得2000 X 20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000 X 20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。 

以其中一个特征向量为例,将这个向量(其实是一个行向量)分别输入到SVM分类器中,得到分数。

Faster R-CNN原理_第4张图片

最左边是2000 X 4096的特征矩阵,每一行就是一个候选框通过CNN网络得到的一个特征向量(2000个候选框,所以有2000行);中间的就是SVM权值矩阵,每一列对应着一个类别的权值向量(这里有20个类别),最右边是概率矩阵。

Faster R-CNN原理_第5张图片

非极大值抑制剔除重叠建议框如何实施?

交并比(IoU):A与B的交集除以A与B的并集

Faster R-CNN原理_第6张图片

 4.使用回归器精细修正候选框位置

对NMS处理后剩余的建议框进一步筛选(保留那些与我们真实标注的目标边界框)。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。

依旧针对CNN输出的特征向量进行预测。

如图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口G^表示Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。

Faster R-CNN原理_第7张图片

Faster R-CNN原理_第8张图片

R-CNN存在的问题:

  • 测试速度慢;(一张图像内候选框之间存在大量重叠,提取特征操作冗余)
  • 训练速度慢;
  • 训练所需空间大。

二、Fast R-CNN

同样使用VGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66%。

Fast R-CNN算法流程可分为3个步骤:

  1. 一张图像生成1K~2K个候选区域(使用Selective Search方法);
  2. 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵;
  3. 将每个特征矩阵通过ROI pooling层缩放到7 X 7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。

Faster R-CNN原理_第9张图片

R-CNN中依次将候选框区域输入到卷积神经网络得到特征,假设有2000个候选框,就要2000次正向传播,存在大量冗余;Fast R-CNN将整张图象送入网络。 

Faster R-CNN原理_第10张图片

关于数据采样,并不是去使用SS算法提供的所有的候选区域(SS算法得到2000个候选框),而是使用其中的一小部分。

训练数据的采样还分为正样本和负样本,正样本就是候选框中确实存在的所需检测目标的样本,负样本可以理解为背景,即里面没有所需检测目标。将训练数据分为正样本和负样本的原因是为了平衡?如果样本全部都是正样本的话,网络会认为候选区域是所需要检测的目标。(就比如说我现在要弄一个猫狗的分类器,但我的样本全是猫的,这样就不太合理)

在原论文中,对于每张图片,是在2000个候选框当中采取64个候选区,这64个候选区当中的一部分是正样本,一部分是负样本。正样本的定义方式是:只要候选框与真实目标边界框的IoU值大于0.5就认定为正样本。

Faster R-CNN原理_第11张图片

Faster R-CNN原理_第12张图片

将一个图像直接输入到CNN网络中,得到它的特征图,根据它的映射关系,找到每一个候选区域的特征矩阵,将这些矩阵通过Rol Pooling层统一缩放到相同的尺寸。之后进行展平处理,通过两个全连接层得到Roi feature vector,再并联两个全连接层(一个用于目标概率的预测,一个用于边界框回归参数的预测)。

下图是目标概率预测分类器,对应虚线框所框选的部分。这个概率是经过softmax处理之后的,所以它是满足概率分布的,即和为1。

Faster R-CNN原理_第13张图片

下图是边界框回归器,对应虚线框所框选的部分,也是一个全连接层。

Faster R-CNN原理_第14张图片

Faster R-CNN原理_第15张图片

Fast R-CNN的损失如何计算?

Faster R-CNN原理_第16张图片

Faster R-CNN原理_第17张图片

分类损失为什么等于-logPu?如下图,Oi*只有再正确的索引位置是等于1的,其他位置上都是等于0的,0乘以任何数都等于0,所以可以将0的位置全部省去,最后只剩下一项,即真实标签索引的那一项。假设真实标签的one-hot编码是:[0,0,...,1,...,0] ,预测的softmax概率为[0.1,0.3,...,0.4,...,0.1],那么Loss = -Log(0.4)

Faster R-CNN原理_第18张图片

艾弗森括号: 可以理解为一个计算公式,当u>=1的时候,这一项等于1,其他情况等于0。

怎么理解艾弗森括号?u代表的就是目标的真实标签,u>=1就说明候选区域确实属于所需检测的某一类别当中,对应着正样本,采取边界框回归损失。当u不满足>=1,对应当前候选区域是负样本,背景,没有边界框回归损失这一项。

Faster R-CNN原理_第19张图片

Faster R-CNN原理_第20张图片

Fast R-CNN的速度瓶颈在SS算法上。 

三、Faster R-CNN

Faster R-CNN使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。

Faster R-CNN算法流程可分为3个步骤:

  1. 将图像输入网络得到相应的特征图;
  2. 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵;
  3. 将每个特征矩阵通过ROI pooling层缩放到7 X 7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。

Faster R-CNN原理_第21张图片

用RPN(Region Proposal Network)代替SS算法。 

特征图上使用一个滑动窗口,在feature map上进行滑动,每滑动到一个位置上,就生成一个一维向量。在这个向量的基础上,再通过两个全连接层分别输出我们的目标概率以及边界框回归参数。

2K scores是针对每一个anchor生成两个概率,一个是为背景的概率,一个是为前景的概率,所以K个anchor就会生成2K个scores。

针对每一个anchor生成4个边界框回归参数,所以是4K coordinates。

256是因为以ZF网络作为backbone时所生成的特征图的深度是等于256的,如果使用的是VGG16的话,就应该是512。所以一维向量元素的个数是根据我们所使用的backbone它的输出特征矩阵的深度来确定。

Faster R-CNN原理_第22张图片

什么是anchor?对于特征图上的每一个3 X 3的滑动窗口,首先计算它的中心点(也就是特征图上的这个中心点在原图上对应的一个位置。怎么找这个位置?首先将原图的宽度除以特征图的宽度,取整得到一个步距,X坐标就等于步距乘以特征图上这一点的X坐标;同理它的Y坐标通过将原图的高度除以特征图的高度,取整得到一个步距,再乘上特征图上这一点的Y坐标得到),再以这个点为中心去计算出K和anchor box(这里的anchor box都是给定的大小及长宽比例)

Faster R-CNN原理_第23张图片

2K scores和4K coordinates究竟是怎么影响的呢?假设cls是所生成的2K scores(两个两个为一组,因为每一个对应的是一个anchor为背景或前景的概率),reg是生成的4K coordinates(四个四个为一组)

为什么要给出这么多不同比例以及不同尺寸的anchor呢?因为我们所需检测的目标的大小肯定是不一样的,而且每个目标它的长度比也是不一样的,所以需要一系列的anchor来预测目标的一个位置。

Faster R-CNN原理_第24张图片

论文中给出的一些数据:

Faster R-CNN原理_第25张图片

也就是说实际上我们在每个地方都会生成九个anchor。

虽然感受野不完全比预测尺度大(171小于256和512),但不代表着不能预测相应边界框的样式。通过经验的话,看到一个物体的一部分,其实是能够大概猜出这个目标完整的一个位置的区域的。

同样在训练数据的采样中也包含正样本和负样本。

正样本是如何定义的?

  • 与所标注的准确的目标边界框的IoU值超过0.7;
  • anchor/anchors with the highest Intersection-over-Union(IoU) overlap with a ground-truth box

负样本的定义是针对某一anchor它与所有ground-truth的IoU都小于0.3。

损失同样包括两部分,一个是分类损失,一个是边界框回归损失。

Faster R-CNN原理_第26张图片

 多分类的交叉熵损失。

Faster R-CNN原理_第27张图片

 二分类的交叉熵损失。

Faster R-CNN原理_第28张图片

边界框回归损失 

Faster R-CNN原理_第29张图片

Faster R-CNN原理_第30张图片

Faster R-CNN原理_第31张图片

你可能感兴趣的:(基础理论学习,cnn,人工智能,神经网络)