FasterR-CNN
图1
图2
- 模型结构
(1)convlayers。即特征提取网络,用于提取特征。通过一组conv+relu+pooling层来提取图像的featuremaps,用于后续的RPN层和取proposal。
(2)RPN(RegionProposalNetwork)。即区域候选网络,该网络替代了之前RCNN版本的SelectiveSearch算法,用于生成候选框。这里任务有两部分,一个是分类:判断所有预设anchor是属于positive还是negative(即anchor内是否有目标,二分类);还有一个boundingboxregression:修正anchors得到较为准确的proposals。因此,RPN网络相当于提前做了一部分检测,即判断是否有目标(具体什么类别这里不判),以及修正anchor使框的更准一些。
(3)RoIPooling。即兴趣域池化(SPPnet中的空间金字塔池化),用于收集RPN生成的proposals(每个框的坐标),并从(1)中的featuremaps中提取出来(从对应位置扣出来),生成proposalsfeaturemaps送入后续全连接层继续做分类(具体是哪一类别)和回归。
(4)ClassificationandRegression。利用proposalsfeaturemaps计算出具体类别,同时再做一次boundingboxregression获得检测框最终的精确位置。
2. convlayers
图3
该模块主要如图2所示,有13个conv层,13个relu层,4个pooling层
conv:kernel_size=3,padding=1,stride=1
pooling:kernel_size=2,padding=0,stride=2
根据卷积和池化公式可得,经过每个conv层后,featuremap大小都不变;经过每个pooling层后,featuremap的宽高变为之前的一半。(经过relu层也不变)
综上,一个MxN大小的图片经过Convlayers之后生成的featuremap大小为(M/16)x(N/16)
3. RPN(区域生成网络)
RPN的基本思想是在特征图上找到所有可能的目标候选区域,通过在原始的网络结构上添加卷积层和全连接层、在每个位置上标定回归目标边界框和预测目标分数,提升边界框的生成速度。RPN结构如图1所示.RPN采用的是滑动窗口机制,每个滑动窗口都会产生1个短的特征向量输入到全连接层中进行位置和类别的判断,在每个滑动窗口位置同时预测多个候选区域,其中每个位置的预测候选区域的数量为k个.因此,回归层具有4k个输出,编码k个框的4个坐标,分类层输出2k个评分,预测每个区域所属目标的概率和所属背景的概率.k个候选框被参数化,称为k个锚点.为了使算法更好地适用于不同形状和尺寸的目标,网络将特征图上的每个位置设置多个锚点,以预测输入图像的不同尺度和不同长宽比的候选区域.
图4
(1)上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的boundingboxregression偏移量,以获得精确的proposal。
(2)最后的Proposal层是RPN里最后一个步骤,负责综合positiveanchors和对应boundingboxregression偏移量获取修正后的proposals,同时剔除太小和超出边界的proposals。其实整个网络到了ProposalLayer这里,就完成了相当于目标定位的功能。(只差分具体类别,还有更精准的再次框回归)其输入有三个:
cls层生成的(M/16)x(N/16)x2k向量
reg层生成的(M/16)x(N/16)x4k向量
im_info=[M,N,scale_factor]
(3)RPN网络实现流程:
·利用reg层的偏移量,对所有的原始anchor进行修正
·利用cls层的scores,按positivesocres由大到小排列所有anchors,取前topN(比如6000个)个anchors。针对每一个anchor(锚)生成两个概率,一个是它为背景的概率,一个是它为前景的概率,所以K个anchor就会生成2k个scores;针对每一个anchor又会生成4个边界框回归参数,所以K个anchor就会生成4k个coordinates。
·边界处理,把超出图像边界的positiveanchor超出的部分收拢到图像边界处,防止后续RoIpooling时proposals超出边界。
·剔除尺寸非常小的positiveanchor
·对剩余的positiveanchors进行NMS(非极大抑制)
·最后输出一堆proposals左上角和右下角坐标值([x1,y1,x2,y2]对应原图MxN尺度)
综上所述,RPN网络总结起来其实就上面四个小标题:
生成anchors–>softmax分类器提取positiveanchors–>bboxregression回归positiveanchors生成偏移量–>生成最终Proposals
(4)在第一步得到的特征图上使用一个滑动窗口在featuremap上进行滑动,每滑动到一个位置上,就生成一个一维的向量,在这个向量的基础上再通过两个全连接层分别去输出目标概率以及它的边界框回归参数。RPN具体网络实现流程如下:
·滑动窗口使用3*3的卷积层,stride(步长)为1,padding(填充)为1,这样滑动窗口就能够把每一个点覆盖到
·通过3*3卷积后又生成了一个高度\宽度\深度和featuremap(特征图)一样的特征矩阵
·在所得到的特征矩阵上并连两个1*1的卷积层来实现对于类别的预测和边界框回归参数的预测。对于预测类别分支采用卷积核大小为1*1,卷积核个数为2k的卷积层来进行处理;对于预测回归参数分支采用卷积核大小为1*1,卷积核个数为4k的卷积层来进行处理
图5
(5)RPN进行端到端训练以生成高质量的区域提议,FastR-CNN使用这些区域提议进行检测。通过共享RPN和FastR-CNN的卷积特征,进一步将RPN和FastR-CNN 合并成一个单独的网络。
(6)一维向量元素的个数是根据所使用的backbone的输出特征矩阵的深度来确定的。将ZF网络作为FasterR-CNN的backbone时,他生成的特征图的channel(深度)是等于256,将VGG16网络作为FasterR-CNN的backbone时,他生成的特征图的channel(深度)是等于512。
(7)RPNMulti-taskloss(损失函数)
4. Anchor(锚)
图6
对于特征图上的每一个3*3的滑动窗口,首先计算它的中心点在原图上所对应的位置,原图中每一个小方格就代表一个pixel(像素)。首先在原图上找到特征图上对应的这个点:分别将原图的宽度和高度的(x,y)坐标。再以这个点为中心去计算出k个anchorboxes,这里每个anchorbox都是给定的大小以及长宽比例,例如原图中的黄色,红色,蓝色三个anchor。以这个点为中心生成的一系列anchor可能包含我们所要检测的目标,也可能不包含。过程如下:
图7
三种尺度(anchor面积){128^2,256^2,512^2}。三种比例{1:1,1:2,2:1}每个位置(每个滑动窗口)在原图上都对应有3*3=9anchor。例如图4中红色部分对应的是256^2面积的三个比例的anchor。
对于ZF感受野:171对于VGG感受野:228。但为什么感受野的尺度比anchor的尺度小依旧还能预测出相应大的边界框呢?通过一个小的感受野预测一个比他大的目标的边界框是有可能的,比如人类可以通过经验看到目标的一部分也能大概的猜出目标的完整区域。
对于一张1000*600*3的图像,大约有60*40*9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。在使用RPN生成的相应边界框回归参数将这6k个anchor调整成为6k个proposal(候选框),注意这里的anchor和proposal不是一个东西,这些候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制筛选掉存在大量重叠的部分,IoU设为0.7,这样每张图片只剩2k个候选框,正好和SS算法所提供的个数差不多了。
5. RoIpooling
(1)ROIPooling两个输入
RoIPooling层负责收集proposal,并计算出proposalfeaturemaps(从convlayers后的featuremap中扣出对应位置),输入有两个:
·convlayers提出的原始特征featuremap,大小(M/16)x(N/16)
·RPN网络生成的Proposals,大小各不相同。一堆坐标([x1,y1,x2,y2]
(2)为什么需要RoIpooling
全连接层的每次输入特征size必须是相同的,而这里得到的proposal大小各不相同。传统的有两种解决办法:
·从图像从crop(裁剪)一部分送入网络
·将图像wrap(resize)成需要的大小送入网络
很明显看到,crop会损失图像完整结构信息,wrap会破坏图像原始形状信息。因此,需要一种能够把所有图像大小整合到一起又不会简单粗暴造成破坏的方法,这里使用的是RoIpooling,由SSP(SpatialPyramidPooling)发展而来。
(3)RoIpooling原理
RoIpooling会有一个预设的pooled_w和pooled_h,表明要把每个proposal特征都统一为这么大的featuremap
·由于proposals坐标是基于MxN尺度,先映射回(M/16)x(N/16)尺度
·再将每个proposal对应的featuremap区域分为pooled_wxpooled_h的网格
·对网格的每一部分做maxpooling
·这样处理后,即使大小不同的proposal输出结果都是pooled_wxpooled_h固定大小,实现了固定长度输出,如图8所示:
图8
6. ClassificationandRegression
注意这里的分类和RPN中的分类不同,RPN中只是二分类,区分目标还是背景;这里的分类是要对之前的所有positiveanchors识别其具体属于哪一类。
图8
从RoIpooling处获取到pooled_wxpooled_h大小的proposalfeaturemap后,送入后续网络,做两件事:
(1)通过全连接层和softmax对所有proposals进行具体类别的分类(通常为多分类)。举例说明:
假设pooled_w和pooled_h都为7,那么这些proposals在经过RoIpooling后的特征向量维度为[7,7,256],假设一共输出了300个proposals,那么所有的proposals组合起来维度就是[300,7,7,256],经过最后一个全连接层之后(会有拉平操作),维度应该是[300,类别数],则该向量就能反应出每个proposal属于每一类的概率有多大。最终就知道每个proposal是属于哪一类,根据proposal索引来找到具体是图上哪个proposal。
(2)再次对proposals进行boundingboxregression,获取更高精度的最终的predictedbox。举例说明:
同上,假设一共输出了300个proposals,回归这里的全连接层输出维度应该是[300,4],4还是代表偏移量。最终用proposal原始坐标加上偏移量,修正得到最最最终的predictedbox结果。
7. FasterR-CNN训练
图9
在现在所使用的FasterR-CNN网络是直接采用RPNLoss+FastR-CNNLoss的联合训练方法;而原论文中采用分别训练RPN以及FastR-CNN的方法。FasterRCNN由于是two-stage检测器,训练要分为两个部分进行,一个是训练RPN网络,一个是训练后面的分类网络。整个训练过程步骤为:
·第一步:先使用ImageNet的预训练权重初始化RPN网络的共享conv层(RPN特有层可随机初始化),然后训练RPN网络。训练完后,共享conv层和RPN特有层的权重都更新了。
·第二步:根据训练好的RPN网络拿到proposals,和测试过程一样。
·第三步:再次使用ImageNet的预训练权重初始化FasterRCNN网络的贡献conv层(FasterRCNN特有层随机初始化),然后训练FasterRCNN网络。训练完后,共享conv层和FasterRCNN特有层的权重都更新了。
·第四步:使用第三步训练好的共享conv层和第一步训练好的RPN特有层来初始化RPN网络,第二次训练RPN网络。但这次要把共享conv层的权重固定,训练过程中保持不变,只训练RPN特有层的权重。
·第五步:根据训练好的RPN网络拿到proposals(和测试过程一样)
·第六步:依然使用第三步训练好的共享conv层和第三步训练好的FasterRCNN特有层来初始化FasterRCNN网络,第二次训练FasterRCNN网络。同样,固定conv层,只finetune特有部分。
8. 训练数据的采样(正样本,负样本)
对于每张图片从上万个anchor中采样256个anchor,这其中是由正样本和负样本组成,他们的比例大概是在1:1左右,如果正样本个数不足128个,那么就用负样本进行填充。
·定义正样本的方式:
(1)找到与ground-truthbox(真实框,也就是最终的正确结果)IoU(一种测量在特定数据集中检测相应物体准确度的一个标准,也就是anchor与ground-truthbox重叠部分的概率)值>0.7的anchor
(2)若没有IoU>0.7的anchor,则寻找重叠部分最大的anchor
·定义负样本的方式:
(1)与所有ground-truthbox的IoU值<0.3的anchor
9. 总结
(1)FasterR-CNN背景
FasterR-CNN是作者RossGirshick继FastR-CNN后的又一力作,同样使用VGG16作为网络的backbone,推理速度在GPU上达到了5fps,(每秒钟能检测5张图片,而且还包括了候选区域生成的部分),准确率也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。FasterR-CNN的核心在于RPN(区域生成网络)。
(2)R-CNN,FastR-CNN,FasterR-CNN框架比较
分为三部分:一部分单独使用SS算法生成Regionproposal;Featureextraction也是通过一个单独的CNN得到;Classification,Bounding-boxregression也分别是单独训练但同时进行
分为两个部分:一部分单独使用SS算法生成Regionproposal;而Featureextraction,Classification,Bounding-boxregression这三部分是在一个CNN网络当中进行实现的
Regionproposal,Featureextraction,Classification,Bounding-boxregression这四个部分全部融合在CNN网络中,所以这是一个整体实现端对端的过程,框架越来越简洁了
(3)FasterRCNN优点
·性能优越
FasterRCNN通过两阶段加上RPN,实现高精度的检测性能。
·两阶段网络
相较于其他一阶段的检测网络,两阶段的网络更加的精准,更加可以解决多尺度、小目标问题。
·通用性和鲁棒性
FasterRCNN在多个数据集上表现优秀,且容易进行迁移,对数据集中的目标类进行更改就可以很好的改变测试模型。
·可优化点很多
对于实验的人员来说,该模型可以进行改进的地方很多,网络的算法的优化空间很大
·代码全面
基于各种深度框架的FasterRCNN代码都实现了开源,方便使用
(4)FasterRCNN缺点
·卷积提取网络
不论使用VGGNet还是ResNet,其提取到的特征图都是单层的,分辨率也比较小。因此对于那些多尺度、小目标的问题,使用多层融合的特征图或者增大特征图的分辨率都是可以优化的方向。
·NMS
在RPN产生Proposal时候为了避免重叠的候选框,以分类得分为标准,使用了NMS进行后处理。事实上,该方法对于遮挡的目标很不友好,即有可能是两个目标的Proposal很可能会被过滤掉一个,造成漏检,因此改进这个NMS模式也是可以带来检测性能提升。
·RoIPooling
FasterRCNN的原始RoIpooling两次取整会带来精度的丢失,因此改变这个定位池化或者特征尺度输出的问题也需要改进,后续的MaskRCNN针对这点,提出了RoIAlign,提升了精度。
·全连接
原始的FasterRCNN最后使用的全连接层,占据了很大一部分的参数量,并且所有保留的RoIpooling处理过RoI都会经过这个全连接,并且都是单独计算的,他们之间并没有共享计算。如何取代这部分全连接网络,实现更加轻量的网络是需要研究的方向。
·正负样本
在RPN和RCNN都会通过超参数来限制正负样本的个数来保证样本的均衡。筛选Proposal得到RoI时候,会选择不超过64个正样本,负样本比例基本满足是正样本的3倍。在RCNN时也最多存在64个正样本进行回归计算,负样本不参与回归。事实上,对于不同任务和数据,这种直接限定正、负样本数量的均衡方法是否都是最有效的也值得研究。
·两阶网络
FasterRCNN的RPN和RCNN两阶段分工明确,带来精度提升,但是两阶段的速度明显相较于单阶段是慢的,实际运用并未实时。因此网络阶数也值得讨论,单阶是否可以使网络更快,更多阶能否使网络精度更高等。