特征金字塔(Feature Pyramid Networks )

前言:现在的很多网络都使用了利用单个高层特征(比如说Faster R-CNN利用下采样四倍的卷积层——Conv4,进行后续的物体的分类和bounding box的回归),但是这样做有一个明显的缺陷,即小物体本身具有的像素信息较少,在下采样的过程中极易被丢失,为了处理这种物体大小差异十分明显的检测问题,经典的方法是利用图像金字塔的方式进行多尺度变化增强,但这样会带来极大的计算量。所以提出了特征金字塔的网络结构,能在增加极小的计算量的情况下,处理好物体检测中的多尺度变化问题。

特征金字塔是目前用于目标检测、语义分割、行为识别等方面比较重要的一个部分,对于提高模型性能具有非常好的表现。

不同大小的目标都经过了相同的降采样比例后会出现较大的语义代沟,最常见的表现就是小目标检测精度比较低。特征金字塔具有在不同尺度下有不同分辨率的特点,不同大小的目标都可以在相应的尺度下拥有合适的特征表示,通过融合多尺度信息,在不同尺度下对不同大小的目标进行预测,从而很好地提升了模型的性能。

本文将介绍特征金字塔的两种构建方式,介绍目前特征金字塔的主要改进思路和方案,主要有:ASPP, FPN, PANet, RFB, ASFF, FPT, YOLOF等。

两种构建方式

1. 通过多次降采样生成不同分辨率的层构成,这种方式应用比较广,比较常见的应用有SSD, FPN, YOLO_v3, ...此外还有很多。

2. 通过多条具有不同空洞率的空洞卷积的支路来构建。目前这方面的应用有ASPP, RFP等。

构建金字塔只是个基础操作,对于构建后的处理才是重点,目前有多种多样的方法去处理,这方面的改进主要有ASFF, PANet, FPT, YOLOF, BiFPN, STDN等。

ASPP(2017)

ASPP是基于第二种方式来构建的,具体如下图所示:

特征金字塔(Feature Pyramid Networks )_第1张图片

通过多支路后进行concate,再进行1x1卷积。这篇论文比较简单,主要贡献就是提出了这种构建方式。

FPN(2017)

对于一般的神经网络都是采用图b所示的方式来预测,通过对图像多次降采样,在最后一层进行预测,这种方式的缺点是对小目标的检测效果不好。

在SSD中采用了图c的方式,利用前几层的信息进行多尺度预测,这种方式的缺点是低层的语义信息不够,而且SSD为了避免重复使用前面已经卷积过的feature map,而从靠后的层(eg: conv4_3 of VGG nets )才开始构建金字塔,这样做的缺点就是金字塔的低层的分辨率也不够,丢失了前面层高分辨率的信息,而那些才是对识别小目标起重要作用的信息。

而FPN是目前应用比较广的一种方式,在图C的基础上增加了一条自上而下的路径,主要目的就是解决前面三种方式存在的问题。通过自上而下的路径,使得低层的feature map具有较好的语义信息。

特征金字塔(Feature Pyramid Networks )_第2张图片
特征金字塔(Feature Pyramid Networks )_第3张图片

这条路径的实现方式如下图所示。

特征金字塔(Feature Pyramid Networks )_第4张图片
特征金字塔(Feature Pyramid Networks )_第5张图片

注:FPN的效果非常好,但仍然存在不少改进的空间,后续会出现好几篇论文逐一改进这些问题。

PANet(2018)

我在《CNN结构演变总结(三)设计原则》(点击进入)中提到,缩短信息流动路径和增加不同分支来增加信息流动路径的思想会产生比较强的性能,总结起来就是“split-transform-merge”和“feature reuse”,这也是这几年神经网络的主要改进思想,几乎可以说所有的改进方案都是基于这两种思想。

在PANet同样基于这一点,提出了在FPN中自上而下的路径的基础上增加了一条自下而上的路径,具体如下图所示。

特征金字塔(Feature Pyramid Networks )_第6张图片
特征金字塔(Feature Pyramid Networks )_第7张图片

