多尺度目标识别(FPN金字塔)的发展历程
引言
识别不同尺寸目标一直是目标检测的难点,尤其是小目标!而特征金字塔一直是解决多尺度目标检测的一个重要的点!现在深度学习目标检测的图像/特征金字塔解决思路有下面几种:
- a) 图像金字塔
主要使用不同尺度的图片(resize)进行训练,可以在数据集层面扩充不同尺度的目标,从而使网络更好的学习到不同尺度目标的信息,提高检测准确率,
- 问题:需要大量的时间、空间去进行训练;
-
a) 无特殊操作
直接使用最后一层 特征 进行目标检测,如RCNN YOLO系列,对小目标十分不友好,因为最后一层 特征 具有强语义、低分辨率,小目标很容易被忽略掉,小目标检测性能不友好; -
b) 单方向的特征金字塔
这个结构首先在SSD中提出,主要思想:利用图像提取的不同尺度特征形成特征金字塔,较深的特征 语义信息越丰富、分辨率越高,可以充分提取大目标的语义信息,浅的特征具有高分辨率,对小目标比较友好;
网络越深,提取的特征 分辨率越低(300x300->8x8),语义信息(特征)越丰富,但是位置信息越粗糙, 感受野太大,很容易忽略到小目标的特征,深层特征对大目标较好,可以充分提取大目标的特征信息
浅特征(300x300->32x32) 提取的分辨率高,语义信息较少,但是位置信息准确,感受野较少,可以很好的关注到小目标
- 优点: 没有添加额外的计算量;
- 缺点:作者直接使用的conv4-3层作为最底层,分辨率还是比较高,对小目标还是漏检还是比较严重;浅层大scale的feature map语义信息少,虽然框出了小物体,但小物体容易被错分
但作者认为SSD没有用到足够底层的特征
conv4-3
,而越底层的特征对检测小物体越有利,但我感觉 太浅层的特征 其语义信息太少了,虽然分辨率上不容易被忽略,但是很容易被错分;
- b) FPN 侧边连接的特征金字塔
下采样+上采样+侧连接 自底向上->自顶向下->横向连接
在SSD的基础上又添加了上采样和侧连接的结构,上采样可以将高语义的信息传递到浅层特征,同时保留浅层特征的高分辨率(感受野小)的特性,可以更好的兼顾语义信息和位置信息;
-
PAN
之后又提出的改进方法,作者又添加了自底向上->自顶向下->自顶向上->横向连接
,认为FPN的上采样虽然将语义信息传回给浅特征,但是深层特征的位置依然比较差,所以作者又将浅层信息直接传递给高层,增强其位置信息;
后来者PAN在FPN的基础上再加了一个bottom-up方向的增强,使得顶层feature map也可以享受到底层带来的丰富的位置信息,从而把大物体的检测效果也提上去了:
FPN结构
图中只画了3个stage,但我们以论文描述的为主,其实最起码有5个stage。左侧模型从低到高的卷积结果记为C2,C3,C4,C5,C6(有C1,但是论文里是抛弃了这层,为了不造成混淆,所以这里自动忽略了),同理右侧模型从低到高记为P2,P3,P4,P5,P6。
自底向上(下采样)
就是网络训练的前向传播过程,特征图尺寸越来越小,缩放stride
。有些层的尺寸不变,我们把这些尺度不变的层定义为一个stage
。我们选择每个阶段的最后一层输出作为分类和回归参考特征图。 因为每个阶段的最后一层提取的特征应该是最好的。
自顶向下(上采样)
把高层特征图进行上采样(比如最近邻上采样),然后把该特征横向连接(lateral connections )至前一层特征,因此高层特征得到加强。这样做主要是为了利用底层的定位细节信息。
横向连接
较低层特征通过1×1卷积改变一下低层特征的通道数,然后简单地把将P的上采样和1×1卷积后的结果对应元素相加。为什么横向连接要使用1×1卷积呢,为什么不能原地不动地拿过来呢?原来在于作者想用1×1改变通道数,以达到各个level处理结果的channel都为256-d,便于后面对加起来的特征进行分类。
FPN实验
上图为faster r-cnn 的结构图,作者主要讲FPN结构用在了 RPN和检测 两个部分
首先使用backbone提取特征,然后使用上采样和侧边连接,得到多尺度的特征图P2...P5
,然后在这些特征图上使用3x3卷积进行滑动,使用两个分支对每个特征点进行 box检测和回归; 类似于rcnn,只不过这个是 在多个特征图上同时做回归
下面这个图可以更清楚的理解这个结构;
对ResNet提取的不同stage
特征图,先在上进行1×1
卷积降维通道数,得到P5
。P5上采样与C4的1×1
卷积结果对应元素相加,得到P4
,然后用3×3
卷积处理,以减小上采样带来的混淆现象(附原文We append a 3×3 convolution on each merged map to generate the final feature map,which is to reduce the aliasing effect of upsampling)。相加的结果称为,与同样大小的对应。
RPN部分实验
RPN即一个用于目标检测的一系列滑动窗口。具体地,RPN是先进行3×3,然后跟着两条并行的1×1卷积,分布产生前背景分类和框位置回归,我们把这个组合叫做网络头部network head。
但是前背景分类与框位置回归是在anchor的基础上进行的,简言之即我们先人为定义一些框,然后RPN基于这些框进行调整即可。在SSD中anchor叫prior,更形象一些。为了回归更容易,anchor在Faster R-CNN中预测了3种大小scale
,宽高3种比率ratio = {1:1,1:2,2:1}
,共9种anchor框。
在FPN中我们同样用了一个3×3和两个并行的1×1,但是是在每个级上都进行了RPN这种操作。既然FPN已经有不同大小的特征scale了,那么我们就没必要像Faster R-CNN一样采用3种scale大小的anchor了,我们只要采用3种比率的框就行了。所以每个级level的anchor都是相同的scale。所以我们在上分别定义anchor的scale为,在每级level的上有{1:1,1:2,2:1}
三种宽高比率ratio的框。所以我们在特征金字塔上总共有15(3 * 5个stage)
个anchor。
此外,每个级level的头部的参数是共享的
,共享的原因是实验验证出来的。实验证明,虽然每级的feature大小不一样,但是共享与不共享头部参数的准确率是相似的。这个结果也说明了其实金字塔的每级level都有差不多相似的语义信息,而不是普通网络那样语义信息区别很大。
检测部分
在Fast rcnn中因为只有一个特征图,所以直接使用RPN提取的ROI在特征图进行裁剪特征即可,然后将ROI特征进行二次回归和分类;
但是在FPN中提取到不同scale
的特征金字塔,作者认为,不同尺度的特征图包含的物体大小也不同,所以不同尺度的ROI应该在不同尺度的特征图上进行特征提取,大尺度的ROI使用深层P5
的特征图进行ROI Pooling操作,小尺度的ROI使用浅层的特征图P4
进行ROI Pooling操作,
为了更好的定义不同尺度的ROI使用那层特征图进行ROI Pool操作,作者定义了一个判别公式
实验结果
FPN对RPN的影响 关心AR(box的召回率)
下标sml
指的是gt框的大小small,medium,large
- (a,b)只使用conv4或conv5的R-CNN在召回率上提升10%(a,b),尤其在小物体上提升明显。(使用相同的超参数anchors)
- (d)去掉了top-down,只保留横向连接
(SSD)
.即去掉了上采样,相当于论文图1的c
。性能仅与原 RPN 差不多,原因可能是不同层的语义信息差别较大。 - (e)去掉了横向链接。相当于只上采样。语义多,但位置不准确。
- (f)只用P2特征层,不使用金字塔模型。对应论文图1的(b)。结果当然不是很好。
FPN对整个Faster R-CNN的影响