(参考:一文读懂Faster RCNN)
1.faster rcnn整体网络结构
2.backbone层
卷积层包含:卷积、池化,激活。
- 所有的conv层都是:kernel_size=3,pad=1,stride=1
- 所有的pooling层都是:kernel_size=2,pad=0,stride=2
卷积前,对原图扩边,M*N变为(m+2)*(n+2),经过卷积后变为M*N,不改变原图大小。卷积后,M*N变为(M/2)*(N/2)。
3.rpn层
上面的那条线,是通过softmax获取前景和背景。
下面那条线,是计算对于anchors的bounding box regression偏移量,以获取精确的proposal。
最后的proposal层负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。
4.roi pooling
RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。
Rol pooling层有2个输入:
- 原始的feature maps
- RPN输出的proposal boxes(大小各不相同)
RoI Pooling layer forward过程:
- 由于proposal是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度;
- 再将每个proposal对应的feature map区域水平分为 [公式] 的网格;
- 对网格的每一份都进行max pooling处理。
这样处理后,即使大小不同的proposal输出结果都是 [公式] 固定大小,实现了固定长度输出。
5.classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:
- 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
- 再次对proposals进行bounding box regression,获取更高精度的rect box
这里来看看全连接层InnerProduct layers,简单的示意图如下:
其计算公式如下:
其中W和bias B都是预先训练好的,即大小是固定的,当然输入X和输出Y也就是固定大小。所以,这也就印证了之前Roi Pooling的必要性。
6.faster rcnn训练过程
在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:
- 在已经训练好的model上,训练RPN网络
- 利用步骤1中训练好的RPN网络,收集proposals
- 第一次训练Fast RCNN网络
- 第二训练RPN网络
- 再次利用步骤4中训练好的RPN网络,收集proposals
- 第二次训练Fast RCNN网络
可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。
RPN训练时,loss包含:
- cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
- reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。
fast rcnn训练时:
- 将提取的proposals作为rois传入网络
- 计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer