FPN详解

FPN详解论文题目:FeaturePyramidNetworksforObjectDetection论文链接:论文链接论文代码:Caffe版本代码链接一、FPN初探1.图像金字塔图1图像金字塔图2高斯金字塔效果如上图所示,这是一个图像金字塔,做CV的你肯定很熟悉,因为在很多的经典算法里面都有它的身影,比如SIFT、HOG等算法。我们常用的是高斯金字塔…

大家好,又见面了,我是你们的朋友全栈君。

论文题目:Feature Pyramid Networks for Object Detection

论文链接:论文链接

论文代码:Caffe版本代码链接

 

一、FPN初探

1. 图像金字塔

FPN详解

图1 图像金字塔

FPN详解

图2 高斯金字塔效果

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

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

FPN详解

图3 特征金字塔

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

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

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

FPN详解

图4 不同方案的金字塔

识别不同大小的物体是计算机视觉中的一个基本挑战,我们常用的解决方案是构造多尺度金字塔。如上图a所示,这是一个特征图像金字塔,整个过程是先对原始图像构造图像金字塔,然后在图像金字塔的每一层提出不同的特征,然后进行相应的预测(BB的位置)。这种方法的缺点是计算量大,需要大量的内存;优点是可以获得较好的检测精度。它通常会成为整个算法的性能瓶颈,由于这些原因,当前很少使用这种算法。如上图b所示,这是一种改进的思路,学者们发现我们可以利用卷积网络本身的特性,即对原始图像进行卷积和池化操作,通过这种操作我们可以获得不同尺寸的feature map,这样其实就类似于在图像的特征空间中构造金字塔。实验表明,浅层的网络更关注于细节信息,高层的网络更关注于语义信息,而高层的语义信息能够帮助我们准确的检测出目标,因此我们可以利用最后一个卷积层上的feature map来进行预测。这种方法存在于大多数深度网络中,比如VGG、ResNet、Inception,它们都是利用深度网络的最后一层特征来进行分类。这种方法的优点是速度快、需要内存少。它的缺点是我们仅仅关注深层网络中最后一层的特征,却忽略了其它层的特征,但是细节信息可以在一定程度上提升检测的精度。因此有了图c所示的架构,它的设计思想就是同时利用低层特征和高层特征,分别在不同的层同时进行预测,这是因为我的一幅图像中可能具有多个不同大小的目标,区分不同的目标可能需要不同的特征,对于简单的目标我们仅仅需要浅层的特征就可以检测到它,对于复杂的目标我们就需要利用复杂的特征来检测它。整个过程就是首先在原始图像上面进行深度卷积,然后分别在不同的特征层上面进行预测。它的优点是在不同的层上面输出对应的目标,不需要经过所有的层才输出对应的目标(即对于有些目标来说,不需要进行多余的前向操作),这样可以在一定程度上对网络进行加速操作,同时可以提高算法的检测性能。它的缺点是获得的特征不鲁棒,都是一些弱特征(因为很多的特征都是从较浅的层获得的)。讲了这么多终于轮到我们的FPN啦,它的架构如图d所示,整个过程如下所示,首先我们在输入的图像上进行深度卷积,然后对Layer2上面的特征进行降维操作(即添加一层1×1的卷积层),对Layer4上面的特征就行上采样操作,使得它们具有相应的尺寸,然后对处理后的Layer2和处理后的Layer4执行加法操作(对应元素相加),将获得的结果输入到Layer5中去。其背后的思路是为了获得一个强语义信息,这样可以提高检测性能。认真的你可能观察到了,这次我们使用了更深的层来构造特征金字塔,这样做是为了使用更加鲁棒的信息;除此之外,我们将处理过的低层特征和处理过的高层特征进行累加,这样做的目的是因为低层特征可以提供更加准确的位置信息,而多次的降采样和上采样操作使得深层网络的定位信息存在误差,因此我们将其结合其起来使用,这样我们就构建了一个更深的特征金字塔,融合了多层特征信息,并在不同的特征进行输出。这就是上图的详细解释。(个人观点而已)

 

二、FPN框架解析

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

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

FPN详解

图5 FPN整体架构

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

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

FPN详解

图6 FPN处理小目标

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

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

 

三、 FPN性能评估

1. FPN效果定量评估

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能够提升小目标的检测效果。

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获得了更加鲁邦的高层语义特征,它使得我们的学习过程更加高效。

FPN详解

表3 COCO数据集结果展示

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

FPN详解

表4 使用了FPN的RPN效果

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

FPN详解

表5 top-down和lateral的重要性

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

FPN详解

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

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

2. FPN效果定性评估

FPN详解

图8 FPN实例分割结果

 

四、 FPN总结

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

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

FPN详解

图9 Faster R-CNN+FPN细节图

 

参考文献

[1] FPN对应的poster,参考链接

 

注意事项

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家。

[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。

[3] 如果您在阅读本博客时遇到不理解的地方,希望可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。

[4] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130014.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 牛客暑假多校第二场 K carpet

    牛客暑假多校第二场 K carpet

  • WOL开启远程唤醒开机功能笔记

    WOL开启远程唤醒开机功能笔记现在主板都支持网卡远程唤醒功能,要是用远程唤醒功能。具体如下操作:1.CMOS开启PCIE设备唤醒功能即网卡远程唤醒功能有点主板显示wakeonlan如:2.进入系统后设备管理-网卡配置-高级-关机网络唤醒魔术封包唤醒及样式比对唤醒通通开启。3.网卡的电源管理选项中,允许计算机关闭此设备以节约电源一定要关闭,否则网卡断电了就无法唤醒了。4.静态绑定IP,这样就可以通过wakeonlan局域网远程唤醒开机了。但外网远程唤醒还需要有公网IP和路由器端口映射下。如果要外.

  • MySQL——SQL练习题

    MySQL——SQL练习题

  • Java getinstance(java如何实现输入)

    1.背景实际中经常使用getInstance()方法返回一个对象,对于工厂模式,传入对应的参数返回与之相对应的对象.但是,问题来了,返回的对象需要被强制转换,很麻烦.importjava.lang.reflect.*;publicclasstest{publicstaticvoidmain(String[]args){test1t1=factory.getInstance(“…

  • 数学建模算法学习——各类模型算法汇总[通俗易懂]

    数学建模算法学习——各类模型算法汇总[通俗易懂]相关模型解决的问题数据分析类算法一览100个经典动态规划方程优化问题线性规划简介:线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号。为了避免这种形式多样性带来的不便,Matlab中规定线性规划的标准形式为其中c和x为n维列向量,A、Aeq为适当维数的矩阵,b、beq为适当维数的列向量。代码实现…

  • 作用域插槽(作用域插槽传值)

    作用域插槽一:假设第一个场景,需要你写一个商品卡片组件,并通过循环去展示多个卡片,并且要求能响应每个卡片上的图片或者其他内容的点击事件而跳转到商品详情页,你会怎么写?我会使用如下的处理方式,首先将商品卡片写成一个组件Commodity.vue,而在CommodityList.vue中用一个v-for来处理商品卡片列表的展示。<commodityv-for=”(item,index)incommodities”@clickCommodity=”onCommodityClick”>&l

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号