目标检测学习--Faster RCNN

论文地址

《Faster R-CNN Towards Real-Time Object》

Faster RCNN将特征提取(feature extraction),proposal提取,bounding box regression(Region Refine),classification都整合在了一个网络中,使得检测性能较RCNN、Fast RCNN进一步提高。

基本结构

目标检测学习--Faster RCNN_第1张图片

如上图所示: 

Conv layers:Faster RCNN首先使用一组基础的conv+relu+pooling操作提取输入image的feature maps,该feature maps将被共享用于后续RPN层和全连接层;

Region Proposal Networks(RPN):RPN网络用于生成region proposals,通过softmax判断anchors属于positive或者negative(二分类),并且利用bounding box regression修正anchors获得较精确的proposals;

Roi Pooling:该层输入上述的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别;

Classification:利用proposal feature maps判断proposal的目标类别,同时再次bounding box regression获得检测框最终的精确位置

基于VGG16模型的Faster RCNN的网络结构 

目标检测学习--Faster RCNN_第2张图片

流程:输入任意一个大小为P*Q的图像,首先缩放至固定大小M*N,然后将M*N图像送入CNN网络,而Conv layers包含了13个conv层+13个relu层+4个pooling层,输出feature map,RPN网络首先将Feature Map先经过一个3x3卷积,再分别生成positive anchors和对应bounding box regression的偏移量,然后计算出proposals,而Roi Pooling层则利用proposals从feature maps中提取proposal feature map送入后续的网络结构(主要为全连接层与softmax)作classification与Bounding box regression;

Conv layers:共有13个conv层、13个relu层、4个pooling层,其中所有的conv层都是:kernel_size=3,pad=1,stride=1,所有的pooling层都是:kernel_size=2,pad=0,stride=2;

conv的pad=1表示将输入图像四周填充一圈0,即将M*N的图像大小变成(M+2)*(N+2)的图片大小,然后使用3*3卷积,输出的图像变成M*N的大小,这样使用卷积层并不会改变图片的大小;

目标检测学习--Faster RCNN_第3张图片

pooling的stride=2表示将M*N的图像大小变为原图的1/2大小,即把图像的长宽缩小为原图的一半;

总之,一个矩阵大小为M*N经过Conv layers变为(M/16)*(N/16);

Region Proposal Networks(RPN)

目标检测学习--Faster RCNN_第4张图片 

流程:RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground(positive)和background(negative)分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals; 

多通道图像卷积:如下图所示,假设输入通道为3,同时有2个卷积核,对于每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出,所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量;对多通道图像做1x1卷积,即将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道联系在一起,1*1卷积实际上是对每个像素点,在不同的channels上进行线性组合以进行信息整合,且保留了图片的原有平面结构,从而完成升维或降维的功能;

目标检测学习--Faster RCNN_第5张图片

正负样本划分:

在训练阶段需要人为的划分正负样本,让RPN网络去学习二分类:判断anchor是正负样本的能力;正样本为foreground(前景)、负样本为background(背景)。具体做法是将一张图像中产生的所有anchors与ground true box(GT)区域计算IoU(Intersection over Union,重叠比例),根据以下规则划分正负样本:

  • 对每个标定的ground true box区域,与其IoU最大的anchor记为正样本(保证每个ground true至少对应一个正样本anchor)
  • 剩余的anchor,如果其与某个标定区域重叠比例大于0.7,记为正样本。如果其与任意一个标定的重叠比例都小于0.3,记为负样本
  • 上两步剩余的anchor弃去不用
  • 跨越图像边界的anchor弃去不用

目标检测学习--Faster RCNN_第6张图片

anchors:

