深度学习之 FPN (Feature Pyramid Networks)

  • 论文题目:Feature Pyramid Networks for Object Detection
  • 论文链接:https://arxiv.org/abs/1612.03144
  • 论文代码:Caffe版本 https://github.com/unsky/FPN

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

一、FPN初探

1. 图像金字塔

在这里插入图片描述

图1 图像金字塔

在这里插入图片描述

图2 高斯金字塔效果

如上图所示,这是一个图像金字塔,在很多的经典算法里面都有它的身影,比如SIFT、HOG等算法。我们常用的是高斯金字塔,所谓的高斯金字塔是通过高斯平滑和亚采样获得一些下采样图像,也就是说第K层高斯金字塔通过平滑、亚采样操作就可以获得K+1层高斯图像,高斯金字塔包含了一系列低通滤波器,其截止频率从上一层到下一层是以因子2逐渐增加,所以高斯金字塔可以跨越很大的频率范围。总之,我们输入一张图片,我们可以获得多张不同尺度的图像,我们将这些不同尺度的图像的4个顶点连接起来,就可以构造出一个类似真实金字塔的一个图像金字塔。通过这个操作,我们可以为2维图像增加一个尺度维度(或者说是深度),这样我们可以从中获得更多的有用信息。整个过程类似于人眼看一个目标由远及近的过程(近大远小原理)。如图2所示,我们可以看到一个图像金字塔,中间是原始图像,最上边是下采样后的图像,最下边是上采样后的图像。你可以将其对应到图1中的不同层中。

2. 为什么需要构造特征金字塔?

在这里插入图片描述

图3 特征金字塔

前面已经提到了高斯金字塔,由于它可以在一定程度上面提高算法的性能,因此很多经典的算法中都包含它。但是这些都是在传统的算法中使用,当然也可以将这种方法直应用在深度神经网络上面,但是由于它需要大量的运算和大量的内存。但是我们的特征金字塔可以在速度和准确率之间进行权衡,可以通过它获得更加鲁棒的语义信息,这是其中的一个原因。

如上图所示,我们可以看到我们的**图像中存在不同尺寸的目标,而不同的目标具有不同的特征,利用浅层的特征就可以将简单的目标的区分开来;利用深层的特征可以将复杂的目标区分开来;**这样我们就需要这样的一个特征金字塔来完成这件事。图中我们在第1层(请看绿色标注)输出较大目标的实例分割结果,在第2层输出次大目标的实例检测结果,在第3层输出较小目标的实例分割结果。检测也是一样,我们会在第1层输出简单的目标,第2层输出较复杂的目标,第3层输出复杂的目标。

3. 为什么要提出FPN算法?

在这里插入图片描述

图4 不同方案的金字塔

识别不同大小的物体是计算机视觉中的一个基本挑战,我们常用的解决方案是构造多尺度金字塔。

图a:Feature pyramids built upon image pyramids ( featurized image pyramid)

如上图a所示,这是一个特征图像金字塔,整个过程是先对原始图像构造图像金字塔,然后在图像金字塔的每一层提出不同的特征,然后进行相应的预测(BB的位置)。

它通常会成为整个算法的性能瓶颈,由于这些原因,当前很少使用这种算法。

优点:

  1. 对每一种尺度的图像进行特征提取,能够产生多尺度的特征表示,并且所有等级的特征图都具有较强的语义信息,甚至包括一些高分辨率的特征图。

缺点:

  1. 推理时间大幅度增加
  2. 由于内存占用巨大,用图像金字塔的形式训练一个端到端的深度神经网络变得不可行
  3. 如果只在测试阶段使用图像金字塔,那么会造成一个问题:由于训练时,网络只是针对于某一个特点的分辨率进行训练,推理时运用图像金字塔,可能会在训练与推理时产生“矛盾”。

图b:常见的目标检测网络

如上图b所示,这是一种改进的思路,学者们发现我们可以利用卷积网络本身的特性,即对原始图像进行卷积和池化操作,通过这种操作我们可以获得不同尺寸的feature map,这样其实就类似于在图像的特征空间中构造金字塔。

实验表明,浅层的网络更关注于细节信息,高层的网络更关注于语义信息,而高层的语义信息能够帮助我们准确的检测出目标,因此我们可以利用最后一个卷积层上的feature map来进行预测。

