Faster R-CNN 理论原理

Faster R-CNN 理论原理

一、Faster R-CNN介绍

在b站看到一位大神up主发布的CNN原理和代码的教学视频,发现非常有帮助,于是将他所讲的内容总结了下来供大家学习讨论。

下面是up的视频、代码、博客的连接:

b站视频链接:https://space.bilibili.com/18161609/channel/index
github代码和PPT:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
up主的CSDN博客:https://blog.csdn.net/qq_37541097/article/details/103482003

引言

Faster R-CNN原论文:

Ren S, He K, Girshick R, et al. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2017, 39(6): 1137-1149.

Faster R-CNN是作者Ross Girshick在Fast R-CNN后的又一力作。同样使用VGG16作为网络的backbone,包含候选区域的生成下的推理时间达到5fps也就是1秒检测5张图片(GPU),准确率也有一定提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。

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

二、Faster RCNN算法步骤

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

网络推理流程:

如上图,对于已经训练好的Faster R-CNN网络,要检测一张任意P·Q大小的待检测图片步骤如下:

1.首先将其reshape成CNN特征提取网络的固定输入大小M·N;

2.将上一步的输出输入CNN特征提取网络(VGG16或者ZF),经过若干卷积层和池化层得到整个图像的特征图片Feature Map(Feaure Map深度:VGG16 512维,ZF 256维);

3.将Feature Map输入FPN层,获得若干候选框;

4.Feature Map与候选框相对应获得相应的候选框特征矩阵,再将其输入到Rol pooling层缩放至7X7的特征图,接着将特征图展平通过一系列全连接层得到每个候选框的类别预测概率;

5.将候选框按照框回归参数进行调整,然后按照非极大抑制的方法去除重复框,输出预测结果。

网络训练流程:

Faster CNN网络的训练,需要在已经训练好的网络模型上(VGG,ZF等)的继续进行训练。将Faster R-CNN看作是两个独立的训练结构,即对RPN结构和Fast R-CNN结构分别交替进行训练(实际上只需要分别交替训练两次即可,因为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了)。步骤如下:

1.首先用ImageNet数据集对VGG16模型(ZF)进行预训练,预训练是进行有监督的分类的训练;

2.在已经预训练好的VGG16模型上,训练RPN网络,RPN网络的输出是当前网络对于某个anchor预测为前景还是背景的概率,以及该anchor的框回归参数。它们的定义以及对应标签的获得将在第三部分详细介绍;

3.对于第一次训练好RPN的Faster R-CNN网络,输入训练集经过RPN得到候选框特征图,然后对Fast R-CNN进行训练(只训练Fast R-CNN部分RPN参数保持不变);

4.对于第一次训好的Fast R-CNN的Faster R-CNN网络,继续输入训练集第二次训练RPN网络(Fast R-CNN部分保持不变);

5.对于第二次训练好RPN的Faster R-CNN网络,输入训练集经过RPN得到候选框特征图,然后对Fast R-CNN进行第二次训练(RPN参数保持不变)。

网络结构:

如下图所示,Faster R-CNN与Fast R-CNN的区别就在于将候选框提取的SS算法换成了效率更高的RPN算法。

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

三、RPN结构详解

上一章已经详细介绍了Fast R-CNN的理论原理,所以本章只需要将RPN结构解释了,Faster R-CNN就基本讲完了。

3.1 RPN网络结构

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

RPN网络完整结构如上图,推理过程如下:

1.RPN的输入是由CNN特征提取网络得到的输入数据的Feature Map,首先经过一个padding为1,步距为1,卷积核个数为1的3X3卷积,再进行relu函数处理得到第一层的输出;

2.由Feature Map的每一个像素点按照相似原理在原图上分别计算k个anchor,获取所有anchor的位置和大小;

3.将第一层的输出分别传入上下两层。上层用于计算每个像素点所对应的anchor是前景和背景的概率(2k),并忽略跨越边界的anchor。下层用于计算每个像素点对应anchor的框回归参数(4k)。下层输出再输入上层后,调整anchor的位置,然后基于anchor的前景得分用非极大抑制的方法得到候选区域。(上下两层会在输出结果那一层计算分类损失和框回归损失,用于RPN网络的训练)

