来自:动手学深度学习
视频讲解:Faster R-CNN原理 、源码解析
1、R-CNN
R-CNN ⾸先从输⼊图像中选取若⼲(例如2000个)提议区域(如锚框也是⼀种选取方法),并标注它们的类别和边界框(如偏移量)。[Girshick et al., 2014] 然后,⽤卷积神经⽹络对每个提议区域进⾏前向计算以抽取其特征。接下来,我们⽤每个提议区域的特征来预测类别和边界框。
具体来说,R-CNN包括以下四个步骤:
- 对输⼊图像使⽤ 选择性搜索来选取多个⾼质量的提议区域 [Uijlings et al., 2013] 。这些提议区域通常是在多个尺度下选取的,并具有不同的形状和⼤小。每个提议区域都将被标注类别和真实边界框。
- 选择⼀个预训练的卷积神经⽹络,并将其在输出层之前截断。将每个提议区域变形为⽹络需要的输⼊尺⼨,并通过前向计算输出抽取的提议区域特征。
- 将每个提议区域的特征连同其标注的类别作为⼀个样本。训练多个⽀持向量机对⽬标分类,其中每个⽀持向量机⽤来判断样本是否属于某⼀个类别。
- 将每个提议区域的特征连同其标注的边界框作为⼀个样本,训练线性回归模型来预测真实边界框。
- 尽管 R-CNN 模型通过预训练的卷积神经⽹络有效地抽取了图像特征,但它的速度很慢。想象⼀下,我们可能从⼀张图像中选出上千个提议区域,这需要上千次的卷积神经⽹络的前向计算来执⾏⽬标检测。这种庞⼤的计算量使得 R-CNN 在现实世界中难以被⼴泛应⽤。
2、Fast R-CNN
R-CNN 的主要性能瓶颈在于,对每个提议区域,卷积神经⽹络的前向计算是独⽴的,而没有共享计算。由于这些区域通常有重叠,独⽴的特征抽取会导致重复的计算。Fast R-CNN [Girshick, 2015] 对 R-CNN 的主要改进之⼀,是仅在整张图象上执⾏卷积神经⽹络的前向计算。
它的主要计算如下:
- 与 R-CNN 相⽐,Fast R-CNN ⽤来提取特征的卷积神经⽹络的输⼊是整个图像,而不是各个提议区域。此外,这个⽹络通常会参与训练。设输⼊为⼀张图像,将卷积神经⽹络的输出的形状记为 1×c×h1×w1。
- 假设选择性搜索⽣成了n个提议区域。这些形状各异的提议区域在卷积神经⽹络的输出上分别标出了形状各异的兴趣区域。然后,这些感兴趣的区域需要进⼀步抽取出形状相同的特征(⽐如指定⾼度h2和宽度w2),以便于连结后输出。为了实现这⼀⽬标,Fast R-CNN 引⼊了 兴趣区域 (RoI) 池化层:将卷积神经⽹络的输出和提议区域作为输⼊,输出连结后的各个提议区域抽取的特征,形状为n × c × h2 × w2。
- 通过全连接层将输出形状变换为n × d,其中超参数d取决于模型设计。
- 预测n个提议区域中每个区域的类别和边界框。更具体地说,在预测类别和边界框时,将全连接层的输出分别转换为形状为 n × q(q 是类别的数量)的输出和形状为 n × 4 的输出。其中预测类别时使⽤softmax 回归。
在Fast R-CNN 中提出的兴趣区域汇聚层与 6.5节 中介绍的汇聚层有所不同。在汇聚层中,我们通过设置池化窗口、填充和步幅的⼤小来间接控制输出形状。而兴趣区域汇聚层对每个区域的输出形状是可以直接指定的。例如,指定每个区域输出的⾼和宽分别为 h2 和 w2。对于任何形状为 h × w 的兴趣区域窗口,该窗口将被划分为 h2 × w2 ⼦窗口⽹格,其中每个⼦窗口的⼤小约为(h/h2) × (w/w2)。在实践中,任何⼦窗口的⾼度和宽度都应向上取整,其中的最⼤元素作为该⼦窗口的输出。因此,兴趣区域汇聚层可从形状各异的兴趣区域中均抽取出形状相同的特征。
3、Faster R-CNN
为了较精确地检测⽬标结果,Fast R-CNN 模型通常需要在选择性搜索中⽣成⼤量的提议区域。Faster R-CNN [Ren et al., 2015] 提出将选择性搜索替换为 区域提议⽹络(region proposal network),从而减少提议区域的⽣成数量,并保证⽬标检测的精度。
与Fast R-CNN 相⽐,Faster R-CNN 只将⽣成提议区域的⽅法从选择性
搜索改为了区域提议⽹络,模型的其余部分保持不变。具体来说,区域提议⽹络的计算步骤如下:
- 使⽤填充为1的 3 × 3 的卷积层变换卷积神经⽹络的输出,并将输出通道数记为 c。这样,卷积神经⽹络为图像抽取的特征图中的每个单元均得到⼀个⻓度为 c 的新特征。
- 以特征图的每个像素为中⼼,⽣成多个不同⼤小和宽⾼⽐的锚框并标注它们。
- 使⽤锚框中⼼单元⻓度为 c 的特征,分别预测该锚框的⼆元类别(含⽬标还是背景)和边界框。
- 使⽤⾮极⼤值抑制,从预测类别为⽬标的预测边界框中移除相似的结果。最终输出的预测边界框即是兴趣区域汇聚层所需的提议区域。
值得⼀提的是,区域提议⽹络作为 Faster R-CNN 模型的⼀部分,是和整个模型⼀起训练得到的。换句话说,Faster R-CNN 的⽬标函数不仅包括⽬标检测中的类别和边界框预测,还包括区域提议⽹络中锚框的⼆元类别和边界框预测。作为端到端训练的结果,区域提议⽹络能够学习到如何⽣成⾼质量的提议区域,从而在减少了从数据中学习的提议区域的数量的情况下,仍保持⽬标检测的精度
4、Mask R-CNN
如果在训练集中还标注了每个⽬标在图像上的像素级位置,那么 Mask R-CNN [He et al., 2017] 能够有效地利⽤这些详尽的标注信息进⼀步提升⽬标检测的精度。
如 图13.8.5 所⽰,Mask R-CNN 是基于 Faster R-CNN 修改而来的。具体来说,Mask R-CNN 将兴趣区域汇聚层替换为了 兴趣区域 (RoI) 对⻬层,使⽤ 双线性插值(bilinear interpolation)来保留特征图上的空间信息,从而更适于像素级预测。兴趣区域对⻬层的输出包含了所有与兴趣区域的形状相同的特征图。它们不仅被⽤于预测每个兴趣区域的类别和边界框,还通过额外的全卷积⽹络预测⽬标的像素级位置。
补充:ROI Align 和 ROI Pooling
这两个都是用在rpn之后的。具体来说,从feature map上经过RPN得到一系列的proposals,大概2k个,这些bbox大小不等,如何将这些bbox的特征进行统一表示就变成了一个问题。即需要找一个办法从大小不等的框中提取特征使输出结果是等长的。最开始目标检测模型Faster RCNN中用了一个简单粗暴的办法,叫ROI Pooling。该方式在语义分割这种精细程度高的任务中,不够精准,由此发展来了ROI Align。
ROI Pooling:
假如现在有一个8×8的feature map,现在希望得到2×2的输出,有一个bbox坐标为[0,3,7,8]。
这个bbox的w=7,h=5,如果要等分成四块是做不到的,因此在ROI Pooling中会进行取整。就有了上图看到的h被分割为2,3,w被分割成3,4。这样之后在每一块(称为bin)中做max pooling,可以得到下图的结果。
这样就可以将任意大小bbox转成2×2表示的feature。
ROI Pooling需要取整,这样的取整操作进行了两次,一次是得到bbox在feature map上的坐标时。
例如:原图上的bbox大小为665×665,经backbone后,spatial scale=1/32。因此bbox也相应应该缩小为665/32=20.78,但是这并不是一个真实的pixel所在的位置,因此这一步会取为20。0.78的差距反馈到原图就是0.78×32=25个像素的差距。如果是大目标这25的差距可能看不出来,但对于小目标而言差距就比较巨大了。
ROI Align
因此有人提出不需要进行取整操作,如果计算得到小数,也就是没有落到真实的pixel上,那么就用最近的pixel对这一点虚拟pixel进行双线性插值,得到这个“pixel”的值。
- 将bbox区域按输出要求的size进行等分,很可能等分后各顶点落不到真实的像素点上
- 没关系,在每个bin中再取固定的4个点(作者实验后发现取4效果较好),也就是图二右侧的蓝色点
- 针对每一个蓝点,距离它最近的4个真实像素点的值加权(双线性插值),求得这个蓝点的值
- 一个bin内会算出4个新值,在这些新值中取max,作为这个bin的输出值
- 最后就能得到2×2的输出