Faster R-CNN
针对Fast R-CNN的缺陷而提出。由于Fast R-CNN,采用的是Selective Search(SS),测试时的很大一部分时间要耗费在候选区域的提取上。Faster R-CNN正是为解决这个问题而提出来的。
为了更好地理解Faster R-CNN,我们先看一下其整体结构,如下图:
更为详细的图,如下:
通过上图可以看出,Faster R-CNN主要由四部分组成:
1)卷积层(conv layer),用于提取图像的特征,输入为整张图片,输出为提取得特征图feature maps;
2)RPN网络(Region Proposal Network),用于生成候选框(region proposal),这个网络代替了之前得Selective Search,输入为图片(因为这里RPN网络和Fast R-CNN共用同一个CNN,所以这里输入也可以认为是featrue maps),输出为多个候选区域;
3)ROI pooling,和Fast R-CNN一样,将不同大小得输入转换为固定长度的输出;
4)分类和回归,这一层的输出是最终目的,输出候选区域所属的类,和候选区域在图像中的精确位置。
训练过程:
- 把整张图像送入CNN中,进行feature map的提取;
- 用RPN生成Region Proposal,每张图片生成300个;
- 将Region Proposal映射到最后一层feature map;
- 在ROI pooling层把每个ROI生成固定大小的feature map.
- 利用Softmax Loss和Smooth L1 Loss对分类概率和bounding box回归联合训练。
测试过程:
1至4同;
5、用softmax Loss探测分类概率;
6、用Smooth L1 Loss探测边框回归;
7、用bounding box回归校正原来的Region Proposal,最终生成预测窗口的坐标。
1、RPN
通过上述介绍可以知道,Faster R-CNN与Fast R-CNN最大的区别就是提出了一个叫RPN(Region Proposal Networks)的网络,专门用来提取候选框,RPN可以理解为一种全卷积网络,该网络可以进行end-to-end的训练,最终目的是为了候选框的提取,如下图所示:
原文中RPN网络为CNN后面接一个3*3的卷积层,后面再接两个1*1的卷积层,其中一个是用来给softmax层进行分类,另一个用于给候选区域精确定位。
通过CNN得到的feature map怎么可以通过RPN得到与原图对应的候选区域呢?换句话说,RPN输出的候选区域和softmax的结构怎么与原图中的区域进行对应的?要解决这个疑问就得先理解anchor得概念。
2、Anchors
anchors可以理解为一些预先定义好的框框,anchors的种类用k表示,原文中k=9,由3种面积(128*128,256*256,512*512)和3种长宽比(1:1,1:2,2:1)组成,这里anchors的大小选取是根据检测时的图像定义,在检测时会将最小边缩放到600,最大边不超过1000。生成的anchors如下:
1 [[ -84. -40. 99. 55.]
2 [-176. -88. 191. 103.]
3 [-360. -184. 375. 199.]
4 [ -56. -56. 71. 71.]
5 [-120. -120. 135. 135.]
6 [-248. -248. 263. 263.]
7 [ -36. -80. 51. 95.]
8 [ -80. -168. 95. 183.]
9 [-168. -344. 183. 359.]]
因为提出的候选框区域是在原图上的区域,所以要清楚anchors在原图中的位置。假设CNN得到的featuremap大小为w*h,那总的anchors个数为9*w*h,9为上述的9种anchors。假设原图大小为W?H,由SPP-net文章详细解读知W=S?w,H=S?s,S为之前所有层的stride size相乘,所以feature map上的点乘以S即为anchors的原点位置,得到所有框的原点位置以及大小就可以得到原图上的anchors区域了。
那么RPN的输出与anchors是什么关系呢?通过下图进行讨论。
- 在原文中使用的是ZF 网络,其中Conv layer中最后的conv5层num_output=256,对应生成256张特征图(feature map),所以相当于feature map每个点都是256-dimension;
- 在conv5之后,做了rpn_conv 3*3卷积且num_output=256,相当于每个点又融合了周围3*3的空间信息,同时256-d不变;
- 假设在conv5 的feature map中每个点上有k个anchor(原文中k=9),而每个anchor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有[x,y,w,h]对应4个偏移量,所以reg=4k coordinates(scores和coordinates为RPN的最终输出);
- 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors + 128个negative anchors进行训练(至于什么是合适的anchors,请看下面的RPN训练)
3、RPN训练
RPN训练中对于正样本文章中给出两种定义。第一,与ground truth box有最大的IoU的anchors作为正样本;第二,与ground truth box的IoU大于0.7的作为正样本。文中采用的是第一种方式。文中定义的负样本为与ground truth box的IoU小于0.3的样本。
训练RPN的loss函数定义如下:
其中,i表示mini-batch中第i个anchor,Pi表示第i个anchor是前景的概率,当第i个anchor是前景时为1,反之为0,ti表示预测的bounding box的坐标,为ground truth的坐标。
看过Fast R-CNN文章详细解读文章的会发现,这部分的loss函数和Fast R-CNN一样,除了正负样本的定义不一样,其他表示时一样的。
4、RPN网络与Fast R-CNN网络的权值共享
RPN最终的目的是得到候选区域,但在目标检测的最终目的是为了得到最终的物体的位置和相应的概率,这部分功能由Fast R-CNN做的。因为RPN和Fast R-CNN都会要求利用CNN网络提取特征,所以文章的做法是使用RPN和Fast R-CNN共享同一个CNN部分。
一个是迭代的,先训练RPN,然后使用得到的候选区域训练Fast R-CNN,之后再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次训练RPN(这里不更新CNN,仅更新RPN特有的层),最后再次训练Fast R-CNN(这里不更新CNN,仅更新Fast R-CNN特有的层)。
还有一个更为简单的方法,就是end-to-end的训练方法,将RPN和Fast R-CNN结合起来一起训练,tf版本的代码有这种方式的实现。