4.最后将候选框传入Rol pooling层,与Feature Map相对应得到候选框的特征矩阵。

3.2 anchor的计算:

什么是anchor?

对于CNN网络特征提取后生成的Feature Map中的每一个像素都可以看作是原始图像中的某一个突出的特征,Feature Map上每一像素点在原始图像上按照相似原理都能找到对应的点一个点,而该点的k个anchor就是包含这个点的k个不同大小的领域。其意义就是,在某突出特征的点的领域很可能就是目标存在的区域。

如何找到Feature Map关于原始图像的对应点?

例子:如下图所示,对于特征图上的每一个像素点,都可以通过相似找到原图上一个对应的点。如右特征图上点坐标为(3,3),原图与特征图的比例stride(x)=[W/w],stride(y)=[H/h],其中[]代表取整,计算得stride(x)=2,stride(y)=2,所以原图对应的点的坐标是(3·stride(x), 3·stride(y))=(6,6)。

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

anchor的大小如何确定?

不同尺度,形状的anchor更能够由机会覆盖完整的目标。所以如下图所示,在原文中根据经验所得一般设置三种尺度(面积)的anchor( 12 8 2 128^2 1282, 25 6 2 256^2 2562, 51 2 2 512^2 5122),然后每种尺度再划分三种长宽比例(1:1,1:2,2:1),所以原文一个像素点使用k=9个anchor,具体尺度和比例可以根据输入大小以及目标大小根据实验调整。

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

3.3 3X3卷积的作用:

如下图左,RPN网络从输入Feature Map后进行的第一个操作就是3X3卷积。图右可以看到,3X3卷积核通过滑动窗口遍历每一个特征图像素,每计算一次就会生成一个深度为256的一维向量(因为原文使用的ZF网络,在CNN特征提取网络最后的输出深度为256,若使用VGG16网络深度为512,这个向量里蕴含了该像素点对应原图k个anchor的特征信息),然后再将该向量输出到分类层和框回归层计算结果。

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

这里卷积核的参数是大小为3X3,步距为1,padding为1,卷积核个数为1。这么构造卷积核主要有两个作用:

首先padding=1,步距=1的1个3X3卷积核可以完整的一次遍历特征矩阵的每一个像素(3X3网络的中心位置),并且卷积操作后矩阵大小不发生改变,相当于是在遍历特征矩阵给每一个像素找原图对应的anchor,然后把每一个像素对应anchor的特征信息再次整合到新的特征矩阵中(原来特征矩阵的一个像素的所有anchor的特征信息对应一个深度为256的一维向量(新特征矩阵的一个像素));

第二个作用在于3X3卷积核对应原图的感受野,对于ZF网络这里的一个3X3区域对应原图的感受野为171(面积),对于VGG网络一个3X3区域对应原图的感受野为228(这里不再讲解感受野的计算了,大家可以参考VGG网络中感受野的介绍自行计算)。而前面我们提到,特征图每一个像素点都会对应原图生成k个anchor,那么这k个anchor的特征是怎么在RPN网络里体现的呢?答案就是通过感受野。因为3X3卷积核刚好可以遍历特征图的每一个点,而它的感受野就可以代表这个点的k个anchor的特征。但是,anchor的大小和感受野并不相同,原文中有这么一句话如下图,意思就是通过实验证明了感受野小的区域可以一定程度上代表包含这个感受野的大区域的特征,所以这里使用了3X3卷积核。

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

3.4 1X1卷积的作用

前面提到3X3卷积后会生成一个大小不变的的新特征矩阵,它的每一个像素都对应原特征矩阵在原图上的k个anchor的特征信息。

对于上层分类层的1X1卷积,将新特征矩阵经过个数为2k的1X1卷积(卷积后深度变为2k),相当于每一个像素点都会生成2k个数,再经过reshape和softmax层可以直接得到2k个概率(reshape的作用是单独腾出一个维度便于softmax分类,然后再reshape回原来的格式传入下一层),相当于对于k个anchor都生成了预测它为前景和背景的概率(cls),如下图黄框。

