目录
参考资料:
论文:
Feature Pyramid Networks for Object Detection
博客:
Feature Pyramid Networks for Object Detection 总结
目标检测中多尺度:特征金字塔FPN_Feature Pyramid Networks for Object Detection
第1章 前言
特征金字塔
是目标识别系统能够进行 多尺度
目标识别的关键组件。 然而,最近基于深度学习的物体检测算法考虑到计算量和内存限制都尽量避免采用特征金字塔的方式。在这篇文章中,作者探索一种利用深度卷积网络本身固有的多尺度、层次结构来构造特征金字塔,它的好处是只会带来极小的额外消耗。
本文构造了一种自顶向下、带有侧向连接的层次结构来构建各个尺度的高层语义特征,这种方法称之为Feature Pyramid Network (FPN)。FPN可以作为一种通用的特征提取器,并且在多个任务上带来了显著的性能提升。将FPN应用于Faster RCNN,在COCO上达到了最佳的单模型性能。另外,FPN的推理速度在GPU上可以达到5FPS,因此是一种检测性能高,同时推理速度能达到实际使用的方法。
第2章 图像金字塔
2.1 概述
对于一张图像,若观察距离增大(相当于图像尺寸变小),随着距离的增大,图像上的小目标无法清晰看到,而图像上的大目标在一定范围内还可以看到。
- 对大目标来说,图像缩小到一定程度不会影响其检测;
- 对于小目标来说,则需要放大图像来进行检测;
所以在进行目标检测时,需要不同尺寸的图像。
2.2 图像金字塔的定义
图像金字塔是图像中多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔实际上是一张图片在不同尺度下的集合,即原图的上采样和下采样集合。金字塔的底部是高分辨率图像,而顶部是低分辨率图像。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
生成图像金字塔主要包括两种方式:向下取样和向上取样。
如下图所示:
- 向下取样:将图像从G0转换为G1、G2、G3,图像分辨率不断降低的过程;
- 向上取样:将图像从G3转换为G2、G1、G0,图像分辨率不断增大的过程。
常见两类图像金字塔:
高斯金字塔 ( Gaussian pyramid)
;拉普拉斯金字塔(Laplacian pyramid)
;
2.3 高斯金字塔 (Gaussian pyramid)
高斯金字塔是由底部的最大分辨率图像逐次向下采样得到的一系列图像。最下面的图像分辨率最高,越往上图像分辨率越低。
高斯金字塔的向下采样过程是:
-
(1)对于给定的图像先做一次高斯平滑处理,也就是使用一个卷积核对图像进行卷积操作,有多种滤波器可以选择:
- 领域滤波器:采用邻域平均值计算求原始图像的近似图像。该滤波器能够产生平均金字塔。
- 高斯滤波器:采用高斯滤波器对原始图像进行滤波,得到高斯金字塔。这是OpenCV函数cv2.pyrDown()所采用的的方式。
-
(2)然后再对图像采样,去除图像中的偶数行和偶数列,删除其偶数行和偶数列后得到一幅 N 2 × N 2 \frac{N}{2}\times \frac{N}{2} 2N×2N大小的图像。经过上述处理后,图像的大小变为原来的 1 4 \frac{1}{4} 41 。
-
(3)对这张图片循环(1)和(2)操作就可以得到高斯金字塔。
高斯金字塔的向上采样过程是:
- (1)通常将图像的宽度和高度都变为原来的2倍,向上采样的结果图像的大小是原始图像的4倍,因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值的行为,称为
插值
。该过程可以通过多种方式实现,例如最邻近插值就是使用最邻近的像素点给当前还没有值的像素点赋值。 - (2)使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值;
通过以上分析可知,向上采样和向下采样是相反的两种操作。但是,由于上下采样会丢失像素值,所以两种操作并不是可逆的。 也就是说,对一幅图像先向上采样、再向下采样,是无法恢复期原始状态的;同样,对一幅图像先向下采样、再向上采样也是无法恢复到原始状态的。
2.4 拉普拉斯金字塔(Laplacian pyramid)
用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
拉普拉斯金字塔有现成的公式:
也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。保留的是残差,为图像还原做准备。
第3章 特征金字塔网络
3.1 概述
Featurized image pyramids(图像特征金字塔)
主要在人工特征中使用,目前人工特征式微,深度学习的CNN特征成为主流,CNN特征的鲁棒性很好,刻画能力强。即使如此,仍需要金字塔结构去进一步提升准确性,尤其在多尺度检测上。金字塔结构的优势是其产生的特征每一层都是语义信息加强的,包括高分辨率的低层。
对图像金字塔每一层都处理有很大的局限性,首先运算耗时会增加4倍,训练深度网络的时候太吃显存,几乎没法用,即使用了,也只能在检测的时候。因此,Fast/Faster R-CNN 都没使用featurized image pyramids
。
当然,图像金字塔并不是多尺度特征表征的唯一方式,CNN
计算的时候本身就存在多级特征图(feature map hierarchy)
,且不同层的特征图尺度就不同,形似金字塔结构,但是前后层之间由于不同深度(depths)影响,语义信息差距太大,主要是高分辨率的低层特征很难有代表性的检测能力。
所以文章提出了一种利用
CNN
和图像金字塔
结合的方式——FPN网络
。
- (a) 用图片金字塔生成特征金字塔:
先对原始图像构造图像金字塔,然后在图像金字塔的每一层提出不同的特征,然后进行相应的预测(BB的位置)。这种方法的缺点是计算量大,需要大量的内存;优点是可以获得较好的检测精度。它通常会成为整个算法的性能瓶颈,由于这些原因,当前很少使用这种算法。
- (b) 只在特征最上层预测:
利用 CNN
本身的特性,即对原始图像进行卷积和池化操作,通过这种操作我们可以获得不同尺寸的feature map,这样其实就类似于在图像的特征空间中构造金字塔。实验表明,浅层的网络更关注于细节信息,高层的网络更关注于语义信息,而高层的语义信息能够帮助我们准确的检测出目标,因此我们可以利用最后一个卷积层上的feature map来进行预测。
这种方法存在于大多数深度网络中,比如VGG、ResNet、Inception,它们都是利用深度网络的最后一层特征来进行分类。这种方法的优点是速度快、需要内存少。它的缺点是我们仅仅关注深层网络中最后一层的特征,却忽略了其它层的特征,但是细节信息可以在一定程度上提升检测的精度。
- © 特征层分层预测:
同时利用低层特征和高层特征,分别在不同的层同时进行预测,这是因为我的一幅图像中可能具有多个不同大小的目标,区分不同的目标可能需要不同的特征,对于简单的目标我们仅仅需要浅层的特征就可以检测到它,对于复杂的目标我们就需要利用复杂的特征来检测它。整个过程就是首先在原始图像上面进行深度卷积,然后分别在不同的特征层上面进行预测。
它的优点是在不同的层上面输出对应的目标,不需要经过所有的层才输出对应的目标(即对于有些目标来说,不需要进行多余的前向操作),这样可以在一定程度上对网络进行加速操作,同时可以提高算法的检测性能。它的缺点是获得的特征不鲁棒,都是一些弱特征(因为很多的特征都是从较浅的层获得的)。
- (d) FPN从高层携带信息传给底层,再分层预测:
FPN是为了自然地利用CNN层级特征的金字塔形式,同时生成在所有尺度上都具有强语义信息的特征金字塔。所以FPN的结构设计了 top-down
结构和 横向连接
,以此融合具有高分辨率的浅层layer和具有丰富语义信息的深层layer。
这种设计可以实现从单尺度的单张输入图像,快速构建在所有尺度上都具有强语义信息的特征金字塔,同时不产生明显的代价。
下面我们再来看一下相似的网络:
上面一个带有skip connection的网络结构在预测的时候是在finest level(自顶向下的最后一层)进行的,简单讲就 是经过多次上采样并融合特征到最后一步,拿最后一步生成的特征做预测。
而FPN网络结构和上面的类似,区别在于 预测是在每一层中独立进行的。
实验证明finest level的效果不如FPN好,原因在于FPN网络是一个窗口大小固定的滑动窗口检测器,因此在金字塔的不同层滑动可以增加其对尺度变化的鲁棒性。另外虽然finest level有更多的anchor,但仍然效果不如FPN好,说明增加anchor的数量并不能有效提高准确率。
3.2 FPN网络
FPN的目标是利用卷积网络本身带有的层次性语义特征,来构建特征金字塔。FPN包含两个部分:
- 第一部分是自底向上的过程;
- 第二部分是自顶向下和侧向连接的融合过程。
(1)自底向上的过程:
自底向上的过程和普通的CNN没有区别。现代的CNN网络一般都是按照特征图大小划分为不同的stage,每个stage之间特征图的尺度比例相差为2。在FPN中,每个stage对应了一个特征金字塔的级别(level),并且每个stage的最后一层特征被选为对应FPN中相应级别的特征。以ResNet为例,选取conv2、conv3、conv4、conv5层的最后一个残差block层特征作为FPN的特征,记为{C2、C3、C4、C5}。这几个特征层相对于原图的步长分别为4、8、16、32。
(2)自顶向下过程以及侧向连接:
自顶向下的过程通过 上采样(up-sampling)
的方式将顶层的小特征图(例如20)放大到上一个stage的特征图一样的大小(例如40)。这样的好处是既利用了顶层较强的语义特征(利于分类),又利用了底层的高分辨率信息(利于定位),上采样的方法可以用 最近邻差值
实现。
为了将高层语义特征和底层的精确定位能力结合,作者提出类似于残差网络的侧向连接结构:侧向连接将上一层经过上采样后和当前层分辨率一致的特征,通过相加的方法进行融合。
这里为了修正通道数量,将当前层先经过1x1卷积操作,以保证二者的通道数一致。
以ResNet为例:C5层先经过1x1卷积,得到M5特征。M5通过上采样,再加上C4经过1x1卷积后的特征,得到M4。这个过程再做两次,分别得到M3和M2。M层特征再经过3x3卷积,得到最终的P2、P3、P4、P5层特征。另外,和传统的图像金字塔方式一样,所有M层的通道数都设计成一样的,本文都用d=256。
3.3 FPN的应用
FPN本身不是检测算法,只是一个特征提取器。它需要和其他检测算法结合才能使用。下面介绍FPN如何应用于区域选择网络(RPN)和物体检测网络(Fast RCNN)。
本文方法在理论上早CNN中是通用的,作者将其首先应用到了RPN和Fast R-CNN中,应用中尽量做较小幅度的修改。
(1)Faster R-CNN+Resnet-101
要想明白FPN如何应用在 RPN
和 Fast R-CNN
(合起来就是 Faster R-CNN
),首先要明白 Faster R-CNN+Resnet-101
的结构,直接理解就是把 Faster-RCNN
中原有的 VGG
网络换成 ResNet-101
,ResNet-101
结构如下图:
Faster-RCNN利用conv1到conv4-x的91层为共享卷积层,然后从conv4-x的输出开始分叉,一路经过RPN网络进行区域选择,另一路直接连一个ROI Pooling层,把RPN的结果输入ROI Pooling层,映射成7 * 7的特征。然后所有输出经过conv5-x的计算,这里conv5-x起到原来全连接层(fc)的作用。最后再经分类器和边框回归得到最终结果。整体框架用下图表示:
(2)FPN应用于RPN
RPN是Faster R-CNN中用于区域选择的子网络,RPN是在一个 13 × 13 × 256 13\times 13\times 256 13×13×256 的特征图上应用9种不同尺度的anchor ,本篇论文另辟蹊径,把特征图弄成多尺度的,然后固定每种特征图对应的anchor尺寸。
作者在每一个金字塔层级应用了单尺度的anchor, P 2 , P 3 , P 4 , P 5 , P 6 {P2, P3, P4, P5, P6} P2,P3,P4,P5,P6 分别对应的anchor尺度为 3 2 2 , 6 4 2 , 12 8 2 , 25 6 2 , 51 2 2 {32^2, 64^2, 128^2, 256^2, 512^2 } 322,642,1282,2562,5122,当然目标不可能都是正方形,本文仍然使用三种比例 { 1 : 2 , 1 : 1 , 2 : 1 } \{1:2, 1:1, 2:1\} {1:2,1:1,2:1},所以金字塔结构中共有15种anchors。
然后,因为作者把conv5也作为了金字塔结构的一部分,那么从前全连接层的那个作用怎么办呢?这里采取的方法是增加两个1024维的轻量级全连接层,然后再跟上分类器和边框回归,认为这样还能使速度更快一些。
从图上看出各阶层共享后面的分类网络。这也是强调为什么各阶层输出的channel必须一致的原因,这样才能使用相同的参数,达到共享的目的。
(3)FPN应用于Fast RCNN
Fast R-CNN 中很重要的是ROI Pooling层,需要对不同层级的金字塔制定不同尺度的ROI。不同尺度的ROI使用不同特征层作为ROI pooling层的输入:
- 大尺度ROI就用后面一些的金字塔层,比如P5;
- 小尺度ROI就用前面一点的特征层,比如P4;
那怎么判断ROI改用那个层的输出呢?这里作者定义了一个系数Pk,其定义为:
224是ImageNet的标准输入, k 0 k_0 k0 是基准值,设置为 5 5 5,代表 P 5 P5 P5 层的输出(原图大小就用 P 5 P5 P5 层), w w w 和 h h h 是ROI区域的长和宽,假设ROI是 112 × 112 112 \times 112 112×112 的大小,那么 k = k 0 − 1 = 5 − 1 = 4 k = k_0-1 = 5-1 = 4 k=k0−1=5−1=4 ,意味着该ROI应该使用P4的特征层。 k k k 值应该会做取整处理,防止结果不是整数。
3.4 总结
作者提出的FPN(Feature Pyramid Network)算法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式不同。