这种方法存在于大多数深度网络中,比如VGG、ResNet、Inception,它们都是利用深度网络的最后一层特征来进行分类。以及 Faster R-CNN中的RPN层就是利用单个高层特征图进行物体的分类和bounding box的回归

优点是速度快、需要内存少。

缺点是我们仅仅关注深层网络中最后一层的特征,却忽略了其它层的特征,而且检测小物体的性能急剧下降,但是细节信息可以在一定程度上提升检测的精度。

图c:金字塔型特征层级 ConvNet’s pyramidal feature hierarchy

因此有了图c所示的架构,它的设计思想就是同时利用低层特征和高层特征,分别在不同的层同时进行预测,这是因为我的一幅图像中可能具有多个不同大小的目标,区分不同的目标可能需要不同的特征,对于简单的目标我们仅仅需要浅层的特征就可以检测到它,对于复杂的目标我们就需要利用复杂的特征来检测它。

整个过程就是首先在原始图像上面进行深度卷积,然后分别在不同的特征层上面进行预测。

它的优点是在不同的层上面输出对应的目标,不需要经过所有的层才输出对应的目标(即对于有些目标来说,不需要进行多余的前向操作),这样可以在一定程度上对网络进行加速操作,同时可以提高算法的检测性能。

它的缺点是获得的特征不鲁棒,都是一些弱特征(因为很多的特征都是从较浅的层获得的)。

比如SSD one-stage目标检测模型就是再次利用不同层多尺度的特征图。但是SSD并没有解决以下问题:

低层特征图语义信息不够和低层特征图的分辨率也不高。

SSD论文中指出,SSD为了避免使用低层特征图,放弃了重用已经计算的层,而是从网络的高层开始构建金字塔(例如,VGG网络的Conv4之后,再添加几个新的卷积层),因此,SSD错过了重用低层高分辨的特征图,即没有充分利用到低层特征图中的空间信息(这些信息对小物体的检测十分重要)。

图d:特征金字塔 Feature Pyramid Networks

它的架构如图d所示,整个过程如下所示,首先我们在输入的图像上进行深度卷积,然后对Layer2上面的特征进行降维操作(即添加一层1x1的卷积层),对Layer4上面的特征就行上采样操作,使得它们具有相应的尺寸,然后对处理后的Layer2和处理后的Layer4执行加法操作(对应元素相加),将获得的结果输入到Layer5中去。

其背后的思路是为了获得一个强语义信息,这样可以提高检测性能。这次我们使用了更深的层来构造特征金字塔,这样做是为了使用更加鲁棒的信息;除此之外,我们将处理过的低层特征和处理过的高层特征进行累加,这样做的目的是因为低层特征可以提供更加准确的位置信息,而多次的降采样和上采样操作使得深层网络的定位信息存在误差,因此我们将其结合其起来使用,就构建了一个更深的特征金字塔,融合了多层特征信息,并在不同的特征进行输出。

二、FPN框架解析

FPN 层

Bottom-up pathway

前馈Backbone的一部分,每一级往上用step=2的降采样。

输出size相同的网络部分叫一级(stage),选择每一级的最后一层特征图,作为Up-bottom pathway的对应相应层数,经过1 x 1卷积过后element add的参考。

例如,下图是fasterRCNN的网络结构,左列ResNet用每级最后一个Residual Block的输出,记为{C1,C2,C3,C4,C5}。
在这里插入图片描述

FPN用2~5级参与预测(因为第一级的语义还是太低了),{C2,C3,C4,C5}表示conv2,conv3,conv4和conv5的输出层(最后一个残差block层)作为FPN的特征,分别对应于输入图片的下采样倍数为{4,8,16,32}。

Top-down pathway and lateral connections

自顶向下的过程通过上采样(up-sampling)的方式将顶层的小特征图。放大到上一个stage的特征图一样的大小。

上采样的方法是最近邻插值法:使用最近邻值插值法,可以在上采样的过程中最大程度地保留特征图的语义信息(有利于分类),从而与 bottom-up 过程中相应的具有丰富的空间信息(高分辨率,有利于定位)的特征图进行融合,从而得到既有良好的空间信息又有较强烈的语义信息的特征图。
在这里插入图片描述
具体过程为:C5层先经过1 x 1卷积,改变特征图的通道数(文章中设置d=256,与Faster R-CNN中RPN层的维数相同便于分类与回归)。M5通过上采样,再加上(特征图中每一个相同位置元素直接相加)C4经过1 x 1卷积后的特征图,得到M4。这个过程再做两次,分别得到M3,M2。M层特征图再经过3 x 3卷积(减轻最近邻近插值带来的混叠影响,周围的数都相同),得到最终的P2,P3,P4,P5层特征。