对于下层的框回归器层的1X1卷积,同时将新特征矩阵输入个数为4k的1X1卷积核(卷积后深度变为4k),相当于对于k个anchor都生成了它们的框回归参数(reg)(dx,dy,dw,dh)如下图红框。

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

3.5 损失函数的定义

在得到cls概率以及reg框回归参数后,和Fast R-CNN一样,分类输出交叉熵损失Cross Entropy Loss,边框回归输出SmoothL1Loss。为了便于训练网络,RPN网络的总体损失定义如下:

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

注:1. λ \lambda λ是平衡系数,用于平衡分类损失和边界框回归损失。由于在实际过程中,Ncls和Nreg差距过大,用参数λ平衡二者(如Ncls=256,Nreg=2400时设置λ=10),使总的网络Loss计算过程中能够均匀考虑2种Loss;

​ 2. p i ∗ p_i^* pi代表对应的GT预测概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是前景(正样本), p i ∗ p_i^* pi=1;反之IoU<0.3时,认为是该anchor是背景(负样本), p i ∗ p_i^* pi=0;至于那些0.3

分类损失:

对于分类损失,虽然只分了前景和背景两类,但其实原文是按照多分类的交叉熵损失方式定义分类损失的(有的地方使用二分类交叉熵损失,注意区别),定义如下:

在这里插入图片描述

边界框回归损失:

定义和Fast R-CNN、R-CNN中相同,如下:
Faster R-CNN 理论原理_第11张图片

3.6 注意事项

1.anchor数量的问题,按照算法每一个特征矩阵都会生成k个anchor,但实际上是不用使用这么多个anchor的。以一张1000x600x3的输入图像为例,经过CNN特征提取网络(ZF)后生成的Feature Map大小为60X40X256(最后一个维度是深度),那么它一共会产生60X40X9(这里k取9)个anchor(大约2万个),忽略跨越边界的anchor后剩下约6000个。这6000个anchor经过框回归参数调整后得到6000个候选框,然后对于RPNC生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大抑制的方法(IoU设为0.7),最后只剩下约2000个候选框。

2.在进行RPN网络训练时,和Fast R-CNN网络训练一样,不需要用上所有的候选框。原文是在候选框中随机选择256个框用来计算这一小批的损失函数,其中候选框与GT的IoU值定义正例(IoU>0.7)和负例(IoU<0.3)的比例为1:1,正例可以按照IoU值从大到小排序选择。

Faster R-CNN框架总结

Faster R-CNN将目标检测从R-CNN的四部分,Fast R-CNN两部分,变成了一个完整的网络(实际上还是分两阶段,RPN和Fast R-CNN部分交替训练)。引入RPN网络结构,目标检测的速率有了质的飞跃,检测准确率也有一定提升。
Faster R-CNN 理论原理_第12张图片

四、Fast R-CNN存在的问题

1.不适合多尺度、小目标问题的检测
不论使用VGGNet还是ZF网络,其提取到的特征图都是单层的,分辨率都比较小。因此对于那些多尺度、小目标的问题,使用多层融合的特征图或者增大特征图的分辨率都是可以优化的方向。

2.NMS
在RPN产生候选框的时候为了避免重叠的候选框,使用了NMS进行后处理。实际上,该方法对于有遮挡的目标效果很不好,即有可能是两个目标的候选框很可能会被过滤掉一个,因此改进这个NMS模式也是可以带来检测性能提升。

3.RoI Pooling
Faster RCNN的原始RoI pooling两次取整会带来精度的丢失,因此改变这个定位池化或者特征尺度输出的问题也需要改进,后续的Mask RCNN针对这点,提出了RoI Align,提升了精度。

4.检测速度还是不够快
Faster RCNN的RPN和RCNN两阶段分工明确,带来精度提升,但是两阶段的速度明显相较于单阶段是慢的,实际运用并未实时。

你可能感兴趣的:(卷积神经网络的目标检测算法,RCNN,Faster,R-CNN,python,计算机视觉,深度学习,神经网络,机器学习)