具体路径的实现方式如下图所示,对lower level先进行步长为2,大小为3x3的卷积进行降采样,再与邻侧同大小的level逐像 素相加,再进行3x3卷积,形成Ni+1。

特征金字塔(Feature Pyramid Networks )_第8张图片
特征金字塔(Feature Pyramid Networks )_第9张图片

在FPN中采用了分而治之的思想,所谓分而治之,就是对于大的目标在金字塔高层检测,小的目标在金字塔低层检测。基于这种思想的论文还有很多,例如YOLO_V3,根据数据集上的先验提出了9个尺寸不同的候选框,根据这9个候选框的尺寸分别在不同的level上检测。

PANet论文提出当目标大小相差超过10个像素的时候,就有可能被分到不同的level上检测,而事实上这两个目标可能差不多,因此这种方式并不是最优方案。

PANet论文的第二点贡献是提出自适应特征池化( Adaptive Feature Pooling)。

主要思想是将所有level中产生的候选框中的信息,都用来参与预测。而不是大的目标在higher level检测,小的目标在lower level检测。

具体做法如下图所示,使用ROIAlign将金字塔reshape到相同的大小,使用共享的一个全连接层对这四个level分别计算,再通过逐像素求和或取max的方式融合四个level到一个feature map。

特征金字塔(Feature Pyramid Networks )_第10张图片
特征金字塔(Feature Pyramid Networks )_第11张图片

RFB(2018)

RFB论文认为ASPP使用不同空洞率的空洞卷积所组成的多分支结构效果很好,但由于在使用之前,使用的是同尺寸的卷积核,导致每条分支产生的分辨率仍然是相同的,只是感受野不同而已。这样的方式与雏菊型卷积核相比,产生的特征并不是那么明显。

因此,RFB论文提出了Receptive Field Block,主要做法就是在进行空洞卷积前加一层不同大小的卷积层,分别是1x1, 3x3, 5x5这样每条支路产生的分辨率不同。

特征金字塔(Feature Pyramid Networks )_第12张图片
特征金字塔(Feature Pyramid Networks )_第13张图片

这种方式的效果与其它方式的对比

特征金字塔(Feature Pyramid Networks )_第14张图片

特征金字塔(Feature Pyramid Networks )_第15张图片

ASFF(2019)

在FPN中这种分而治之除了在PANet中提到的一个问题是,当一个大的目标在higher level上检测时,小的目标在higher level是被当作了background。同理,大目标在lower level中被当成了background,实际上在这些地方是存在目标的,只是不在这一层检测而已,因此这样会存在较大的问题。

基于这个问题,ASFF提出了adaptively spatial feature fusion (ASFF)。主要思想是将每层的信息都相互融合起来。

具体操作是先对每一层进行1x1降维,对于第一和二,第二和第三层这种分辨率比为1:2的,通过3x3,步长为2的卷积降采样,对于第一和第三层这种分辨率比为1:4的,先对进行max-pooling,再通过3x3,步长为2的卷积降采样。然后通过系数加权融合。

特征金字塔(Feature Pyramid Networks )_第16张图片
特征金字塔(Feature Pyramid Networks )_第17张图片

该方法用于YOLO_v3,提高了大概5-10的mAP。

特征金字塔(Feature Pyramid Networks )_第18张图片
特征金字塔(Feature Pyramid Networks )_第19张图片

基于这种方式改进的还有Feature Pyramid Transformer。

FPT(2020)

这篇论文的主要观点是认为背景中其它物品的存在也会辅助识别某一个类别,例如电脑只会在电脑桌上,而不是大街上或水里,背景中的鼠标,键盘也会辅助区分电视机与电脑显示器。因此需要融合金字塔其它level的信息,这虽然出发点与ASFF不同,但实际改进的思路都是一样的,都是让每一层都融合其它层的语义信息。

特征金字塔(Feature Pyramid Networks )_第20张图片

主要思想:利用Non Local Block的操作,以一层为query,其它每层为key,value,计算相似性,得出加权系数,对该层进行加权,每一层都进行这样的操作。