FPN应用于RPN层

Faster RCNN中的RPN是通过最后一层的特征来做的。最后一层的特征经过3x3卷积,得到256个channel的卷积层,再分别经过两个1x1卷积得到类别得分和边框回归结果。这里将特征层之后的RPN子网络称之为网络头部(network head)。对于特征层上的每一个点,作者用anchor的方式预设了9个框。这些框本身包含不同的尺度和不同的长款比例。

FPN针对RPN的改进是将网络头部应用到每一个P层。由于每个P层相对于原始图片具有不同的尺度信息,因此作者将原始RPN中的尺度信息分离,让每个P层只处理单一的尺度信息。具体的,对{322、642、1282、2562、512^2}这五种尺度的anchor,分别对应到{P2、P3、P4、P5、P6}这五个特征层上。每个特征层都处理1:1、1:2、2:1三种长宽比例的候选框。P6是专门为了RPN网络而设计的,用来处理512大小的候选框。它由P5经过下采样得到。

RoI pooling与RCNN:原版的RoI pooling统一到同一个大小的feature map,但是这对FPN并不合适,因为FPN在RPN阶段抽取的候选框本来就含有不同的尺度,作者的方法是将不同尺度的候选框map into到不同大小的特征图,具体的公式这里就不贴了,可以参考论文;另外作者关于RoI pooling之后的网络结构也有一定不同,作者添加了两个1024的fc层在最终的分类与回归层前,作者认为这更加轻便

另外,上述5个网络头部的参数是共享的。作者通过实验发现,网络头部参数共享和不共享两种设置得到的结果几乎没有差别。这说明不同层级之间的特征有相似的语义层次。这和特征金字塔网络的原理一致。

1.利用FPN构建Faster R-CNN检测器步骤

  • 首先,选择一张需要处理的图片,然后对该图片进行预处理操作;
  • 然后,将处理过的图片送入预训练的特征网络中(如ResNet等),即构建所谓的bottom-up网络;
  • 接着,如图5所示,构建对应的top-down网络(即对层4进行上采样操作,先用1x1的卷积对层2进行降维处理,然后将两者相加(对应元素相加),最后进行3x3的卷积操作,最后);
  • 接着,在图中的4、5、6层上面分别进行RPN操作,即一个3x3的卷积后面分两路,分别连接一个1x1的卷积用来进行分类和回归操作;
  • 接着,将上一步获得的候选ROI分别输入到4、5、6层上面分别进行ROI Pool操作(固定为7x7的特征);
  • 最后,在上一步的基础上面连接两个1024层的全连接网络层,然后分两个支路,连接对应的分类层和回归层;

在这里插入图片描述

图5 FPN整体架构
  • 层1、2、3对应的支路就是bottom-up网络,就是所谓的预训练网络,文中使用了ResNet网络;由于整个流向是自底向上的,所以我们叫它bottom-up;
  • 层4、5、6对应的支路就是所谓的top-down网络,是FPN的核心部分,名字的来由也很简单。

2. 为什么FPN能够很好的处理小目标?

在这里插入图片描述

图6 FPN处理小目标

如上图所示,FPN能够很好地处理小目标的主要原因是:

  • FPN可以利用经过top-down模型后的那些上下文信息(高层语义信息);
  • 对于小目标而言,FPN增加了特征映射的分辨率(即在更大的feature map上面进行操作,这样可以获得更多关于小目标的有用信息),如图中所示;

三、 FPN性能评估

1. FPN效果定量评估

在这里插入图片描述

表1 Faster R-CNN+FPN结果

如上表所示,我们可以看到当我们使用相同的预训练网络、相同的RPN网络、Fast R-CNN使用不同的方法时,我们的特征层由原来的C4或者C5变化为现在的特征集合Pk,同时FPN方案使用了横向连接(lateral)和top-down模型,算法的性能有了大幅度上升,与a相比提升了2.2个百分点,与b相比提升了4.0个百分点(AP@0.5);对于APs,提升了5.9个百分点;对于APm,提升了5.3个百分点。这也说明了FPN能够提升小目标的检测效果。

