一、概述
- faster RCNN与fast RCNN是一脉相承的。fast RCNN解决了RCNN计算量大、效率低的问题(RCNN需要将通过selective search算法生成的proposal挨个送入卷积神经网络提取特征)。但是fast RCNN也存在一个问题:在检测阶段,fast RCNN仍需要使用selective search算法生成proposal,这个操作本身就非常耗时,导致fast RCNN难以应用于实际问题。
- faster RCNN在fast RCNN网络的基础上,添加了一个被称之为RPN(Region proposal network)的网络,这也是faster RCNN最大的贡献。该网络的添加使faster RCNN在检测时所需要的时间大幅度缩减。也正是faster RCNN的出现,各类有关目标检测的应用才蓬勃兴起。
二、整体框架
faster RCNN网络由两部分组成:
- RPN网络:该网络用于生成proposals(候选区域),输入是由前面的卷积神经网络得到的feature maps,输出是生成的proposals的边框位置。RPN与前面的卷积神经网络构成了一个可进行端到端(end to end)训练的网络,其内部实现方式使用了anchor(由faster RCNN首次提出)的概念
- fast RCNN:该网络就是fast RCNN论文中的网络。通过RPN网络得到proposals,这些proposals的位置作为fast RCNN的输入。可以看到,RPN网络和fast RCNN网络共享了前面的卷积层。
三、网络结构
上图是faster RCNN的详细网络结构,分成两部分讲解:
- 特征提取网络(feature extraction)
- RPN网络
1 特征提取网络
上图中的特征提取网络为VGG16。输入图像的尺寸为PxQ(faster RCNN支持任意尺寸的输入图像),进入网络前将其尺寸调整为MxN,如可设定图像短边不小于600,长边不大于1000,即令M=600,N=1000,如果图片小于该尺寸,可边缘补零。
- 13个卷积层:kernel_size=3,pad=1,stride=1;卷积公式如下,依据卷积公式,这13个卷积层并不会改变图像的大小
- 13个relu层:激活函数,并不会改变图像大小
- 4个pooling层,kernel_size=2,stride=2;pooling层会让输出图片是输入图片的1/2
经过特征提取网络,输入图片大小变成(M/16)x(N/16),即:60x40(1000/16≈60, 600/16≈40);feature maps的尺寸为60x40x512(注:faster RCNN采用了两种卷积神经网络,VGG16对应的输出尺寸为60x40x512,ZFnet是60x40x256)
2 RPN网络
在讲解RPN网络前,有必要先对anchor这个概念进行介绍
2.1 anchor
anchor这个词的中文含义是“锚”:轮船靠岸停泊时为了防止飘走,需要向海里下巨锚,也算是对这种技术比较形象的描述了。下面是对这种技术的解释:
- 对于一张图像,输入网络后,经过rpn网络的3x3的卷积层,得到了feature maps,然后使用尺寸为3x3的滑窗在feature maps上滑动(如下图橙色方框所示)
注1:为什么要在RPN网络中加入一个3x3的卷积层?在网上找到了一个解释(见下面),但是我并不是很认可这个说法,可能只是单纯加深一下网络层次,让rpn网络的效果更好。有时间的话,可以验证一下。
点击此处,得到答案
- 对每一个由滑窗得到的3*3的窗格,其中心是一个anchor(由feature maps的每一层的相同位置的元素构成,也就是说,anchor是一个长条),MxN的feature maps,共有MxN个anchor。每个由滑窗得到的窗格都可以在原输入图像上映射出一块区域,示意图如下。接下来就要基于anchor在输入图像上生成anchor box了。
这里图画的有问题,从feature map向原图映射时,是对feature map的一个像素点进行映射,不是将所在3*3区域进行映射
-
首先设置参数,base_size=16,这个参数的意思是得到一个16x16像素的方框,然后在保持面积不变的情况下对该方框进行变形,生成三个新的方框,其长宽比分别为2:1,1:1,1:2,如下图所示
-
接着再分别对生成的三个方框进行变换:分别将每一个方框的变成扩大8倍,16倍,32倍,共得到9个方框。例如,对16x16的方框,扩大后得到三种方框,其边长分别是128x128(8倍),256x256(16倍),512x512(32倍),其它同理。
-
我们现在明白了,对每一个anchor,都会在原图上生成9个anchor box,并且这9个anchor box都是映射区域的中心为中心,如下图所示
-
那么对尺寸MxN大小的feature maps,会生成多少个anchor box呢,答案是MxNx9个,这是因为,滑窗在MxN的feature maps上滑动时,会以feature maps上的每个像素点为中心,共生成MxN个3x3的区域(边缘补零),也就是MxN个anchor,每个区域都映射回原图像得到9个anchor box,共MxNx9个
-
讲到这里,大家对anchor及anchor box是如何生成的想必已经完全了解了,接下来就该讲解RPN网络了
2.2 RPN网络详细介绍
- 此处还是延续本小结第一部分的例子。经过RPN网络的3*3的卷积层之后,feature maps的尺寸仍为60x40x512。然后分为两条支路分别对feature maps进行处理。
- 如上图所示,对支路①rpn_cls:对features maps中的每一个anchor的9个anchor box,使用2个1x1x512的卷积核进行卷积,得到两个score,这两个score分别表示该anchor box包含物体和不包含物体的得分。9个anchor box共有18个得分。
- 对支路②rpn_bbox:对feature maps中的每一个anchor的每个anchor box,使用4个卷积核进行卷积,得到四个数值,这四个数值分别代表原anchor box坐标信息的回归值,9个anchor box共得到36个数值(请联系上图进行理解)
注2:每个anchor box得到的四个值实际上是anchor box相对于ground truth的偏移量,具体可参见原文,此处不再赘述
四、训练网络
1 RPN网络的训练
- RPN网络用来生成proposals,然后将其交给fast RCNN网络进行处理
- 在训练RPN网络时,采用mini-batch的方式进行训练。一个mini-batch中的样本全部取自一张图片的anchor box。一个mini-batch中包含256个anchor box,正、负标签的anchor box各占一半,若负的标签的anchor box不够,则用正的标签的anchor box补充,反之。mini-batch中的正负样本分别随机选取。
- anchor box的标注规则是:①在与一个ground truth发生部分重叠的anchor box中,选择IoU最大的那个anchor box,将其标注为正类;②在与一个ground truth发生部分重叠的anchor box中,选择所有IoU超过0.7的anchor box,将其标注为正类(只采用第二种标记方式,有可能没有正类anchor box);③在与一个ground truth发生部分重叠的anchor box中,将所有IoU低于0.3的anchor box标记为负类;④其它的anchor box不参与训练
- RPN网络在训练时采用多任务训练的方式,目标函数中同时包含了anchor box的分类与回归。目标函数如下:
上式分为两部分,第一部分计算分类误差,第二部分计算回归误差。计算分类误差时,p_i为一个anchor box为正类的概率,p*_i为该anchor box的ground truth,取值为0或1,采用二分类log loss,求和号的意思是对所有anchor box的log loss累加求和;计算回归误差时,t_i表示预测的anchor box的位置,t*_i表示与anchor box相关的ground truth的位置(实际均为偏移量),L_reg实际上是计算t_i和t*_i的距离,被称之为smooth L_1,在对所有的anchor box计算出的误差求累加和时,只只算正类anchor box的累加和(这就是L_reg左侧乘以p*_i的原因)。
系数部分,N_cls的取值为mini-batch中anchor box的数量,N_cls=256;N_reg为一张图片对应的anchor的数量,其数值约为2400;为了保证两部分loss前的系数尽可能相同,令lamda=10
注3:对于feature maps上一块3*3的区域,我们生成了9个大小不同的anchor box,每个anchor box都有一个独立的坐标回归器(独立的卷积核),这就保证了RPN网络的多尺度检测能力
注4:至于为什么搭个网络、设置个误差函数、训练一下,然后就work,我想这就是卷积神经网络的不可解释性。
2 网络整体的训练
作者注意到,此时为止,RPN网络和fast RCNN网络的训练是独立的,但是显然,这二者的训练密不可分。因此,作者设置了几种共享计算的训练方式:
- 交替训练:首先单独训练RPN网络。训练完成后,将输入图像送入RPN网络,生成proposal(既有包含目标的正类样本,又有不包含目标的负类样本),然后将proposal作为输入数据,训练fast RCNN网络。fast RCNN网络训练完成后,再训练RPN网络,训练时固定两个网络共享的卷积层的参数,只训练RPN网络单独的部分。如此交替进行。论文中的实验均采用这种训练方式
- 联合训练(有缺陷):将RPN网络和fast RCNN网络看作一个整体进行训练。在每一轮迭代时,RPN网络前向传播产生proposal,然后将这些proposal直接送入fast RCNN;反向传播时,分别将RPN网络和fast RCNN网络的误差各自回传,在二者共享的卷积层,将两者误差叠加。这种联合训练的方式是有缺陷的,其缺陷在于,将RPN网络生成的proposal送入fast RCNN后,由fast RCNN计算出的误差包含分类误差和回归误差,反向传播时,回归误差也应该向RPN网络传递,然而这种训练方式并没有考虑这部分的误差
- 联合训练(改进):在上述训练方式的基础上,作者在fast RCNN中采用一种叫做RoI warping layer的方式,解决了fast RCNN向RPN反向传播回归误差的问题
注4:第二、三种训练方式是我对原论文的理解,有可能不对,各位自行斟酌
3 实际操作时的训练方式(4个步骤)
- 先训练RPN网络,训练时使用imageNet模型初始化RPN网络的参数
- 再训练fast RCNN网络,训练时也使用imageNet初始化模型参数,并以RPN网络产生的proposal作为输入
- 再训练RPN网络,此时用上步fast RCNN卷积层的参数初始化RPN网络卷积层的参数,也就是说,此步训练时,只fine tune RPN单独的网络层次,此时RPN网络和fast RCNN网络共享卷积层
- 最后,再固定fast RCNN网络的卷积层参数,fine tune后面的层次
- 重复三四步训练,直到满足一定条件