具体在实现细节上有所区别,要介绍清楚实现操作比较费时,对Non Local Block也得解释,因此这里只介绍个思路,详情请点击下方链接。读者可根据这两篇论文了解transformer如何在CV中应用,建议看一看。

NLN: Non-Local Neural Network

FPT: Feature Pyramid Transformer

YOLOF(2021)

YOLOF通过实验得出结论在特征金字塔的C5层已经有足够的语义信息,融合其它层信息并不会带来很大的精度提升,也就1的mAp,而使用分而治之的思想极为有效,可以提升大概12的mAP。

因此YOLOF提出只需要使用C5层信息,并仍然基于分而治之的思想。但由于使用max-iou的匹配方式,只在C5层预测会出现对大小不同的目标生成的positive anchor数量不平衡的问题;分而治之存在计算量大,需要的内存大,推理速度慢的问题。

基于这两个问题,YOLOF提出Dialted encoder和Uniform Matching来实现在单层上进行预测,而这种预测可以做到仍然是基于分而治之的思想。

关于Dialted Encoder结构如下:

特征金字塔(Feature Pyramid Networks )_第21张图片
特征金字塔(Feature Pyramid Networks )_第22张图片

主要操作是串联四个不同空洞率的3x3空洞卷积,注意与ASPP,RFB不同的是,这里是串联,ASPP和RFB是多支路并联。

Uniform Matching是使用最近邻方式来匹配,替代了Max-IOU。具体方式是选择GT boxes最近的K个boxes,这样的方式不管GT boxes大小可以匹配相同数量的Boxes。

其它改进的特征金字塔

除了以上这些改进方案外,还存在一些其它的结构或信息融合方式。这里只提个来源和结构图,感兴趣的读者请自行了解。

SFAM(2019)

来源于论文《M2Det: A Single-Shot Object Detector Based on Multi-Level Feature Pyramid Network》

特征金字塔(Feature Pyramid Networks )_第23张图片
特征金字塔(Feature Pyramid Networks )_第24张图片

STDN(2018)

来源于论文《Scale-Transferrable Object Detection》

特征金字塔(Feature Pyramid Networks )_第25张图片
特征金字塔(Feature Pyramid Networks )_第26张图片

BiFPN(2020)

来源于论文《EffificientDet: Scalable and Effificient Object Detection》

特征金字塔(Feature Pyramid Networks )_第27张图片
特征金字塔(Feature Pyramid Networks )_第28张图片

此外,还包括一些比较复杂的结构,如RFP,NAS-FPN。

总结:本文介绍了特征金字塔的两种构建方式,特征金字塔的一些现有方案,主要都是围绕金字塔如何更好地融合信息进行预测来改进。特征金字塔算是比较有用的一个结构,用在目标检测、语义分割等领域有较好的性能。

【目标检测】FPN(Feature Pyramid Network)

Feature pyramid network是CVPR2017年的一篇文章,它在目标检测中融入了特征金字塔,提高了目标检测的准确率,尤其体现在小物体的检测上。

1. 动机(Motivation)

识别不同尺寸的物体是目标检测中的一个基本挑战,而特征金字塔一直是多尺度目标检测中的一个基本的组成部分,但是由于特征金字塔计算量大,会拖慢整个检测速度,所以大多数方法为了检测速度而尽可能的去避免使用特征金字塔,而是只使用高层的特征来进行预测。高层的特征虽然包含了丰富的语义信息,但是由于低分辨率,很难准确地保存物体的位置信息。与之相反,低层的特征虽然语义信息较少,但是由于分辨率高,就可以准确地包含物体位置信息。所以如果可以将低层的特征和高层的特征融合起来,就能得到一个识别和定位都准确的目标检测系统。所以本文就旨在设计出这样的一个结构来使得检测准确且快速。

虽然之前也有算法采用了多尺度融合的方式,但是一般都是在特征融合之后再做预测,而本文则是在不同的特征层都单独进行预测。

2. 结构(Architecture)

下图所示的三种结构是在目标检测中比较常见的结构:

特征金字塔(Feature Pyramid Networks )_第29张图片

图1 常见结构

