前言
目前为止都有哪些进行多尺度检测的方法呢?
- 图像金字塔(上图a)。这些“金字塔”是尺度不变的,因为通过改变在金字塔中所属的层级,可以抵消目标尺度的变化。也就是说,将图像转换为不同的尺度,每个尺度对应一个特征图,这些特征图共同组成了图像金字塔。利用图像金字塔进行多尺度检测的好处是,可以生成多尺度特征图,并且所有的特征图都包含充足的语义信息,可以获得较好的检测精度。缺点是计算量大,在训练时会占用太多内存。有一种方法是只在测试时使用图像金字塔,但这会造成训练与测试的计算不连续。因此像Fast R-CNN和Faster R-CNN都不会用图像金字塔进行检测。
- 利用深度神经网络对原始图像进行卷积和池化操作后,可以生成不同尺度的特征图(上图b),与图像金字塔不同,这是在图像的特征空间中生成的金字塔。实验表明,深层网络输出的特征图包含更多深层特征,但分辨率较低,包含的细节信息不足;而浅层网络输出的特征图虽然都是一些浅层特征,但分辨率较高,包含的细节信息较多。最终是在深层网络输出的特征图上进行检测,虽然可以准确检测出目标,但忽略了其他层的一些浅层特征,而细节信息可以更好的提高检测的精度。
- SSD是利用不同层输出的特征图进行多尺度检测(上图c)。在一个图像中可能会有大小不同的目标,因此会需要不同的特征来对它们进行检测。对于一些较小的目标可以使用较大的特征图,这样会更准确,也就是说在靠前的层就可以完成检测,而不需要向前传播经过所有层。对于一些较大的目标可以用更深层的特征图来检测。但是SSD没有使用浅层特征,它是从网络中一个较高的层(VGG中的conv4_3)开始,利用不同层的特征图来检测的。但是本文作者认为浅层特征图能更好的检测小目标。
- 为了让所有尺度的特征图都能有强语义信息,本文设计了FPN(上图d)。通过一个自顶向下的通路(passway)和横向连接(lateral connection)将浅层的高分辨率、弱语义特征与深层的低分辨率、强语义特征结合起来,从而使所有的层都有更丰富的语义信息,并且从一个单输入尺度的图像就可以快速建立FPN。FPN可以在所有的尺度上进行端到端的训练,并且在训练和测试时是被连续使用的,这一点与图像金字塔明显不同。
FPN和其他相似类型结构的区别
- 一些与FPN相似的结构采用的是自顶向下和跳层连接(skip connection)的方法(上图的上半部分)。它最终会生成一个深层特征图,并且该特征图具有精细的分辨率。也就是说经过多次上采样融合特征到最后一步,用最后一步生成的特征图做预测。
- FPN则有些不同(上图的下半部分)。FPN通过自顶向下和横向连接生成不同尺度的特征图,预测是在每一层中独立进行的。
FPN的结构
FPN采用任意大小的图像作为输入,然后输出成比例的不同大小的特征图,这是在一个全卷积网络中实现的。这个过程是独立于主网络的卷积结构的。也就是说,FPN可以应用在不同的网络结构中。本文使用的主网络是ResNet,下图是FPN的结构,通过一条bottom-up通路,一条top-down通路和横向连接来构成特征金字塔(FP,feature pyramid)。接下来对这些组成进行介绍。
1.bottom-up通路
上图左边的就是bottom-up通路,其实就是主网络中的前向计算过程。通过bottom-up会产生分层的特征,包括不同尺度的特征图,它们之间的步长是2。这其中有一些层生成的特征图大小是相同的,本文称这些层是在一个stage中的。在特征金字塔中,将每个stage定义为金字塔中的一个层级。选择每个stage的最后一层的输出作为构成特征金字塔的特征图,因为每个stage的最深层应该有最强的特征。具体来说,在ResNet中,用的是每个stage的最后一个残差块(residual block)的特征**输出。对于conv2,conv3,conv4和conv5,将这些层中最后的残差块的输出记为{},它们相对于输入图像的步长分别是{4,8,16,32},即分别对输入图像做{4,8,16,32}倍的下采样。没有用conv1是因为它占用的内存太大了。
2.top-down通路和横向连接
FPN是如何将高低分辨率的特征结合起来的呢? 将低分辨率,但是语义信息很强的高层特征做2倍的上采样,然后通过横向连接与前一层,也就是bottom-up生成的具有相同大小的特征图进行融合,从而实现高低分辨率特征的结合。
需要注意的是,将高层特征做上采样后,与前一层bottom-up生成的特征图合并时,需要将bottom-up生成的特征图用一个1×1的卷积层对通道维数进行降维,然后对两个特征图做像素间的加法。不断迭代这个过程直到生成具有最精细分辨率的特征图。为了开始这个迭代过程,需要在上加一个1×1的卷积层,以生成分辨率最低的特征图。最后,对于每个融合的特征图,需要加一个3×3的卷积来生成最终的特征图,目的是为了减少上采样带来的混叠效应(aliasing effect)。因为金字塔中的所有层级共享分类器和回归器,因此固定所有特征图中的特征维数(也就是通道数)为,也就是说所有的附加的3×3的卷积层的输出通道是256。
最终生成的特征图被记为{},与{}相对应,对应的层的空间大小是一样的。
FPN的应用
本文主要介绍了把FPN应用到RPN中生成候选框,和应用到Fast R-CNN中实现目标检测。接下来分别说一下这两部分内容。
1.FPN for RPN
在RPN中,是在一个单一尺度的特征图上滑动一个3×3的窗口,然后进行object/non-object分类和边界框回归。这是通过一个3×3的卷积层,后面跟着两个同级的1×1的卷积层来实现的,这两个1×1的卷积层分别负责分类和回归。本文将这两种卷积层的组合称为head。
为了将FPN应用到RPN中,首先用FPN替换那个单一尺度的特征图,然后向特征金字塔的每个层级添加一个head。因为head在所有层级的所有位置上滑动的区域很密集,因此没必要在每个层级上设定多尺度的anchor。作者在特征金字塔的每个层级只设定了一种尺度的anchor,它们在{}上的大小分别为{}。在每个层级中的anchor有3种长宽比{1:2,1:1,2:1},因此在特征金字塔上共有15个anchor。
如果一个anchor与一个给定的真实框(ground-truth box)有最大的IoU,或者一个anchor与任一个真实框的IoU大于0.7,那么这个anchor就是正样本。如果一个anchor与所有真实框的IoU低于0.3,那么这个anchor就是负样本。注意,真实框的尺度与特征金字塔的层级无关,真实框与anchor关联,而anchor与特征金字塔的层级关联。
在特征金字塔的所有层级上,head的参数是共享的,这也使模型拥有良好的性能,这说明特征金字塔的所有层级共享相似的语义层级。
2.FPN for Fast R-CNN
在Fast R-CNN中,RoI(region of interest)池化层用来提取特征。为了在Fast R-CNN中应用FPN,需要将不同尺度的RoI与特征金字塔的不同层级相关联。对于一个宽为w,高为h的RoI来说(RoI在输入图像上的宽和高),它所对应的特征金字塔层级应该为:
224是在ImageNet上进行预训练时标准的输入图像的大小,表示大小为224×224的RoI应该被映射到的特征金字塔的层级。在Faster R-CNN中用层的输出作为最后用来处理的特征图,因此这里设为4。上式意味着,当RoI的尺度变得更小时(比如224的一半),那么它应该被映射到分辨率更高的层级中(k=3)。也就是说,最好用高分辨率的特征图来检测较小的目标。
在Fast R-CNN中,head是特定类的分类器和边界框回归。同在RPN中一样,向所有层级的所有RoI添加head,同样,所有的head共享参数,无论它们处于哪个层级中。然后采用RoI池化层从RoI中提取7×7的特征图,并且在最终的分类和边界框回归之前添加两个1024维的全连接隐层(hidden layers),这些隐层是随机初始化的,因为在ResNet中没有可用的经过预训练的全连接层。