Faster R-CNN,论文名称:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,原文链接
同样使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。该算法在fast rcnn基础上提出了RPN候选框生成算法,使得目标检测速度大大提高。
Faster R-CNN 算法流程可分为3个步骤:
其实 Faster R-CNN = RPN + Fast R-CNN,在Faster R-CNN中,就是使用了RPN结构替代了SS算法,其余操作基本和Fast R-CNN一样。
所以,由图可以看见,Faster R-CNN有RPN结构与Fast R-CNN结构构成,也就是其损失包含了两个部分,分别是RPN的损失与Fast R-CNN的损失。这这两种损失又包含分类损失与边界框回归损失,详情见下文。
ILSVRC 2013获胜者是来自Matthew Zeiler和Rob Fergus的卷积网络。它被称为ZFNet(Zeiler&Fergus Net的简称)。这是对AlexNet的改进,通过调整架构超参数,特别是通过扩展中间卷积层的大小。论文链接
ILSVRC历届冠军网络介绍以及CNN的大致演化过程
ZFNet是在AlexNet基础上进行了一些细节的改动,网络结构上并没有太大的突破,只是在卷积核和步幅上面做了一些改动
从上面可以看出,ZFNet相较于AlexNet的改进主要在两点:
所以如果是Faster R-CNN中采用的backbone是ZFNet,最后的channel是256;如果采用的backbone是VGG,最后的channel是512。
ps:
ZFNet论文中的主要工作:
(1)使用一个多层的反卷积网络来可视化训练过程中特征的演化及发现潜在的问题;
(2)同时根据遮挡图像局部对分类结果的影响来探讨对分类任务而言到底那部分输入信息更重要。
其他的详细介绍见:链接,也就是参考资料的第一个链接。
在分析CNN网络时,通常会考虑到网络的感受野,感受野是指特征图上一个像素点代表原图的多大区域像素点,一般网络感受野越大,提取到的特征就更高维,网络性能也越好。其实CNN中的池化层,或者说下采样层就是为了提高网络的感受野,提高网络的感受野的代价就是会丢弃部分信息。(空洞卷积就是为了解决这个问题而提出的)
感受野变化
上图是一个4x4的特征图经过一个3x3的卷积操作后,再经过一次2x2池化操作后,感受野的大小变化。很明显可以看出,卷积操作后,得到的每个像素,都对应原图一个3x3的区域,我们称该层的感受野为3x3(相对于输入特征图) ,而池化后输出的一个像素点,对应卷积输出特征图上一个2x2的区域,对应了输入特征图上一个4x4的区域(有2x2的重叠部分,如果stride比较大,重叠部分会变小,区域会变大,如果stride=3,没有重叠,那么对应的区域是6x6),我们称该层对应上一层的感受野为2x2,对应输入特征图的感受野是4x4。从图中可以看出,感受野的大小和是否填充没有关系(如果非要说有关系,只能说有些情况下边缘信息会部分丢失,造成视野变小,视野和感受野概念还是有点区别的),和核的大小,滑动步长有关系(图不好画,没有画出滑动步长大于1的情况,其实很容易类推出来)。
一般我们说一个网络的感受野,通常是指网络的顶部一个像素对应输出图像的多少像素区域,所以计算方式都是从网络顶部一直往输入层推算。
现在计算Faster RCNN中ZF网络feature map 中3x3滑动窗口在原图中感受野的大小。计算公式为:F(i) = [F(i + 1) - 1] x Stride + Ksize
所以,经过计算,对于ZF网络来说其感受野:171,同样的计算可以得到VGG的感受野为:228
RPN的实现方式:在conv5-3的卷积feature map上用一个n * n的滑窗(论文中作者选用了n=3,即3 * 3的滑窗)生成一个长度为256(对应于ZF网络)或512(对应于VGG网络)维长度的全连接特征.然后在这个256维或512维的特征后产生两个分支的全连接层:
sliding window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间.事实上,作者用全连接层实现方式介绍RPN层实现容易帮助我们理解这一过程,但在实现时作者选用了卷积层实现全连接层的功能.
全连接层本来就是特殊的卷积层,如果产生256或512维的fc特征,事实上可以用Num_out=256或512, kernel_size=3 * 3, stride=1的卷积层实现conv5-3到第一个全连接特征的映射.然后再用两个Num_out分别为2 * 9=18和4 * 9=36,kernel_size=1 * 1,stride=1的卷积层实现上一层特征到两个分支cls层和reg层的特征映射.采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活.在RPN网络中,我们需要重点理解其中的anchors概念,Loss fucntions计算方式和RPN层训练数据生成的具体细节.
ps:这里2 * 9中的2指cls层的分类结果包括前后背景两类(注意,如图0.1表示该图为背景的概率,而0.9表示该图为前景的概率。只是预测是前景还是背景,这里并没有具体的对其进行分类,是人也好车也好,只要是所需检测的内容就都是被归类为前景。否则全部归为背景。),4 * 9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数.而这里的9表示的是特征图上每个特征点的anchor boxes数。
同样的,边界框回归得到的这一组数个参数,分贝是中心点的偏移连与宽度与高度的调整。通过边界框回归参数的调整,我们希望尽可能的使得这些anchor可以尽可能的准确框选出我们的目标。
Anchors:字面上可以理解为锚点,位于之前提到的n * n的sliding window的中心处.。对于一个sliding window,我们可以同时预测多个proposal,假定有k个.k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定.所以,我们在后面说一个anchor,你就理解成一个anchor box 或一个reference box.作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4 * k个reg-layer的输出和 2 * k个cls-layer的score输出.对于一幅W * H的feature map,对应W * H * k个锚点.所有的锚点都具有尺度不变性.
其中:3种scales(尺度面积)为:1282,2562 ,5122 (经验所得);3种aspect_ratio(长宽比)为:1:1, 1:2, 2:1,也就是每个位置在原图上都对应有3x3=9 anchor box .
而这里为什么要给出这么多个不同比例尺寸的anchor呢?因为我们所需检测的目标的大小的尺寸与长宽比都是不一样的,所以需要通过一系列的anchor来准确的预测其位置。
前面有讲到过,对于ZF网络来说,其感受野的大小是171 * 171的,而VGG网络的感受野大小是228 * 228的,其为什么能预测比他尺寸还要大的目标边界框呢?论文指出,通过一个较小的感受野是有可能预测出一个比较大的尺寸区域的。因为,看见一个物体的一部分,也可以大概的猜测出这个目标的一个完整的位置区域的。实际使用中这个方法也是有效的。所以小的感受野范围还是可以预测的。
对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。注意这里的anchor与proposal不是同一个内容,选择是需要将anchor调整为候选框。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。现在候选框的个数就大概的与SS算法提供的候选框个数一致了。
在计算Loss值之前,作者设置了anchors的标定方法.正样本标定规则:
如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;
如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本.事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与groud truth的IoU不大于0.7,可以采用第一种规则生成.
负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本.
剩下的既不是正样本也不是负样本,不用于最终训练.
RPN训练设置:
在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1.
如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然.
训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化.
以上图为例,当第一个anchor的类别标签为1,也就是这个区域有我们所需要检测的目标,此时其预测为前景的概率为0.9,所以第一个anchor的分类损失为:-log(0.9);而当第二个anchor的类别标签为0,也就是这个区域没有我们所需检测的目标,而此时其预测为背景的概率为0.2,所以其分类损失为:-log(0.2)
RPN的边界框回归损失
这里的边界框回归损失与之前提到的Fast R-CNN中的边界框回归损失是一样的。这里的损失函数同样采用的是smoothL1损失函数
Fast R-CNN损失包括分类损失与边界框回归损失
此部分与Fast R-CNN中的部分完全一样。见链接:Fast R-CNN
其中真实目标边界框回归参数的计算公式为:
Fast R-CNN的分类损失
Fast R-CNN的边界框回归损失
注意,这个损失是由4个部分组成的。分别对应着我们回归参数 x 的smoothL1的回归损失,回归参数 y 的smoothL1的回归损失,回归参数 w 的smoothL1的回归损失与最后的回归参数 h 的smoothL1的回归损失。
而具体的smoothL1损失的计算公式为
λ 是一个平衡系数,用于平衡分类损失与边界框回归损失。
[u ≥ 1] 是艾佛森括号,也可以理解为一个计算公式。当u满足条件是,公式的值为1;而当u不满足条件时,也就是u<1时,也就是u=0时,(u为类别的标签),此时类别标签为背景,公式的值为0.
u代表了目标的真是标签,u ≥ 1表示候选区域确实属于所需检测的某一个类别当中,也就是对应着正样本。当u=0时,此时候选区域对应着为背景,不属于所需检测的某一个类别当中。那既然是背景,就没有边界框回归损失这一项了。
此4部分全部融合在cnn网络中,变成了一个整体,实现了端对端的结合。可以看见,框架越来越简介,也越来越高效。
回顾:
在Faster R-CNN中,对于一张1000x600x3的输入图像,直接输入到神经网络中得到一个特征图,此时不再使用SS算法获得候选区域,而是使用了RPN结构。对于这张1000x600x3的图像,得到的特征图大概是60x40的大小,然后此时会有大约有60x40x9(20k)个anchor,对于跨越边界的anchor不予以考虑,现在剩下6k个anchor。
而对于这些anchor或者说是候选框,仍然有大量的重叠,基于候选框的RPN结构中的分类cls得分,采用非极大值抑制,IoU设为0.7,这样剩下2k个作用的anchor。而PRN结构的边界框回归是为了这些anchor更好的调整位置,配合有效的计算iou值。而此时的剩下的这些经过筛选anchor也就是候选框proposal。与SS算法提供的候选框数量大致相同。然后将这些RPN生成的候选框投影到特征图上获得相对应的特征矩阵。
由于此时已在特征图上获得了对于候选框的特征矩阵,剩下的步骤与Fast R-CNN完全一样了。根据映射关系找到每一个候选区域的特征矩阵。将特征矩阵通过ROI Pooling层统一缩放到7*7的大小,然后将其展平处理,然后通过两个全连接层,得到ROI feature Vector。在ROI feature Vector的基础上,并联两个全连接层。其中的一个全连接层用于目标概率的预测,另外的一个全连接层用来边界框回归参数的预测。
以上是我对Faster R-CNN的结构处理流程的大致概括,如有错误恳请指教。
Faster R-CNN训练方法
直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法(推荐)
原论文中采用分别训练RPN以及Fast R-CNN的方法
参考资料: