R-CNN是目标检测领域中十分经典的方法,相比于传统的手工特征,R-CNN将卷积神经网络引入,用于feature extraction,其后面接入一个分类器判断搜索区域是否包含目标及其置信度,取得了较为准确的结果。Fast R-CNN首先使用了Selective Search的方法提取图像的候选目标区域(Proposal)。
经过R-CNN与Fast R-CNN的发展,Ross B.Girshick在2016年提出了Fater R-CNN的目标检测方法,他提出了RPN(Region Proposal Network)网络来代替Selective Search来进行候选区域提取,其在结构上将特征提取(feature extraction),Proposal Region提取、Bounding Box Regression与classfication都整合在一个网络,使得综合性能有较大提高,在检测速度方面有显著提高。
1 Faster R-CNN模型构造
Faster R-CNN模型主要是由2个模块组成:RPN候选框提取模块以及Fast R-CNN检测模块,如下图所示:其又可以细分为4个部分:Conv Layer、Region Proposal NetWork(RPN)、ROI Pooling、Classification和Regression。
1.1 Conv Layer
卷积层包括一系列Conv+Activation、Pooling等操作,其用于提取图片的特征(Feature extraction),一般直接使用现在的ZF-NET、VGG16,而且卷积层的权重RPN与Fast R-CNN共享,这也能加快训练过程,提升模型的实时性效果。
1.2 RPN(Region Proposal Network)
RPN网络主要用于生成区域候选框(Proposal),基于网络模型的引入的多尺度Anchor,通过SoftMax对anchors进行分类(是背景还是前景),并使用Bounding Box Regression对anchor进行回归预测,获取Proposal的精确位置,并用于后续的目标识别与检测。
1.3 ROI Pooling
综合卷积层特征(feature maps)和候选框proposal的信息,将Proposal在输入图像中的坐标映射到最后一层的(feature maps(conv5-3))中,对feature map中的对应区域进行池化操作,得到固定大小(7*7)输出的池化结果,并与后面的全连接层相连。
1.4 Classification and Regression
全连接层后接两个子连接层-分类层(cls)和回归层(reg),分类层用于判断Proposal的类别,回归层则通过Bounding box regression来预测出Proposal的准确位置。
2 Faster R-CNN测试网络结构
下图是Faster R-CNN的测试网络结构,可以清晰地看到其前向传播的计算过程。
首先输入一张P*Q大小的图像(p*q即任意尺度),将其resize到M*N大小,然后将缩放后的图像送入卷积神经网络来提取特征(通用的网络结构是vgg、ZFNet),最后一个卷积层为conv5-3,特征数为512.
将得到的feature map送入RPN网络中,首先执行3*3卷积操作,后面接一个512维的全连接层,全连接层有2个子连接层,分别用于anchors的分类与回归,再通过计算筛选得到Proposals。
Rois Pooling层则利用Proposal从feature maps中提取Proposal feature进行池化操作,送入后续的Fast R-CNN网络做分类与回归。RPN网络和Fast R-CNN均有分类和回归,但两者是不同的,RPN中分类是判断conv5-3中对应的anchors属于背景还是前景的概率,并通过回归获取anchors的偏移和缩放尺度,根据目标的得分值筛选用于后续检测识别的Proposals;Fast R-CNN是对RPN网络提取的Proposal做分类识别,并通过回归参数调整得到目标(Object)的精确位置。
3 RPN网络(Region Proposal Networks)
传统的目标检测方法中生成的候选框都比较耗时,例如使用滑动窗口加图像金字塔的方式遍历图像,获得多尺度的候选区域;以及R-CNN、Fast R-CNN中均使用到的Selective Search的方法生成候选框。而Faster R-CNN则直接使用RPN网络将检测框Proposal的提取嵌入到网络内部,通过共享卷积层参数的方式提升Proposal的生成速度。
3.1 Anchor
Anchor是RPN网络中的一个较为重要的概念,传统的检测方法中为了能够得到多尺度的检测框,需要通过使用图像金字塔的方式对图像或者滤波器(滑动窗口)进行多尺度采样。RPN网络则是使用一个3*3的卷积核,在最后一个特征图上滑动,将卷积核中心对应位置映射回输入图像,生成3种尺度(scale){128,256,512},和3种长宽比(aspect ratio){1:1,1:2,2:1}共9种anchor,如下图所示,最后一个特征图每个位置都对应9个Anchors,如果feature map的大小为W*H,则一共有W*H*9个Anchors,滑动窗口的方式保证了能够关联conv5-3的全部特征空间,最后在原图上得到多尺度多长宽比的anchors。如下图所示:
最后一个feature map后面会接一个全连接层,如下图所示,全连接层的维数和feature map的特征数(channels)相同。对于原论文中采用的ZF模型,conv5的特征数为256,全连接层的维数也为256;对于VGG模型,conv5-3的特征数为512,全连接层的维数则为512,相当于feature map上的每个点都输出一个512维的特征向量。(这段话讲的不是RPN,其最后一层卷积层直接与Fast R-CNN的全连接层进行连接)如下图所示:
关于anchors的几点理解:
-conv5-3上使用了3*3的卷积核,每个点都可以关联局部领域的空间信息;
-conv5-3上每个点前向映射得到k个anchors(RPN),并且后向输出512维的特征向量(Fast R-CNN),而anchors的作用是分类和回归得到Proposal,因此全连接层后面要接两个子连接层-分类层(cls)与回归层(reg),分类层来判断anchors是前景还是背景,向量维数为2k;回归层用于计算anchors的偏移量和缩放量,共4个参数[tx,ty,tw,th],向量维数为4k.
3.2 训练样本的生成
一般来说feature map的大小是60*40,那么一共可以生成60*40*9大约为20k个anchor boxes,显然不会将所有的anchors用于训练,而是筛选出一定数量的正负样本。对于数据集中,包含GroundTruth的图像,要考虑一张图片中所有的anchors:
(1)首先过滤掉超过边界的anchors;(2)对于每个标定的Groundtruth,与其重叠比例IOU最大的anchor作为正样本,这样可以保证每一个groundtruth都对应一个正样本的anchor;(3)对于每个anchors,如果其与图像中任何一个groundtruth的IOU大于0.7,则记录为正样本,若IOU小于0.3,则记录为负样本;(4)再从正负样本中随机选取256个anchors组成一个minibatch进行训练,而且正负样本的比例是1:1;如果正样本不够,则补充一些负样本来满足256个训练样本的需要;
3.3 Multi-task Loss Function
由于其涉及到分类与回归,所以需要定义一个多任务损失函数(Multi-task Loss Function),包括SoftMax Classification Loss和Bounding Box Regression Loss,公式定义如图所示:
3.3.1 SoftMax Classification Loss
对于RPN网络的分类层(cls),其向量的维度为2k=18,考虑整个特征图为W*H,即输出的大小为W*H*2k,正好对应conv-5-3上每个点有9个anchors,而每个anchor又有两个score(bg/fg)的输出,对于单个anchor的训练样本,其实是一个二分类的问题。在上式中,pi为样本的预测概率值,pi*为样本的标定值,anchor为正样本时,pi*=1,反之,anchor为负样本时,pi*为0,Lcls为两种类别的对数损失(log loss)。
3.3.2 BoundingBox Regression Loss
RPN网络的回归层输出向量的维度为4*k=36,回归参数为每个样本坐标[x,y,w,h],分别为Box的中心以及宽和高,三组参数预测的box的坐标为[x,y,w,h],anchor的坐标[xa,ya,wa,ha],Groundtruth的坐标为[x*,y*,w*,h*],分别计算预测框相对于anchor中心位置的偏移量以及宽高的缩放量{t},groundtruth相对于anchor中心位置的偏移量以及宽高的缩放量,计算公式如图所示:
回归目标就是让{t}更接近于{t*},所以真正预测出来的是{t},而训练样本的真值为{t*}。得到预测输出{t}后,通过上式反推即可获取预测框的真实坐标。在损失函数上,回归损失采用了Smooth L1函数:
SmoothL1损失函数曲线如下图所示,相比于L2损失函数而言,其对离群点或异常值不敏感,可控制梯度的量级,使得训练更容易收敛。
在损失函数中,pi*Lreg这一项表示只有anchor(pi*=1)才有回归损失,其他anchor不参与计算。这里需要注意的是,当样本bbox和ground truth比较接近的时候(IOU)大于某一阈值,可以认为回归为线性回归,否则当bbox与groundtruth离得较远时,就是非线性问题,用线性回归就不合理,会导致模型不work;分类loss与回归loss分别有Ncls与Nreg以及平衡权重λ归一化,分类损失的归一化值为minnibatch大小,即Ncls=256;回归损失的归一化值为anchor的位置的数量,Nreg约为2400,λ一般取值为10,这样分类损失和回归损失差不多是等权重的。
3.4 Proposal的生成
Proposal的生成就是将图像送入到RPN网络中进行一次前向传播,处理流程:
(1)计算特征图映射到输入图像的所有anchors,并通过RPN计算anchor的IOU以及Bounding Box回归的参数;
(2)由anchors坐标和bbox回归参数来计算得到预测框proposal的坐标值;
(3)处理proposal超过图像边界的情况(使得坐标值最小为0,最大值为宽或者高)
(4)滤除掉尺寸小于给定阈值的proposal;
(5)对剩下的proposal按照目标得分进行进行排序,提取前pre_nms_topN个proposal;
(6)对提取的proposal进行非极大值抑制,再根据nms后的foreground score,筛选前post_nms_topN个proposal作为最后的输出;
4 Fast R-CNN
对于RPN网络中生成的proposals,需要送入Fast R-CNN网络做进一步的精确分类以及坐标回归,但Proposal的尺寸可能大小不一,所以需要做RoiPooling,输出统一尺寸的特征,再与后面的全连接层连接。
4.1 ROI Pooling
对于传统的卷积神经网络,当网络训练好后输入图像的尺寸必须是固定值,同时网络输出的固定大小的向量或矩阵。如果输入图像大小不统一,则需要进行特殊处理,如下图所示:
(1)从图像中crop一部分传入网络
(2)将图像warp成需要的大小后传入网络
可以从图中看出,crop操作破坏了图像的完整结构,warp操作破坏了图像的原始形状信息,两种方法的效果都不太理想。RPN网络生成的proposal也存在尺寸不一的情况,但论文中提出了RoI Pooling的方法解决这个问题。
RoI Pooling结合特征图conv5-3和proposal的信息,proposal在输入图像中的坐标[x1,y1,x2,y2][x1,y1,x2,y2]对应M×NM×N尺度,将proposal的坐标映射到M16×N16M16×N16大小的conv5-3中,然后将Proposal在conv5-3的对应区域水平和竖直均分为7等份,并对每一份进行Max Pooling或Average Pooling处理,得到固定大小(7×7)输出的池化结果,实现固定长度输出(fixed-length output),如下图所示。
4.2 Classification and Regression
RoI Pooling层后接多个全连接层,最后为两个子连接层——分类层(cls)和回归层(reg),如下图所示,和RPN的输出类似,只不过输出向量的维数不一样。如果类别数为N+1(包括背景),分类层的向量维数为N+1,回归层的向量维数则为4(N+1)。
RPN网络输出的proposal如何组织成Fast R-CNN的训练样本:
(1)对每个proposal,计算其与所有ground truth的重叠比例IoU
(2)筛选出与每个proposal重叠比例最大的ground truth (?)
(3)如果proposal的最大IoU大于0.5则为目标(前景),标签值(label)为对应ground truth的目标分类;如果IoU小于0.5且大于0.1则为背景,标签值为0
(4)从2张图像中随机选取128个proposals组成一个minibatch,前景和背景的比例为1:3
(5)计算样本proposal与对应ground truth的回归参数作为标定值,并且将回归参数从(4,)拓展为(4(N+1),),只有对应类的标定值才为非0。
(6)设定训练样本的回归权值,权值同样为4(N+1)维,且只有样本对应标签类的权值才为非0。
5 Faster R-CNN的训练
对于提取proposals的RPN,以及分类回归的Fast R-CNN,如何将这两个网络嵌入到同一个网络结构中,训练一个共享卷积层参数的多任务(Multi-task)网络模型。源码中有实现交替训练(Alternating training)和端到端训练(end-to-end)两种方式,这里介绍交替训练的方法。
(1)训练RPN网络,用ImageNet模型M0初始化,训练得到模型M1
(2)利用第一步训练的RPN网络模型M1,生成Proposal P1
(3)使用上一步生成的Proposal,训练Fast R-CNN网络,同样用ImageNet模型初始化,训练得到模型M2
(4)训练RPN网络,用Fast R-CNN网络M2初始化,且固定卷积层参数,只微调RPN网络独有的层,训练得到模型M3 (??)
(5)利用上一步训练的RPN网络模型M3,生成Proposal P2
(6)训练Fast R-CNN网络,用RPN网络模型M3初始化,且卷积层参数和RPN参数不变,只微调Fast R-CNN独有的网络层,得到最终模型M4
由训练流程可知,第4步训练RPN网络和第6步训练Fast R-CNN网络实现了卷积层参数共享。总体上看,训练过程只循环了2次,但每一步训练(M1,M2,M3,M4)都迭代了多次(e.g. 80k,60k)。对于固定卷积层参数,只需将学习率(learning rate)设置为0即可。
参考博客:
https://blog.csdn.net/Zachary_Co/article/details/78890768