RPN网络的输入是经过conv+pool+relu操作后得到的feature maps,再用一个3x3的slide window,去遍历整个feature map,针对feature maps上的每一个特征点,映射回原图的感受野的中心点(即基准点),在遍历过程中每个window中心点选取k个矩形框,这些矩形框就是anchors,有三种尺度scale[128*128;256*256;512*512]、三种宽高比例aspect[1:1;1:2;2:1],所以每个位置共有k=9个anchors,然后再利用全连接对每个anchors做二分类(是前景还是背景)和初步bounding box regression;

目标检测学习--Faster RCNN_第7张图片

如上图所示256-d表示特征图共有256张,k是每个基准点的anchor的个数,2k scores表示k个anchors的softmax的分数,每个anchor有2个score(foreground/background),4k coordinates表示k个anchors坐标[x、y、w、h]的偏移量的regression结果,其中[x,y]表示中心点位置,[w,h]表示anchor的宽高;

k=9个anchors的大小及形状如下图所示:

目标检测学习--Faster RCNN_第8张图片

总之,RPN就是在原图尺度上,设置了密密麻麻的候选anchor,然后判断哪些anchor是有目标的positive anchor,哪些是没有目标的negative anchor;

假设原图为800x600,VGG网络下采样16倍,feature map每个点设置9个anchor,所以:

ceil(800/16)*ceil(600/16)*9=50*38*9=17100

其中ceil()表示向上取整,VGG网络输出的feature map size= 50*38,总的anchor数为17100;

目标检测学习--Faster RCNN_第9张图片

为什么Anchor坐标中有负数?

anchor生成步骤:首先生成9个base anchor,然后通过坐标偏移在50*38大小的1/16下采样FeatureMap每个点都放上这9个base anchor,就形成了50*38*9个anhcors,至于这9个anchors的坐标不重要,不同代码实现不同,所以有些anchor坐标会有负数,显然会有一部分边缘的anchors会超出图像边界,而真实中不会有超出图像的目标,所以会有clip anchor步骤。;

目标检测学习--Faster RCNN_第10张图片

Anchor到底与网络输出如何对应?

VGG输出50*38*512的特征,对应设置50*38*k个anchors,而RPN输出50*38*2k的分类特征矩阵和50*38*4k的坐标回归特征矩阵,在实现过程中,每个点的2k个分类特征与4k回归特征,与k个anchor逐个对应即可,这实际是一种“人为设置的逻辑映射”;

目标检测学习--Faster RCNN_第11张图片

softmax二分类判定positive与negative:即RPN网络的第一条线

目标检测学习--Faster RCNN_第12张图片

输入假设 W=M/16,H=N/16,首先经过1*1卷积整合信息,可以看到其output channel=18,即经过卷积后输出图像大小为W*H*18,这也刚好对应了feature map每一个点都有9个anchors,同时每个anchors又有可能是positive和negative,所有这些信息都保存为WxHx(9*2)大小的矩阵,reshape是为了便于softmax分类;

总之,RPN网络中利用anchors和softmax初步提取出positive anchors作为候选区域;

bounding box regression:

如下图所示,绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色框被分类器识别为飞机,但红色框定位不准,相当于没有正确检测出飞机。所以采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近:

目标检测学习--Faster RCNN_第13张图片

对于窗口一般使用四维向量(x,y,w,h)表示,分别表示窗口的中心点坐标和宽高,红色框A代表原始的positive Anchors,绿色框G代表目标的GT;目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G',即:

给定anchor A=(A_{x},A_{y},A_{w},A_{h}) 和GT=(G_{x},G_{y},G_{w},G_{h}) ,寻找一种变换F,使得F(A_{x},A_{y},A_{w},A_{h})=({G}'_{x},{G}'_{y},{G}'_{w},{G}'_{h}),其中({G}'_{x},{G}'_{y},{G}'_{w},{G}'_{h})\approx (G_{x},G_{y},G_{w},G_{h})

变换F包括平移与缩放:

{G}'_{x} = A_{w} * d_{x}(A) + A_{x} 

{G}'_{y} = A_{h} * d_{y}(A) + A_{y}