在这里插入图片描述

表2 FPN高效训练结果

观察表2,我们可以看到使用FPN的Fast R-CNN+FPN和没有使用FPN的Fast R-CNN方案之间的差别,首先我们的特征维度由1024减少到256维(这样可以大大的减少一些运算量,包括前向和反向运算);我们利用2个MLP层取代了Conv5,作为我们的头分类器;我们的训练时间由原来的44.6小时减少到现在的10.6小时,速度大概提升了4倍;我们的推理时间由原来的0.32s减少到现在的0.15s;最后,我们的准确率提升了2.0个百分点。主要的原因是因为我们通过FPN获得了更加鲁邦的高层语义特征,它使得我们的学习过程更加高效。

在这里插入图片描述

表3 COCO数据集结果展示

如上表所示,我们测试了FPN算法在COCO数据集上面的性能表现,使用了FPN的Faster R-CNN方法获得了很多的最佳指标,尤其是在APs指标上面。总之,我们获得了最好的单模型准确率。

在这里插入图片描述

表4 使用了FPN的RPN效果

如上表所示,我们比较了比较了FPN+RPN和RPN这两种方案,我们可以看到我们的性能有了大幅度的提升。

在这里插入图片描述

表5 top-down和lateral的重要性

在表5中,我们验证了top-down模型和Lateral连接的重要性,同时使用两者的FPN方案取得了最好的结果。相对来讲,Lateral连接起到了更好的效果。

在这里插入图片描述

表7 FPN在实例分割上面的效果

由于FPN是一个特征金字塔,具有很好地泛华能力,可以利用到很多利用深度学习网络的方法中去,包括目标检测、实例分割等。如上表所示,使用了FPN的DeepMask方法可以不仅可以获得性能的提升,同时可以获得速度的提升。(不同的目标在不同的层上面生成对应的Mask)

2. FPN效果定性评估

在这里插入图片描述

图8 FPN实例分割结果

四、 FPN总结

  • FPN 构架了一个可以进行端到端训练的特征金字塔;
  • 通过CNN网络的层次结构高效的进行强特征计算;
  • 通过结合bottom-up与top-down方法获得较强的语义特征,提高目标检测和实例分割在多个数据集上面的性能表现;
  • FPN这种架构可以灵活地应用在不同地任务中去,包括目标检测、实例分割等;

以下是FPN网络的架构细节图。

在这里插入图片描述
在这里插入图片描述

图9 Faster R-CNN+FPN细节图

参考文献

  • FPN对应的poster,参考链接;
  • https://zhuanlan.zhihu.com/p/92005927
  • https://blog.csdn.net/baidu_30594023/article/details/82623623
  • https://www.pianshen.com/article/786269172/
  • https://blog.csdn.net/WZZ18191171661/article/details/79494534

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISLR—第二章 Statistical Learning

Statistical Learning Y 和X的关系why estimate f 用来预测 预测的时候可以将f^当成一个black box来用,目的主要是预测对应x时候的y而不关系它们之间的关系。用来推断 推断的时候,f^不能是一个black box,因为我们想知道predictor和response之…

提高编程思想

虚函数和抽象函数有什么区别 虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写 抽象函数是没有代码,子类继承后一定要重写 ****************************************************************** 在一…

Windows数据库编程接口简介

数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法以及数据库系统…

2019如何转换2010_9102年,你还不知道PPT怎么转换成视频吗?小心落伍了

你在刷抖音的时候有没有刷过这类视频:成为人生赢家必备的书单、5个让你看透人性的电影、6个让你升职加薪的APP...如果你细心观察的话,会发现这类视频的做法基本都是一个样的,像在翻相册一样,一页页过去,所以它们也叫做…

深度学习之RetinaNet

总述 Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。 目标识别有两大经典结构: 第一类是以Faster RCNN为代表的两级识别方法,这种结构的第…

python的datetime函数_Python连载8-datetime包函数介绍

一、datetime包(上接连载7内容)1.函数:datetime(1)用法:输入一个日期,来返回一个datetime类?(2)格式:datetime.datetime(年,月,日,hour,minute,second)其中hour,minute,…

深度学习之 soft-NMS

