Fast R-CNN的不足
- 选取区域使用的算法是固定的,不参与学习
- 选取区域的算法本身消耗比较高 (搜索选择法)
- 选取区域的算法选出来的区域大部分都是重合的,并且只有很小一部分包含我们想要识别的对象
- 区域范围的精度比较低 (即使经过调整)
- 判断分类有时只能使用部分包含对象的区域 (例如选取区域的算法给出左半张脸所在的区域,那么就只能使用左半张脸判断分类)
Faster-RCNN 是 RCNN 和 Fast-RCNN 的进化版,最大的创新是引入了区域生成网络 (RPN - Region Proposal Network),区域生成网络支持使用机器学习代替固定的算法找出图片中可能包含对象的区域,精度比固定的算法要高很多,而且速度也变快了。
从R-CNN到Fast R-CNN,再到本文的Faster R-CNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。所有计算没有重复,完全在GPU中完成,大大提高了运行速度。
Faster R-CNN可以简单地看做“区域生成网络(RPN)+Fast RCNN“的系统,用区域生成网络代替Fast R-CNN中的Selective Search方法
Faster R-CNN的网络框架
如上图所示,Faster R-CNN网络框架可以分为4大部分,分别是(1)骨干卷积网络层(conv layers)用于提取特征图(2)区域推荐网络(Region Proposal Network)输出图像上的anchor类别和第一次调整边界框位置;(3)RoI池化层输出统一尺度的候选框特征图;(4)分类器(classifier)用于输出候选框的类别同时第二次回归边界框的精确位置;
上图是以VGG16为骨干网络的Faster R-CNN模型的网络结构,再进一步的观察4个部分的模型细节:
(1)骨干卷积网络层(conv layers):首先预处理将尺寸为P*Q的图像转变为M*N的图像,然后将此图像送入骨干网络提取特征,骨干网络包含了13个conv层+13个relu层+4个pooling层(卷积层和池化层的设置可根据选用的骨干网络切换),然后输出特征图,该特征图共享用于后面的RPN和ROI层;
(2)区域推荐网络(Region Proposal Network):该部分首先利用3*3的卷积层进一步对特征图进行提取,然后送入2个分支,第一个分支为1*1*18的卷积层(18是通道数,后面为解释实际意义),然后经过softmax输出边界框内二分类是否含有物体(positive或者negative);第二个分支为1*1*36的卷积层,回归输出确定边界框(bounding box regression);
(3)RoI池化层:该部分利用骨干卷积网络层输出的特征图(feature maps)和区域推荐网络输出的候选框(proposals),结合图像缩放尺度等信息,输出推荐候选框对应的固定尺寸特征图(proposal feature maps);
(4)分类器和回归层:该部分根据ROI池化层输出的特征图,经过全连接层输出候选框的位置(bounding box regression)和具体类别(多分类)。
下面我们将详细地学习一下这4个部分的细节。
Fast R-CNN的输入
和 Fast-RCNN 一样,Faster-RCNN 也会使用 CNN 模型针对整张图片生成各个区域的特征,所以我们需要缩放原图片。(尽管 CNN 模型支持非固定大小的来源,但统一大小可以让后续的处理更简单,并且也可以批量处理大小不一样的图片。)
骨干卷积网络conv layers
如前面所说,骨干卷积网络一般直接借用VGG,ResNet等网络结构,包含了conv,pooling,relu三种网络层,值得注意的有下面2点:
(1)特征图尺寸的变化:骨干网络中,conv层一般只卷积提取特征,通过padding填充使得特征图的宽高尺寸不会变化,而池化pool层一般会使得宽高尺寸缩小2倍。
以VGG16模型为例:
Conv layers部分共有13个conv层,13个relu层,4个pooling层,所有的conv层的设置都是:kernel_size=3