1、RCNN(2014年10月)
(1)RCNN网络结构
(2.1)RCNN流程1:生成候选框
在原始图像上,使用selective search算法,生成约2000个候选框。
(2.2)RCNN流程2:提取特征
使用AlexNet卷积网络进行特征提取,串行,每个候选框一个卷积。
(2.3)RCNN流程3:SVM分类及候选框回归
串行,每个候选框对应一组SVM分类器和一个回归器。
(3.1)RCNN可优化1:selective search生成候选框速度太慢
一张图,生成约2000个候选框,需要大概2s。
(3.2)RCNN可优化2:多个卷积串行提取特征速度太慢
一张图2000个候选框,每个候选框对应一个卷积网络,需要47s。
2、Fast RCNN(2015年9月)
(1)Fast RCNN网络结构
(2.1)Fast RCNN改进1:共享卷积
取代RCNN串行提取特征方式,采用一个卷积网络提取全图特征。
(2.2)Fast RCNN改进2:RoI Pooling层(SPP)
RoI池化层实质上就是单层的SPP模块。
SPP(Spatial Pytamid Pooling,空间金字塔池化)模块,位于卷积层和全连接层之间,用于接收任意尺寸的输入、提取其特征并产生固定大小的输出。
SPP将最后一层卷积层输出的特征图分割成不同尺寸的网络,分别为4x4,2x2,1x1,然后对每个小格子进行max pooling,将池化后的结果连接起来,就能得到(16+4+1)x 256的固定长度的输出。
(2.3)Fast RCNN改进3:使用softmax代替SVM
(3)Fast RCNN可优化:selective search生成候选框太慢
仍然是在原始图像进行selective search提取候选框,然后在特征图上找到对应位置,依然是在cpu运行,尚有优化空间。
3、Faster RCNN(2016年1月)
(1)Faster RCNN网络结构
上图所示:Faster RCNN包括了三个部分,第一部分是共享的卷积层-backbone,第二部分是候选区域生成网络-RPN,第三部分是对候选区域进行分类的网络-classifier。其中,RPN与classifier部分均对目标框有修正。
(2)Faster RCNN改进1:RPN层
取代selective search在原始图像上提取候选框,加入RPN层在特征图上提取特征。
RPN为特征图上的每个点生成9个预先设置好长宽比与面积的候选框(anchor)。三种面积:128 x 128,256 x 256,512 x 512;每种面积又包含三种长宽比:1:1,1:2,2:1。
由于共享特征图的大小约为40 x 60(原始图像600 x 1000),RPN生成的初始anchor约为2w个(40 x 60 x 9)。对于生成的anchor,RPN要做的事情有两个,第一个是判断anchor是前景还是背景,第二个是为属于前景的anchor进行第一次坐标修正。
(3)Faster RCNN改进2:使用Proposal Layer进行候选框过滤
以训练过程描述,推断和训练基本一样:
首先通过RPN生成约2w个anchor(40 x 60 x 9)。
删除越界框,余约 6000(推断时进行裁剪,保留图像内部分)。
通过NMS进行过滤,余约2000。
取Top N,如Top 256。
(4)推断时间对比
4、Mask RCNN(2017年)
Mask RCNN以Faster RCNN原型,增加了一个分支用于分割任务。实例分割不仅要正确的找到图像中的objects,还要对其精确的分割。所以Instance Segmentation(实力分割)可以看做object dection(物体检测)和 semantic segmentation(语义分割)的结合。
(1)Mask RCNN网络结构
下图为Faster RCNN网络结构图(用于对比):
(2)Mask RCNN改进1:FPN提取多阶段特征进行融合
Mask RCNN使用ResNet+FPN(特征金字塔网络)进行特征提取。
顶层特征(最后一层特征图),感受野最大,特征信息最丰富,但对小物体的检测效果并不好。因此,将多个阶段的特征图融合在一起(FPN),这样既有了高层的语义特征,也有了底层的轮廓特征。
ResNet101有5个阶段(stage),C2-C5每上升一个阶段,特征图大小变为原来的1/2,通道数变为原来的2倍,取每个阶段的最后一层作为输出,即:C1(256 x 256 x 64),C2(256 x 256 x 256),C3(128 x 128 x 512),C4(64 x 64 x 1024),C5(32 x 32 x 2048)。
融合:进行加法操作。例如下图的P5+C4,P4+C3,P3+C2。加法操作前提:一是特征图大小相同;二是通道数相同。解决前提一:自上而下,使用线性插值进行上采样,得到相同大小特征图。解决前提二:使用1 x 1卷积,将通道数统一为256。
代码片段:
(3)关于生成候选框与过滤候选框(RPN、Proposal Layer)
RPN在多个特征图(P2-P6)上提取候选框,其它与Faster RCNN基本一样。Proposal Layer过滤候选框,与Faster RCNN也基本一样。
(4)关于正样本和负样本(Detection Target层)
Faster RCNN训练时,每次输入一张图像,众多候选框中,NMS>0.7的作为正例,NMS<0.3的作为负例,正例和负例各取128个框,正例不足128时,用负例补充。
Mask RCNN训练时,以0.5作为NMS阈值判断候选框为正例或负例,正例与负例比例为1:3,取400个框,即100正例,300负例。
(5)Mask RCNN改进2:RoI Align替代RoI Pooling
RoI Pooling有什么问题?
经过两次量化,使特征图对应位置不准。
以下图实例说明:
输入图像800 x 800,有一个gt(一只狗)665 x 665,经过卷积后特征图大小为25 x 25(缩小32倍)。第一次量化: gt的大小为665 / 32 = 20.78,向下取整为20;第二次量化:对gt执行7 x 7池化,20 / 7=2.86,向下取整为2。特征图上0.1像素的偏差,在原始图像上是3.2像素,那么0.8像素的偏差就是20多像素,这一点差别不容小觑。
RoI Align:
双线性插值方法,获得浮点数坐标点上的特征值。
对每个小区域(2.97 x 2.97,20.78 / 7 = 2.97)平均分成4份,再取其4个中心点位置进行Pooling。
(6)Mask RCNN改进3:增加Mask分支(语义分割)
Mask分支只做语义分割,类型预测的任务交给另一个分支。
如网络结构图所示,Mask分支包括head、FCN(全卷积网络)、Mask。