文章目录
- 前言
- 论文结构
-
- Abstract
- Introduction
- Related Work
- Region Proposal Network
- Experiments
- Conclusion
- 网络架构
-
- 网络细节具体实现
-
- Anchors
-
- Region Proposal Networks
-
- 1.结构:
- 2.cls layer——分类
- 3.Bounding Box Regression(reg layer——回归)
-
- 偏移值计算公式:(即Anchor box与predicated box之间的差距)
- 为什么要除以Wa,ha?
- Bounding Box回归(即Anchor box与ground truth之间的差距)
- Proposal Layer
- RoI pooling
- 分类——classification
- Faster RCNN的训练
-
- 网络总结
前言
目标检测入门三大RCNN是必读的经典论文模型,而我本人在阅读论文及学习时,通过论文原文,代码上手复现难度极大,而许多博客均默认大家有目标检测基础,因此本文从笔者本人的学习感悟出发进行总结,写出这篇《Faster RCNN超详细入门》,方便大家进行参考。
- 若大家没有目标检测评价指标基础可参考这篇文章。《目标检测基础(TP,recall,PR曲线,mAP,NMS)》
- 【建议先读】若大家没有Faster RCNN设计的背景基础可参考这篇文章。《Faster RCNN超详细入门 01-准备篇-背景 RCNN,SPPnet,Fast RCNN,RoI Pooling》
论文结构
Abstract
提出RPN用于候选区域提取,并与Fast RCNN实现共享特征计算,克服实时性瓶颈
摘要核心:
- 候选区域提取(SS-Selective Search)是已有检测方法实时性低的主要瓶颈
- 提出了候选区域网络(RPN-Region Proposal Network),通过共享特征,提取候选区域,极大提升了计算效率,可以端到端训练
- Fast RCNN和VGG通过迭代优化可以实现特征共享
- Faster RCNN是一个实用系统,在单GPU上达5fps
- 在Pascal Voc2012上达 70.4% mAP
Introduction
对于RCNN系列的进一步改进,提出RPN网络,在实时性和准确率满足实际应用需求
Related Work
OverFeat和Fast RCNN的介绍
Region Proposal Network
RPN网络架构及设计原理,Anchor的定义,多任务损失函数设计
Experiments
基于Pascal Voc,COCO数据集,实验验证,消融实验及对比试验
Conclusion
网络架构
整体框架如下:
- VGG16网络进行特征提取,生成特征图大小变为原图1/16(4次max pooling,缩小2^4)。
- anchors处理:在每一个像素点上人为的放上一些长宽大小均不同的框,找到潜在的目标检测物体存在区域。
- RPN:输入为Feature maps和acnhors。
- 分类:将anchors分为两类,包含物体的为前景正样本,否则为背景负样本。
- 回归:将包含有物体的anchors位置进行微调,使其较为精确地抓取物体。
- ROI Pooling:首先进行特征提取,然后不同图像的输入,造成feature maps的大小不一致,该层接收不同大小的feature map以后,可以得到固定的size输出。
- 再次放入Fast-RCNN:进行多分类任务;进行回归得到更精确的物体识别和Bounding Boxes的位置。
以VGG网络为例:
1.首先缩放至固定大小 M*N。
2.放入共享Conv layers。
3.RPN计算proposals。
4**.RoI Pooling层则利用proposals从feature maps中提取proposal features**。
5.送入后续全连接和softmax网络作classification。
共享卷积层
共享的意思是,Conv layers部分提取的feature既可以用作RPN网络,又可以用作后面的Fast RCNN部分。
Conv layers
1.conv layers部分有13个conv层,13个relu层,4个pooling层。
- conv层均为:kernel_size = 3, pad = 3, stride = 1。
- pooling层均为: kernel_size = 2, pad = 0, stride = 2。
2.Faster RCNN conv layers 对所有卷积层都做了padding处理(pad = 1,即外周填充一圈0),导致原图变为(M+2)x(N+2)大小,再做33卷积后输出M x N。
3.pooling层均为: kernel_size = 2, pad = 0, stride = 2。经过Pooling层的MN矩阵,都会变成(M/2)x(N/2)大小。
4.因此,一个MN大小的矩阵经过Conv layers固定变为(M/16)(M/16)。
网络细节具体实现
Anchors
1.特点:
4个值表矩阵左上和右下角点的坐标:(x1,y1,x2,y2)。
9个矩形共有3种形状,长宽比大约为:{1:1,1:2,2:1}。
为每一个点都配备这9种anchors作为初始的检测框。
2.细节:
- 原文使用的是ZF model,其中Conv layers中最后的conv5层 num_output = 256,对应生成256特征图,所以相当于feature map每个点都是256-dimensions。
- 训练程序会在合适的anchors中随机选取128个positive anchors + 128negative anchors进行训练。
- VGG输出 :50 x 38 x 512,对应50 x 38 x k个anchors。
- RPN输出:
- 50 x 38 x 2k 的positive/negative softmax分类特征矩阵。
- 50 x 38 x 4k 的regression坐标回归特征矩阵。
3.计算:
- 原图800*600,VGG下采样16倍,feature map每个点设置9个anchor,所以:Ceo(800/16)x Ceil(600/16)x9 = 50 x 38 x 9 = 17100。
**其中ceil()表示向上取整,是因为VGG输出的feature map size = 50 x 38.**
4.标签:
- 区分前景与背景Anchor,标记标签(1 正例, -1 负例, 0 忽略)
- 正例: 对于每一个 gt box,交并比最大的anchor,与任一 gt box交并比超过一定阈值(0.7)。
- 负例: 与所有gt boxes交并比小于一定阈值(0.3)其他。
- 对每一前景anchor,根据对应的gt box计算回归值。
Region Proposal Networks
目的:判定哪些anchors有可能包含物体。
输入:
- cls层生成的(M/16) x (N/16) x 2k向量
- reg层生成的(M/16) x (N/16) x 4k向量
- im_info=[M, N,scale_factor]
输出:(1)包含物体的概率 (2)调整anchors的位置的偏移量。
1.结构:
- 上面一条用softmax分类anchors获得positive和negtive。
- 下面一条用于计算分类anchors的bounding box regression偏移量。
- 最后的proposal获取positive anchors 的正确proposal,剔除大小和超出边界的proposal。
2.cls layer——分类
- 输入为18,因为每一个像素点的anchors为9,正负样本判定(positive or negative)即为2x9。
- Reshape层是技术细节问题,对feature map进行维度变换,使得有一个单独的维度为2,方便在该维度上进行softmax操作,之后再- Reshape恢复原状。
- softmax进行分类,分出positive和negative的anchors。
3.Bounding Box Regression(reg layer——回归)
- (M/16)x(N/16)x256的特征通过1x1卷积得到(M/16)x(N/16)x4k的输出,因为这里是生成每个anchor的坐标偏移量(用于修正anchor),[tx,ty,tw,th]共4个所以是4k。
**输出的是坐标偏移量,不是坐标本身,要得到修正后的anchor还要用原坐标和这个偏移量运算一下才行。**
偏移值计算公式:(即Anchor box与predicated box之间的差距)
为什么要除以Wa,ha?
如果以绝对坐标误差去代表其偏移量,则模型对数据库依赖性强,泛化能力弱。若训练数据库与测试数据库相差较大,则效果较差。
因此如果除以Wa,ha,则起到了Normalize的作用,提高模型泛化能力。
Bounding Box回归(即Anchor box与ground truth之间的差距)
**[px,py,pw,ph]表示原始anchor的坐标
[dx,dy,dw,dh]表示RPN网络预测的坐标偏移
[Gx,Gy,Gw,Gh]表示修正后的anchor坐标**
- 我们的目标是寻找一种关系,使得输入原始的anchor P经过映射得到一个跟真实窗口G更接近的回归窗口G‘。
- Anchor box(G’)与predicated box(P),ground truth(G)之间的平移量如图。
Proposal Layer
1.作用及输入:
- proposal layer负责综合变换量positive anchors,计算出精确的proposal。
- 3个输入:anchors分类结果,对应bbox的变换量和缩放信息。
- 缩放信息:若经过4次pooling后W x H =(M/16)x (N/16),则缩放量为16。
2.处理流程:
a.生成anchors,依据变换量对所有的anchors做bbox regression回归。
b.按照输入的positive softmax scores 由大到小排序anchors,提取前pre_nms_topN(e.g.6000)个anchors。
c.限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界。
d.剔除尺寸非常小的positive anchors。
e.对剩余的positive anchors进行NMS。
f.之后输出proposal = [x1, y1, x2, y2],对应的是M x N的图像尺度。
生成anchors -> softmax分类提取positive anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
RoI pooling
详情请查看《Faster RCNN超详细入门 01-准备篇-背景 RCNN,SPPnet,Fast RCNN,RoI Pooling》
- 目前的proposals还没有具体的物体信息。
- 因此需要从已有的bounding boxes中提取特征。
- 采用SPP-net原理。
- 由于proposal对应的M x N尺度的,所以首先使用spatial_scale参数将其映射回 (M/16) x (N/16)大小的feature map尺度。
- 再将每个proposal对应的feature map区域都水平分为pooled_w X pooled_h的网络。
- 对网格的每一份都进行max pooling处理。
- 这样处理后,即使大小不同的proposal输出结果都是pooled_w X pooled_h固定大小。
分类——classification
- 通过全连接和softmax对proposals进行分类
- 再次对proposals进行bounding box regression,获得更高精度的bbox。
Faster RCNN的训练
训练过程
1.训练RPN,该网络用ImageNet预训练的模型初始化。
2.我们利用第一步的RPN生成的建议框,由Fast RCNN训练一个单独的检测网络,这个检测网络同样由ImageNet初始化而来的。
3.我们用检测网络初始化RPN训练,但我们固定共享的卷积层,并且只微调RPN独有的层,现在两个网络共享卷积层了。
4.保持共享的卷积层固定,微调Fast R-CNN的fc层。这样,两个网络共享相同的卷积层,构成一个统一的网络。
训练RPN
总体的Loss:
参数含义如下:
cls loss:用于分类网络训练,采用的是los loss。
reg loss:用于bounding box regression网络训练。注意其中乘了pi*,表示只关心positive anchors的回归。
其他训练方式
1.Approximate joint training:
- RPN和Fast RCNN合为一个网络。
- 前向传播时,proposal由RPN层输出。
- 反向传播时,共享层的传播误差等于RPN loss和Fast RCNN loss之和。
- 注意这种方法里proposal的坐标预测的梯度被忽略。
- 能够缩减25-50%的训练时间。
2.Non-approximate joint training:不舍弃proposal的坐标梯度。
网络总结
step_0:基于ZF或VGG16提取输入图像特征。
step_1:生成anchors。
step_2:RPN计算:特征图feature map通过RPN预测anchor参数:置信度(foreground)和转化为预测框的坐标系数。
step_3:根据anchors和RPN预测的anchors参数,计算预测框的坐标系数,并得到每一个预测框的所属类别labels。
step_4:RoI Pooling把目标转化为统一的固定尺寸。
step_5:Fast RCNN预测预测框的类别,和转为目标框的平移缩放系数。注意:这里要与RPN区分。