Faster RCNN将特征提取、生成候选区域、分类、回归预测整合在了一个网络中,使得综合性能有了较大提升,速度方面更为明显。
1. Faster RCNN四件套
图1-1 Faster RCNN的四部分
- Conv Layers:提取feature maps。
- Region Proposal Network(RPN):生成anchors。(1)softmax得到anchors的类别。(2)bounding box regression修正anchors回归参数。结合(1)、(2)得到更加精确的anchors。
- ROI Pooling Layers:收集Conv Layers的feature maps,并根据RPN得到的精确的anchors信息将region prospsal从feature map中提取出来。
- Classifier:prospsal feature map计算proposal的类别,并再次bounding box regression修正proposal的位置。
2. Faster RCNN的详细信息
图2-1 Faster RCNN网络结构
2.1 Conv Layers
以VGG16模型中的faster_rcnn_test.pt模型结构为例,Conv Layers中包含了13个Conv层+13个Relu层+4个Pooling层。
这里有个非常重要的信息,在conv Layers中,首先缩放至固定大小MxN(一般是800×600),然后将MxN图像送入网络;
- 所有的Conv层都是:kernel_size=3,padding=1,stride=1。
- 所有的pooling层都是:kernel_size=2,padding=0,stride=2。
根据卷积公式:
这样我们得到一个重要的信息,经过conv层,原图大小保持不变,仍然是M×N;经过pooling层,原图变成(M/2)×(N/2)大小。
一个M×N大小的矩阵经过Conv Layers变成了(M/16)×(N/16)大小。
小小知识点:kernel_size,padding,stride常用(3,1,1),(5,2,1)保持feature map不变,常用(2,3,1)缩为一半。
2.2 Region Proposal Networks(RPN)
接着我们的(M/16)×(N/16)大小的feature map一条线直达ROI Pooling层,另一条线来到了RPN的大门。
2.2.1 anchors
首先为大家介绍RPN的主角anchors,了解了一些概念之后接下去看RPN的流程就没那么晦涩了。
我们在Conv Layers最终生成了(M/16)×(N/16)大小的feature map,接着针对feature map的每个点生成9个anchors:所谓anchors实际上是一组矩阵,每行的4个值表示anchors proposal的左上角和右下角坐标,有三种尺度(面积){,,}和每种面积下三种比例{1:1,1:2,2:1},这就构成了9个anchors。
图2-2 每个位置/每个滑动窗口都会生成9个anchor boxes
如下为9个anchors的(x1,y1,x2,y2):
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
图2-3 k、2k、4k的意义
请看图2-2:
- 256-d:因为原文使用的是ZF模型,因此Conv Layers最后一层的卷积核为256,所以生成了256深度的feature map,这里的256-d的意思是feature map的每个点都是256-dimensions。那么VGG16网络的话这里就是512-d。
- 2k:假设Conv Layers最终生成的feature map上每个点有k个anchor,每个anchor要分positive(前景)和negative(背景),这就是简单的二分类,而不用具体区分前景中到底是哪一类。那么每个点有k个anchors,每个点便有2k个scores(看作前景背景的概率值好啦)。
- 4K:每个anchor还有4个回归变换量,那么每个点有k个anchors,每个点便有4k个回归变换量。
anchor一共有多少个呢?
原图M=800,N=600→Conv Layers的一张features map尺寸:(800/16)×(600/16)=50×38→Anchors个数:50×38×9=17100个≈2w个
2.2.2 RPN流程
在Conv Layers之后,rpn开始还进行了一次3×3的卷积操作,相当于每个点又融合了周围3x3的空间信息,也许是因为这样更加鲁棒。
接下来,一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积。这两条线的作用如下:
分类:上面那条线,可以看到1×1的卷积核有18个,记得我们2.2.1讲述的2k,feature map每个点9个anchors,每个anchors2个分类分数,那么W×H×(2×9)岂不是代表着一张特征图上生成的anchors的分类信息,这个3-d矩阵。
回归:下面那条线,是一张特征图上生成的anchors回归的变换信息。
这两个1×1的参数矩阵通过损失函数不断迭代训练,得到更准确的分类分数矩阵(W,H,18)和更准确的位置回归矩阵(W,H,36)。
图2-4 损失函数
为何要在softmax的前后接一个reshape layer?
保存positive/negative anchors的矩阵,其在caffe blob中的存储形式为[1,2x9,H,W]。而在softmax分类时需要进行positive/negative二分类,所以reshape layer会将其变为[1,2,9xH,W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。
2.2.3 Proposal Layer
Proposal Layer负责综合所有变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。
其实Proposal Layer还有一个输入时还有一个量:im_info,这个量保存的是Conv Layers的变换量。
Proposal Layer forward(前传函数)按照下面顺序处理,我大致总结为:
1.生成anchors。
2.对所有的anchors做bbox regression回归。
3.按照一定的比例,提取修正位置的positive anchors。
4.剔除超出图像边界、尺寸太小的anchors。
5.剩下的anchors进行NMS。
6.Proposal Layer生成proposals=[x1,y1,x2,y2]
2.3 ROI Pooling Layers
Rol pooling层有2个输入:
1.原始的feature maps
2.RPN输出的proposal boxes(大小各不相同)
进行7×7的池化操作。
2.4 Classifier
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于哪个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。