{G}'_{w} = A_{w} * exp(d_{w}(A)) 

 {G}'_{h} = A_{h} * exp(d_{h}(A))

 需要学习的参数为d_{x}(A) , d_{y}(A) , d_{w}(A) , d_{h}(A),当输入的anchor A与GT相差较小时,可以认为上述变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调,线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即Y=WX

输入X是feature map,定义为\o;同时,还有训练传入A与GT之间的变换量,即(t_{x}, t_{y}, t_{w}, t_{h}),输出是d_{x}(A)d_{y}(A)d_{w}(A)d_{h}(A)四个变换,那么,目标函数可以表示为:

d_{*}(A)=W_{*}^{T}\cdot \o (A)

其中,\o (A)是对应anchor的feature map组成的特征向量,W_{*}是需要学习的参数,d_{*}(A)是得到的预测值(*表示x, y, w, h, 也就是每一个变换对应一个上述目标函数),为了让预测值d_{*}(A)与真实值t_{*}差距最小,设计L1损失函数:

Loss=\sum_{i}^{N}\left | t_{*}^{i}-W_{*}^{T}\cdot \o (A^{i}) \right |

函数优化目标为:

\widehat{W}_{*}=argmin_{W_{*}}\sum_{i}^{n}\left | t_{*}^{i}-W_{*}^{T}\cdot \o (A^{i}) \right |+\lambda \left \| W_{*} \right \|

positive anchor与ground truth之间的平移量(t_{x}, t_{y})与尺度因子(t_{w}, t_{h})如下:

其中,x, y, w, h对应两组框的中心点坐标和它的宽和高,变量x, x_{a}, x^{*}分别对应predicted box, anchor box和ground-truth box中心点的横坐标,y, w, h都是同理,接着进一步对Anchors进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框,再选择前景概率最高的M个proposal; 

对proposals进行bounding box regression:即RPN网络的第二条线

目标检测学习--Faster RCNN_第14张图片

可以看到其output channel=36,即经过该卷积输出图像为WxHx36,相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变换量d_{x}(A) , d_{y}(A) , d_{w}(A) , d_{h}(A)

Proposal层示意图:

测试阶段,在得到所有foreground anchors和其对应的偏移量[dx(A),dy(A),dw(A),dh(A)]后。Proposal Layer负责综合两者,计算出精准的proposal,流程如下:

  • 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]对所有的anchors做bounding box regression回归;

  • 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors;

  • 将foreground anchors从M*N尺度映射回P*Q原图,判断fg anchors是否大范围超过边界,剔除严重超出边界foreground anchors;

  • 进行nms(nonmaximum suppression,非极大值抑制),按照nms后的foreground softmax scores由大到小排序foreground anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出。

RoI pooling

RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络;

问题

对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。有2种解决办法:

  1. 从图像中crop一部分传入网络
  2. 将图像warp成需要的大小后传入网络

目标检测学习--Faster RCNN_第15张图片

crop破坏了图像的完整结构,warp破坏了图像原始形状信息

SPPNet

由于一般的CNN网络结构中都伴随全连接层,全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来,需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小,SPPNet解决了这个问题;

目标检测学习--Faster RCNN_第16张图片

如上图所示,假设原图输入是224*224,对于conv5出来后的输出,是13*13*256的,可以理解为有256个filter,每个filter对应一个13*13的activation map;如果像上图那样将activation map pooling成4*4 2*2 1*1三张子图,做max pooling后,出来的特征就是固定长度的(16+4+1)*256维度;如果原图的输入不是224*224,出来的特征依然是(16+4+1)*256维度;可以理解成将原来固定大小为(3*3)窗口的pool5改成了自适应窗口大小,窗口的大小和activation map成比例,保证经过pooling后出来的feature的长度是一致的;

总之,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络即将与全连接层连接时,使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,ROI pooling就使用了该思想;