(a) Featurized image pyramid:这种方式就是先把图片弄成不同尺寸的,然后再对每种尺寸的图片提取不同尺度的特征,再对每个尺度的特征都进行单独的预测,这种方式的优点是不同尺度的特征都可以包含很丰富的语义信息,但是缺点就是时间成本太高。

(b) Pyramid feature hierarchy:这是SSD采用的多尺度融合的方法,即从网络不同层抽取不同尺度的特征,然后在这不同尺度的特征上分别进行预测,这种方法的优点在于它不需要额外的计算量。而缺点就是有些尺度的特征语义信息不是很丰富,此外,SSD没有用到足够低层的特征,作者认为低层的特征对于小物体检测是非常有帮助的。

(c) Single feature map:这是在SPPnet,Fast R-CNN,Faster R-CNN中使用的,就是在网络的最后一层的特征图上进行预测。这种方法的优点是计算速度会比较快,但是缺点就是最后一层的特征图分辨率低,不能准确的包含物体的位置信息。

所以为了使得不同尺度的特征都包含丰富的语义信息,同时又不使得计算成本过高,作者就采用top down和lateral connection的方式,让低层高分辨率低语义的特征和高层低分辨率高语义的特征融合在一起,使得最终得到的不同尺度的特征图都有丰富的语义信息,如图2所示。

特征金字塔(Feature Pyramid Networks )_第30张图片

图2 Feature Pyramid Network

3. 特征金字塔(Feature Pyramid Network)

特征金字塔的结构主要包括三个部分:bottom-up,top-down和lateral connection。

特征金字塔(Feature Pyramid Networks )_第31张图片

图3 Feature Pyramid Network

3.1 Bottom-up

Bottom-up的过程就是将图片输入到backbone ConvNet中提取特征的过程中。Backbone输出的feature map的尺寸有的是不变的,有的是成2倍的减小的。对于那些输出的尺寸不变的层,把他们归为一个stage,那么每个stage的最后一层输出的特征就被抽取出来。以ResNet为例,将卷积块conv2, conv3, conv4, conv5的输出定义为{ �2,�3,�4,�5 } ,这些都是每个stage中最后一个残差块的输出,这些输出分别是原图的{ 1/4,1/8,1/16,1/32 }倍,所以这些特征图的尺寸之间就是2倍的关系。

3.2 Top-down

Top-down的过程就是将高层得到的feature map进行上采样然后往下传递,这样做是因为,高层的特征包含丰富的语义信息,经过top-down的传播就能使得这些语义信息传播到低层特征上,使得低层特征也包含丰富的语义信息。本文中,采样方法是最近邻上采样,使得特征图扩大2倍。上采样的目的就是放大图片,在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的像素,在本文中使用的是最近邻上采样(插值)。这是最简单的一种插值方法,不需要计算,在待求像素的四个邻近像素中,将距离待求像素最近的邻近像素值赋给待求像素。设待求像素的坐标为 (�+�,�+�) ,( �,� 为正整数, �,� 为大于零小于1的小数),则待求像素灰度的值 �(�+�,�+�)的计算方式如下图所示:

特征金字塔(Feature Pyramid Networks )_第32张图片

图4 最近邻插值

如果 (�+�,�+�) 落在A区域内,即 �<0.5,�<0.5 ,则将a点的像素值赋给待求像素,同理,落在B区则将b点的像素值赋给待求像素,落在C区则赋予c点的像素值,落在D区则赋予d点的像素值。最邻近法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

3.3 Lateral connection

如下图所示,lateral connection主要包括三个步骤:

(1) 对于每个stage输出的feature map ��,都先进行一个1*1的卷积降低维度。

(2) 然后再将得到的特征和上一层采样得到特征图 ��+1 进行融合,就是直接相加,element-wise addition。因为每个stage输出的特征图之间是2倍的关系,所以上一层上采样得到的特征图的大小和本层的大小一样,就可以直接将对应元素相加 。

(3) 相加完之后需要进行一个3*3的卷积才能得到本层的特征输出 ��。使用这个3*3卷积的目的是为了消除上采样产生的混叠效应(aliasing effect),混叠效应应该就是指上边提到的‘插值生成的图像灰度不连续,在灰度变化的地方可能出现明显的锯齿状’。在本文中,因为金字塔所有层的输出特征都共享classifiers/ regressors,所以输出的维度都被统一为256,即这些3*3的卷积的channel都为256。