论文:《Improving Object DetectionWith One Line of Code》soft-NMS 英文论文链接:https://arxiv.org/pdf/1704.04503.pdfsoft-NMS github 链接:https://github.com/bharatsingh430/soft-nms 绝大部分目标检测方法,最后都要用到…

一维二维_Excel二维数据转一维,2种方法轻松搞定

今天是2020年1月1日,祝各位小伙伴们新年快乐,开心每一天~如下所示,左边是二维交叉数据表,我们希望快速转换成右边的一维数据表如果复制粘贴,效率太低了,今天分享两种方法,实现快速转换1、powerq…

深度学习之 Cascade R-CNN

Zhaowei Cai, Nuno Vasconcelos. 《Cascade R-CNN: Delving into High Quality Object Detection》. CVPR 2018.论文链接:https://arxiv.org/abs/1712.00726代码链接:https://github.com/zhaoweicai/cascade-rcnn 前言 IOU阈值被用来定义正负例&#x…

转换文档参数_明明2秒可以搞定Word、Excel相互转换,你却用了半小时!真亏了...

我们在用office三件套工作的时候,经常都需要对文件的格式进行转换,像是Word文档和Excel表格的转换,很多小伙伴都要花上半个小时甚至以上的时间才能搞定,效率实在不行。别担心,今天小编将分享能快速完成Word、Excel转换…

深度学习之 DCN(Deformable Convolution)-可变形卷积

Paper link: http://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdfhttps://arxiv.org/pdf/1703.06211 Code link: https://github.com/msracver/Deformable-ConvNets Abstract 如何有效地对几何图形的变化进行…

软件开发 项目进展 软件架构 指南

软件开发,标准化流水线式开发的实施构想 软件开发,标准化流水线式开发的实施构想 近日看到一篇博文,讨论标准化流水线开发模式的话题,但是这篇博文仅仅提出这个问题,未见回应。 这其实是一个很大的问题,我…

c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现

编者按:最近,研究者们发布了 nocaps 挑战,用以测量在没有对应的训练数据的情况下,模型能否准确描述测试图像中新出现的各种类别的物体。针对挑战中的问题,微软 Azure 认知服务团队和微软研究院的研究员提出了全新解决方…

深度学习之双线性插值(Bilinear interpolation)

1. 什么是插值 Interpolation is a method of constructing new data points within the range of a discrete set of known data points. Image interpolation refers to the“guess”of intensity values at missing locations. 图片放大是图像处理中的一个特别基础的操作。…

深度学习之 OHEM (Online Hard Example Mining)

论文 《Training Region-based Object Detectors with Online Hard Example Mining》链接 https://arxiv.org/pdf/1604.03540.pdf Astract 摘要主要讲了四点: (1) 训练过程需要进行参数的空间搜索(2) 简单样本与难分辨样本之间的类别不平衡是亟需解决的问题(3) 自…

音视频 详解

avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操…

c6011取消对null指针的引用_C++| 函数的指针参数如何传递内存?

函数的参数是一个一级指针,可以传递内存吗?如果函数的参数是一个一级指针,不要指望用该指针去申请动态内存。看下面的实例:#include using namespace std;void GetMemory(char *p, int num){p (char *)malloc(sizeof(char) * num…

深度学习目标检测之 YOLO v2

论文名:《YOLO9000: Better, Faster, Stronger》原文:https://arxiv.org/pdf/1612.08242v1.pdf代码:http://pjreddie.com/darknet/yolo/ YOLO v2 斩获了CVPR 2017 Best Paper Honorable Mention。在这篇文章中,作者首先在YOLOv1的…

深度学习目标检测之 YOLO v3

论文名:《YOLOv3: An Incremental Improvement》论文地址 https://pjreddie.com/media/files/papers/YOLOv3.pdfhttps://arxiv.org/abs/1804.02767v1 论文代码 https://github.com/yjh0410/yolov2-yolov3_PyTorchkeras:https://github.com/qqwweee/keras…

30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

史上最牛的Linux内核学习方法论 点击下载我的arm_linux移植笔记 点击下载S3C2440完全开发流程 点击下载Linux系统命令及其使用详解完整版 点击下载Linux主要shell命令详解 点击下载深入理解Linux内核(第三版 pdf英文版) 点击下载深入分析Linux内核源代码教程pdf完整版 点击下…