ROI pooling:

  • 由于proposal是对应MxN尺度的,所以首先将其映射回(M/16)x(N/16)大小的feature map尺度;
  • 再将每个proposal对应的feature map区域水平分为w*h的网格;
  • 对网格的每一份都进行max pooling处理。

目标检测学习--Faster RCNN_第17张图片

总之,大小不同的proposal输出结果都是7*7的固定大小,实现了固定长度输出,对于VGG16网络conv5_3有512个特征图,这样所有region proposal对应了一个7*7*512维度的特征向量作为全连接层的输入,pooling成7×7是为了共享权重,当所有的roIs都被pooling成(7*7*512)的feature map后,将它reshape成一个一维的向量,就可以利用VGG16预训练的权重,初始化前两层全连接;

Classification

Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框:

目标检测学习--Faster RCNN_第18张图片

从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,通过全连接和softmax对proposals进行分类,再次对proposals进行bounding box regression,获取更高精度的bbox;

Faster RCNN训练

Faster R-CNN的训练,是在已经训练好的model(如VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:

  1. 在已经训练好的model上,训练RPN网络;
  2. 利用步骤1中训练好的RPN网络,收集proposals;
  3. 第一次训练Fast RCNN网络;
  4. 第二训练RPN网络;
  5. 再次利用步骤4中训练好的RPN网络,收集proposals;
  6. 第二次训练Fast RCNN网络;

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次;

目标检测学习--Faster RCNN_第19张图片

训练RPN网络 

把RPN中的rpn classification和rpn bounding box regression统称为RPN训练;把proposal layer中对proposal精确位置的训练和最终的准确分类训练统称为R-CNN训练;

首先读取预训练好的model(使用VGG),开始迭代训练:

图中,Conv layers中的所有层都画在了一起,如红框所示,后续图都是如此处理

目标检测学习--Faster RCNN_第20张图片

损失函数如下:

RPN训练时要把RPN classification和RPN bounding box regression的loss加到一起来实现联合训练:

N_{cls}是一个batch的大小256,将一个batch所有loss求平均就是RPN classification的损失

Lcls(pi, pi*)是前景和背景的对数损失

i: anchor index

P_{i}: foreground softmax predict概率,就是图中rpn_cls_score_reshape输出的前景部分score值

P_{i}^{*}: 对应GT predict概率,即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,为1;反之IoU<0.3时,认为是该anchor是negative,为0;至于那些0.3

Nreg是anchor的总数,t_{i}t^{*}_{i}用smooth L1方法来计算loss就是RPN bounding box regression的损失,注意在该loss中乘了P_{i}^{*},相当于只关注positive anchors的回归  

t_{i}: predict bounding box,图中rpn_bbox_pred模块输出的[d'x(A), d'y(A), d'w(A), d'h(A)],

t^{*}_{i}: foreground anchors对应的GT box,即训练时每一个anchor与ground truth间的偏移量

\lambda: 平衡参数,用于平衡两种 loss(如N_{cls}=256,N_{reg}=2400,则\lambda设置为10)

总的网络Loss计算过程中能够均匀考虑2种Loss,这里比较重要是L_{reg}使用的soomth L1 loss:

目标检测学习--Faster RCNN_第21张图片

通过训练好的RPN网络收集proposals

利用之前的RPN网络,获取proposal rois,同时获取positive softmax probability;

目标检测学习--Faster RCNN_第22张图片

训练Faster RCNN网络

  1. 将提取的proposals作为rois传入网络,如下图蓝框
  2. 计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer,如下图绿框

这样可以训练最后的识别softmax与最终的bounding box regression;

目标检测学习--Faster RCNN_第23张图片

参考

一文读懂Faster RCNN

【论文解读】精读Faster RCNN 

从结构、原理到实现,Faster R-CNN全解析 

Faster RCNN算法解析 

【目标检测】Faster R-CNN论文详解 

 

仅为学习记录,侵删! 

你可能感兴趣的:(目标检测网络,目标检测,学习,深度学习)