论文地址
《Faster R-CNN Towards Real-Time Object》
Faster RCNN将特征提取(feature extraction),proposal提取,bounding box regression(Region Refine),classification都整合在了一个网络中,使得检测性能较RCNN、Fast RCNN进一步提高。
如上图所示:
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获得检测框最终的精确位置。
流程:输入任意一个大小为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的大小,这样使用卷积层并不会改变图片的大小;
pooling的stride=2表示将M*N的图像大小变为原图的1/2大小,即把图像的长宽缩小为原图的一半;
总之,一个矩阵大小为M*N经过Conv layers变为(M/16)*(N/16);
Region Proposal Networks(RPN)
流程: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上进行线性组合以进行信息整合,且保留了图片的原有平面结构,从而完成升维或降维的功能;
正负样本划分:
在训练阶段需要人为的划分正负样本,让RPN网络去学习二分类:判断anchor是正负样本的能力;正样本为foreground(前景)、负样本为background(背景)。具体做法是将一张图像中产生的所有anchors与ground true box(GT)区域计算IoU(Intersection over Union,重叠比例),根据以下规则划分正负样本:
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;
如上图所示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的大小及形状如下图所示:
总之,RPN就是在原图尺度上,设置了密密麻麻的候选anchor,然后判断哪些anchor是有目标的positive anchor,哪些是没有目标的negative anchor;
假设原图为800x600,VGG网络下采样16倍,feature map每个点设置9个anchor,所以:
其中ceil()表示向上取整,VGG网络输出的feature map size= 50*38,总的anchor数为17100;
为什么Anchor坐标中有负数?
anchor生成步骤:首先生成9个base anchor,然后通过坐标偏移在50*38大小的1/16下采样FeatureMap每个点都放上这9个base anchor,就形成了50*38*9个anhcors,至于这9个anchors的坐标不重要,不同代码实现不同,所以有些anchor坐标会有负数,显然会有一部分边缘的anchors会超出图像边界,而真实中不会有超出图像的目标,所以会有clip anchor步骤。;
Anchor到底与网络输出如何对应?
VGG输出50*38*512的特征,对应设置50*38*k个anchors,而RPN输出50*38*2k的分类特征矩阵和50*38*4k的坐标回归特征矩阵,在实现过程中,每个点的2k个分类特征与4k回归特征,与k个anchor逐个对应即可,这实际是一种“人为设置的逻辑映射”;
softmax二分类判定positive与negative:即RPN网络的第一条线
输入假设 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更加接近:
对于窗口一般使用四维向量表示,分别表示窗口的中心点坐标和宽高,红色框A代表原始的positive Anchors,绿色框G代表目标的GT;目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G',即:
给定anchor 和 ,寻找一种变换F,使得,其中
变换F包括平移与缩放:
需要学习的参数为,当输入的anchor A与GT相差较小时,可以认为上述变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调,线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即,
输入X是feature map,定义为;同时,还有训练传入A与GT之间的变换量,即,输出是,,,四个变换,那么,目标函数可以表示为:
其中,是对应anchor的feature map组成的特征向量,是需要学习的参数,是得到的预测值(*表示x, y, w, h, 也就是每一个变换对应一个上述目标函数),为了让预测值与真实值差距最小,设计L1损失函数:
函数优化目标为:
positive anchor与ground truth之间的平移量与尺度因子如下:
其中,对应两组框的中心点坐标和它的宽和高,变量分别对应predicted box, anchor box和ground-truth box中心点的横坐标,都是同理,接着进一步对Anchors进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框,再选择前景概率最高的M个proposal;
对proposals进行bounding box regression:即RPN网络的第二条线
可以看到其output channel=36,即经过该卷积输出图像为WxHx36,相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的变换量;
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种解决办法:
crop破坏了图像的完整结构,warp破坏了图像原始形状信息
SPPNet
由于一般的CNN网络结构中都伴随全连接层,全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来,需要指定输入层神经元个数和输出层神经元个数,所以需要规定输入的feature的大小,SPPNet解决了这个问题;
如上图所示,假设原图输入是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输出结果都是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,用于回归更加精确的目标检测框:
从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,通过全连接和softmax对proposals进行分类,再次对proposals进行bounding box regression,获取更高精度的bbox;
Faster R-CNN的训练,是在已经训练好的model(如VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次;
训练RPN网络
把RPN中的rpn classification和rpn bounding box regression统称为RPN训练;把proposal layer中对proposal精确位置的训练和最终的准确分类训练统称为R-CNN训练;
首先读取预训练好的model(使用VGG),开始迭代训练:
图中,Conv layers中的所有层都画在了一起,如红框所示,后续图都是如此处理
损失函数如下:
RPN训练时要把RPN classification和RPN bounding box regression的loss加到一起来实现联合训练:
是一个batch的大小256,将一个batch所有loss求平均就是RPN classification的损失
Lcls(pi, pi*)是前景和背景的对数损失
: anchor index
: foreground softmax predict概率,就是图中rpn_cls_score_reshape输出的前景部分score值
: 对应GT predict概率,即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,为1;反之IoU<0.3时,认为是该anchor是negative,为0;至于那些0.3 Nreg是anchor的总数,和用smooth L1方法来计算loss就是RPN bounding box regression的损失,注意在该loss中乘了,相当于只关注positive anchors的回归 : predict bounding box,图中rpn_bbox_pred模块输出的[d'x(A), d'y(A), d'w(A), d'h(A)], : foreground anchors对应的GT box,即训练时每一个anchor与ground truth间的偏移量 : 平衡参数,用于平衡两种 loss(如=256,=2400,则设置为10) 总的网络Loss计算过程中能够均匀考虑2种Loss,这里比较重要是使用的soomth L1 loss: 通过训练好的RPN网络收集proposals 利用之前的RPN网络,获取proposal rois,同时获取positive softmax probability; 训练Faster RCNN网络 这样可以训练最后的识别softmax与最终的bounding box regression; 参考: 一文读懂Faster RCNN 【论文解读】精读Faster RCNN 从结构、原理到实现,Faster R-CNN全解析 Faster RCNN算法解析 【目标检测】Faster R-CNN论文详解 仅为学习记录,侵删!