特征金字塔(Feature Pyramid Networks )_第33张图片

图5 Lateral connection

4. 应用(Application)

在文中,作者将FPN和Faster R-CNN相结合,将FPN用于RPN来提取proposal,将FPN用于Fast R-CNN来进行目标检测。接下来这部分内容和Faster R-CNN比较相关,如果有不了解Faster R-CNN的,大家可以参考我这篇文章:Jacqueline:【目标检测】Faster R-CNN。

4.1 Feature Pyramid Network for RPN

下图所示为Faster R-CNN中的RPN的网络结构,接收单尺度的特征输入,然后经过3*3的卷积,并在feature map上的每个点处生成9个anchor(3个尺寸,每种尺寸对应3个宽高比),之后再在两个分支并行的进行1*1卷积,分别用于对anchors进行分类和回归。这是单尺度的特征输入的RPN。

特征金字塔(Feature Pyramid Networks )_第34张图片

图6 RPN

所以将FPN和RPN结合起来,那RPN的输入就会变成多尺度的feature map,那我们就需要在金字塔的每一层后边都接一个RPN head(一个3*3卷积,两个1*1卷积),如下图所示,其中 �6 是通过 �5 下采样得到的。

特征金字塔(Feature Pyramid Networks )_第35张图片

图7 RPN with FPN

在生成anchor的时候,因为输入是多尺度特征,就不需要再对每层都使用3种不同尺度的anchor了,所以只为每层设定一种尺寸的anchor,图中绿色的数字就代表每层anchor的size,但是每种尺寸还是会对应3种宽高比。所以总共会有15种anchors。此外,anchor的ground truth label和Faster R-CNN中的定义相同,即如果某个anchor和ground-truth box有最大的IoU,或者IoU大于0.7,那这个anchor就是正样本,如果IoU小于0.3,那就是负样本。此外,需要注意的是每层的RPN head都参数共享的。

4.2 Feature Pyramid Network for Fast R-CNN

在Fast R-CNN 中有一个ROI Pooling层,它是使用region proposal的结果和特征图作为输入,得到的每个proposal对应的特征然后pooling,之后再分别用于分类结果和边框回归。之前Fast R-CNN使用的是单尺度的特征图,但是现在使用不同尺度的特征图,那么RoI需要在哪一个尺度的特征图上提取对应的特征呢? 作者认为,不同尺度的RoI应该使用不同特征层作为RoI pooling层的输入,大尺度RoI就用后面一些的金字塔层,比如P5;小尺度RoI就用前面一点的特征层,比如P4。那怎么判断RoI该用哪个层的输出呢?这里作者定义了一个计算公式:

其中,输出的k代表特征图的层数编号。 �0 是基准值,为5,代表第5层特征图 �5 。 � 和 ℎ 为RoI的宽和高,224是ImageNet的标准输入。假设RoI的 � 和 ℎ 为 112∗122 ,那么 �=�0−1 ,即为4,选择第4层特征图。

4.3 Faster R-CNN with FPN

最后,我们可以得到有FPN的Faster R-CNN的结构图:

特征金字塔(Feature Pyramid Networks )_第36张图片

图8 Faster R-CNN with FPN

和普通的Faster R-CNN相同,为每个RoI提取特征之后,需要经过RoI pooling层将RoI的特征resize成相同大小的,这里是resize成7*7的,之后再连接两个1024-d的FC layer,然后再并行的输入到两个FC layer中分别进行分类和回归,便得到最终的结果。

总结

本文提出了FPN(Feature Pyramid Network)算法可以同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到很好的预测效果。此外,和其他的特征融合方式不同的是本文中的预测是在每个融合后的特征层上单独进行的。

本文都是根据个人理解编写的,希望可以帮到大家。此外,如有误,烦请指正。如果喜欢,请点赞哦,谢谢~

你可能感兴趣的:(python,算法,pycharm,pytorch,视觉检测)