带你一文读懂Faster RCNN论文
Faster RCNN论文解读
最近看了Faster RCNN的论文, 又参考了一篇写很好的中文博客, 现在将Faster RCNN的总体思路和实现细节记录在这篇博客, 方便以后复习。
Faster RCNN在RCNN和Fast RCNN的基础之上, 统一了特征抽取、候选区域提取、边界回归、分类, 让这个模型成为了一个端到端的模型, 并且在速度上得到了极大的提升, 让RCNN家族真正实现了Real-Time Detection。
参考文章: 一文读懂Faster RCNN
文章目录
0. Faster RCNN概览
从论文的这个图上可以看出来, Faster RCNN主要分为了四个部分:
- Conv layers: Faster RCNN先是使用了一个基础的backbone实现特征提取, 得到feature maps。该feature maps将会被共享用于后续RPN网络和全连接层。
- Region Proposal Network: RPN这个网络主要用来生成region proposals, 取代了以前selective search这种生成方式。并且这个层通过softmax来判断anchors属于positive还是negative, 再利用bounding box regression修整anchors获得精确的proposals。
- Roi Pooling: 这个层在Fast RCNN中被提出, 主要用于收集输入的feature maps和proposals将候选区域对应的feature变换到固定尺度, 送入后续的全连接层判定目标类别。
- Classification: 利用proposal feature maps计算proposals的类别, 同时再次进行bounding box regression。
下面我将详细介绍这四个部分的实现细节。
1. Conv layers
一般Conv layers包括了conv、pooling、relu三种层。在论文中提到的两种Conv layers的网络分别是VGG16和ZF model。
这个部分有个细节需要特别注意, 两个Conv layers的模型在conv的时候都采用了same padding, 而relu也不会改变feature maps的大小。这就意味着只有pooling层才会改变feature maps的大小。例如:输入一个
M
×
N
M \times N
M×N大小的图像, 经过了Conv layers的四层
2
×
2
2 \times 2
2×2的pooling之后, 得到了一个固定为
M
16
×
N
16
\frac{M}{16} \times \frac{N}{16}
16M×16N大小的feature maps, 由于只是放缩变换, 所以feature maps中的点是很容易对应到原图的点的。这一点对后续根据feature maps中的点计算其原图位置十分重要。
2. Region Proposal Networks
上图1是论文中的原图。上图2是我在参考文章中截的, 感觉把RPN画的很清楚, 就拿过来了。从上图2可以看出来, 再经过Conv layers提取特征之后,feature maps将会被送入RPN网络。这个网络分为两条线, 上面那条线通过一个
1
×
1
1 \times 1
1×1的卷积将feature maps的channel转换到一个固定尺度(即2k, k就是anchors数目, 论文中用的是9),然后通过softmax等操作判断anchors的positive和negative(一个anchor同时输出positive和negative的概率, 所以这里是2k);下面那条线则是用来预测bounding box regression中anchors的偏移量, 同样是利用了
1
×
1
1 \times 1
1×1的卷积生成了4k固定channel的feature maps, 代表了anchor在x、y、w、h这四个部分的偏移量。
3. RoI pooling
RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到RoI pooling层有两个输入:
- 原始的featurue maps
- RPN输出的region proposals(大小不同)
下面说一下RoI Pooling layer forward的过程:
- 由于proposals对应的是 M × N M \times N M×N尺度的,所以首先需要把它映射到 M 16 × N 16 \frac{M}{16} \times \frac{N}{16} 16M×16N这个feature maps的尺度。
- 再将每一个proposal划分为 p o o l e d _ w × p o o l e d _ h pooled\_w \times pooled\_h pooled_w×pooled_h的网格。
- 对每一个网格都进行max pooling操作。
这样处理之后, 大小不同的region proposals在feature maps的尺度之下, 都被统一到了 p o o l e d _ w × p o o l e d _ h pooled\_w \times pooled\_h pooled_w×pooled_h大小。
4. Classification
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别,输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
5. Faster RCNN训练
Faster RCNN的训练步骤主要分为4个步骤:
- 利用pre-trained model,训练RPN网络
- 把pre-trained model和RPN结合起来成为Faster RCNN网络,再进行训练。
- 第二次训练RPN网络。
- 把第二次训练的RPN网络和2中再训练的pre-trained model合成Faster RCNN再进行训练。