【目标检测】FPN网络全解

news2024/9/9 1:03:02

目录:FPN网络详解

  • 一、引言
  • 二、论文概述
    • 2.1 图像金字塔
    • 2.2 为什么需要构造特征金字塔
  • 三、论文详解
  • 四、FPN框架解析
  • 五、为什么FPN能够很好的处理小目标?
  • 六、FPN总结

一、引言

这篇论文是CVPR2017年的文章,采用特征金字塔做目标检测,有许多亮点,特来分享。

特征金字塔(Feature Pyramid Networks, FPN)的基本思想是通过构造一系列不同尺度的图像或特征图进行模型训练和测试,目的是提升检测算法对于不同尺寸检测目标的鲁棒性。但如果直接根据原始的定义进行FPN计算,会带来大额的计算开销。为了降低计算量,FPN采用一种多尺度特征融合的方法,能够在不大幅度增加计算量的前提下,显著提升特征表达的尺度鲁棒性。

R-CNN系列在单个scale的feature map做检测,尽管conv已经对scale有些鲁棒了,但是还是不够。物体各种各样的scale还是是个难题,尤其是小物体,所以有很多论文在这上面做工作,最简单的做法就是类似于数据增强了,train时把图片放缩成不同尺度送入网络进行训练,但是图片变大很吃内存,一般只在测试时放缩图片,这样一来测试时需要测试好几遍实践就慢了。

另一种是SSD的做法,在不同尺度的feature map上做检测,按理说它该在计算好的不同scale的feature map上做检测,但是它放弃了前面的low-level的feature map,而是从conv4_3开始用而且在后面加了一些conv,生成更多高层语义的feature map在上面检测(我猜想是因为这些low-level的feature map一是太大了很大的拖慢SSC最追求的速度,二是这些low-level的语义信息太差了,效果没太大提升)。所以FPN就想既利用conv net本身的这种已经计算过的不同scale的feature,又想让low-level的高分辨的feature具有很强的语义,所以自然的想法就是把high-level的低分辨的feature map融合过来。

二、论文概述

作者提出的多尺度的object detection算法:FPN(feature pyramid networks)。

原来多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。

另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。

2.1 图像金字塔

在这里插入图片描述

如上图所示,这是一个图像金字塔,在很多的经典算法里面都有它的身影,比如SIFT、HOG等算法。

我们常用的是高斯金字塔,所谓的高斯金字塔是通过高斯平滑和亚采样获得一些下采样图像,也就是说第K层高斯金字塔通过平滑、亚采样操作就可以获得K+1层高斯图像,高斯金字塔包含了一系列低通滤波器,其截止频率从上一层到下一层是以因子2逐渐增加,所以高斯金字塔可以跨越很大的频率范围。

总之,我们输入一张图片,我们可以获得多张不同尺度的图像,我们将这些不同尺度的图像的4个顶点连接起来,就可以构造出一个类似真实金字塔的一个图像金字塔。通过这个操作,我们可以为2维图像增加一个尺度维度(或者说是深度),这样我们可以从中获得更多的有用信息。整个过程类似于人眼看一个目标由远及近的过程(近大远小原理)。如上图所示,我们可以看到一个图像金字塔,中间是原始图像,最上边是下采样后的图像,最下边是上采样后的图像。

2.2 为什么需要构造特征金字塔

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

在这里插入图片描述

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

三、论文详解

在这里插入图片描述
上图展示了四种利用特征的形式:

(a) 对图像金字塔的每一层提取特征,应用检测算法只要在任意层检测到了目标,都算检测成功。但是,在实际应用中,基于神经网络的方法本身就非常耗时,如果再使用多个尺度的图像特征进行训练和测试,时间和内存的开销就更大了,因此这种方法很少被真正使用。

(b) 像SPP net,Fast RCNN,Faster RCNN是采用这种方式,即仅采用网络最后一层的特征。卷积神经网络本身也具有金字塔结构,在特征图的不同层上,同样大小的检测窗口在原图的感受野的尺度是不同的。

(c) 像SSD(Single Shot Detector)采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。但这也存在一个问题,特征图不同层次特征的表达能力不同,浅层特征主要反映明暗、边缘等细节,深层特征则反映更丰富的整体结构。单独使用浅层特征是无法包含整体结构信息的,会减弱特征的表达能力。

(d) 因为深层特征本身就是由浅层特征构建的,所以天然包含了浅层特征的信息,一个很自然的想法是,如果再把深层特征融合到浅层特征中,就兼顾了细节和整体,融合后的特征会具有更为丰富的表达能力。本文作者是采用这种方式,顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。

如下图, 上面一个带有skip connection的网络结构在预测的时候是在finest level(自顶向下的最后一层)进行的,简单讲就是经过多次上采样并融合特征到最后一步,拿最后一步生成的特征做预测。而下面一个网络结构和上面的类似,区别在于预测是在每一层中独立进行的。后面有这两种结构的实验结果对比,非常有意思,因为之前只见过使用第一种特征融合的方式。

在这里插入图片描述

作者的主网络采用ResNet。

作者的算法大致结构如下图所示:一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。

图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。

在这里插入图片描述

自下而上的过程实质上是卷积网络前向传播的过程。比如ResNet网络在前向传播的过程中,包含若干个stride=1和stride=2的卷积,经过stride=1的卷积后,特征图的尺度保持不变,经过stride-2的卷积后,特征图的尺度缩小为原来的1/2。我们称连续的尺度不变的各个特征图处于一个网络阶段,对于每个阶段,最后一层特征图包含了这个阶段中最具表达能力的特征。

FPN构造特征金字塔时,选取每个阶段的最后一层特征图构建层级结构。对于ResNet网络而言,用来构造特征金字塔的特征图,就是每个阶段的最后一个残差块(residual block)。直接选取各个特征图的通道数是不同的,这是因为负责后续处理的网络需要在不同层的特征图上滑窗截取特征,这就要求所有层的特征图具有相同的深度(通道数),为了使得各个特征图具有相同的深度,FPN对选取的每个特征图增加一次1×1的卷积操作,以此转化成统一的通道数。

分别在conv2、conv3、conv4、conv5对应阶段的最后一个残差块上使用一个1×1卷积变换成d维通道(比如d=256),并分别标记为C1、C2、C3、C4。因为相邻两个阶段之间的特征图有2倍的尺度缩放,所以C1、C2、C3、C4,的宽、高尺度分别为原图的1/4、1/8、1/16和1/32,深度全都等于d维。此处之所以没有选择convl,是为了避免过大的内存消耗,如果不考虑内存的问题,使用convl也是没有问题的。

自上而下的过程实质上是通过把上层的特征图进行尺度变换,来构造新的特征图,新的特征图需要和下层的特征图保持一致的尺度,从而保证特征图可以融合在一起。在长、宽方向上,采用向上采样(upsample)的方法,和下层特征图的宽、高拉成一样大小;在深度方向上,通过一个1×1的卷积,把上层特征图的深度压缩到和下层特征图的深度相同。综合使用上采样操作和1×1的卷积 操作,就从上层特征图构造出了一个和下层特征图尺度完全一致的新的特征图。

经过自上而下的过程,基于上层特征图构建的新特征图和原始的下层特征图具有了同样的尺度。如图2所示,先把新的特征图和原始的下层特征图中每个对应元素相加(element-wise add),就实现了上层特征和下层特征的融合,再把融合后的每层特征图都输出为一个深度为d(比如d=256)的新特征图。

为了消除两个特征图对应元素直接相加可能带来的融合不充分的问题,FPN在融合之后的特征图上使用一个3×3卷积进行平滑处理,从而得到一个融合得更加充分的特征图。至此,完成了特征金字塔的构建,特征金字塔每一层特征图都融合了低维和高维的特征,各层的长、宽尺度不同,但通道数相同。后续任务的网络分别在特征金字塔的各个特征图上进行特征截取,就能得到多个尺度的特征。 FPN是使用卷积神经网络构建特征金字塔,用于多尺度目标检测的通用方法,可以广泛地应用于候选框的筛选(RPN)、Fast R-CNN 检测等场景中,如图2所示。多组实验结果表明 2xup,在不明显增加计算开销和内存开 lxl conv销的情况下,FPN能够明显提升多尺度目标检测算法的性能。

自底向上其实就是网络的前向过程。在前向过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。

自顶向下的过程采用上采样(upsampling)进行,而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。并假设生成的feature map结果是P2,P3,P4,P5,和原来自底向上的卷积结果C2,C3,C4,C5一一对应。

四、FPN框架解析

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

首先,选择一张需要处理的图片,然后对该图片进行预处理操作;

然后,将处理过的图片送入预训练的特征网络中(如ResNet等),即构建所谓的bottom-up网络;

接着,如下图所示,构建对应的top-down网络(即对层4进行上采样操作,先用1x1的卷积对层2进行降维处理,然后将两者相加(对应元素相加),最后进行3x3的卷积操作,最后);

接着,在图中的4、5、6层上面分别进行RPN操作,即一个3x3的卷积后面分两路,分别连接一个1x1的卷积用来进行分类和回归操作;

接着,将上一步获得的候选ROI分别输入到4、5、6层上面分别进行ROI Pool操作(固定为7x7的特征);

最后,在上一步的基础上面连接两个1024层的全连接网络层,然后分两个支路,连接对应的分类层和回归层;
在这里插入图片描述

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

五、为什么FPN能够很好的处理小目标?

在这里插入图片描述
如上图所示,FPN能够很好地处理小目标的主要原因是:

 FPN可以利用经过top-down模型后的那些上下文信息(高层语义信息);

 对于小目标而言,FPN增加了特征映射的分辨率(即在更大的feature map上面进行操作,这样可以获得更多关于小目标的有用信息),如图中所示;

六、FPN总结

 FPN 构架了一个可以进行端到端训练的特征金字塔;

 通过CNN网络的层次结构高效的进行强特征计算;

 通过结合bottom-up与top-down方法获得较强的语义特征,提高目标检测和实例分割在多个数据集上面的性能表现;

 FPN这种架构可以灵活地应用在不同地任务中去,包括目标检测、实例分割等;

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

在这里插入图片描述

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

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

相关文章

让程序“说话”pyttsx3模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 让程序“说话” pyttsx3模块 选择题 关于下列代码说法错误的是? import pyttsx3 enginepyttsx3.init() engine.setProperty(rate,180) engine.say(我喜欢学习python数据分析&#x…

统信软件根社区斩获CSDN两项大奖

在CSDN 2022中国开发者影响力盛典中,统信软件根社区凭借多年的深耕与投入以及社区影响力,荣获CSDN 2022年度开发者社区;旗下社区发行版deepin荣获CSDN 2022年度开源影响力项目。 CSDN颁奖现场 “CSDN 2022 中国开发者影响力年度评选”自 20…

温故知新:从计算机体系结构看操作系统

知识诅咒(Curse of Knowledge),是指我们掌握了某知识,就很难体会没有它的感觉,不理解获得知识以前的状态及还未获得该知识的人,从而产生沟通障碍。计算机体系结构正在消亡 (Architecture is dying)&#xf…

一篇用 AI 生成的跨年感怀

一言难尽的2022终于过去了虽然跨年,只是我们的星球围绕我们的恒星环行一周的时间标记,并不真的代表什么。但我们就是希望多事而沉重的一年能快点滚蛋,新的生活能开门重启。我用 Midjourney 生成了很多跨年场景的图。prompt 很简单&#xff0c…

2003-2021年飞机航线数据

1、时间为:2003-2021年 2、指标包括: 起点城市、起点城市所属地级市、起点城市所属省份、起点机场、终点城市、终点城市所属地级市、终点城市所属省份、终点机场、 航空公司、航班、机型、出发时间、到达时间、准点率、班次_周一、班次_周二、班次_周…

RabbitMQ路由模式

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉Linux专栏 🔥欢迎大佬指正,一起学习!一起加油! 目录&…

每个程序员都需要掌握的 7 项基本技能

每个 Coder 需要掌握的 7 项基本技能是:1. 编程语言:程序员可以学习多种编程语言,最重要的具体语言取决于他们想从事的工作类型。一些最常见的编程语言包括 Java、C、Python 和 JavaScript。对于编码人员来说,精通至少一种编程语言…

51. N 皇后

51. N 皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方…

剑指offer----C语言版----第七天

目录 1. 旋转数组中的最小数字 1.1 题目描述 1.2 思路一 1.3 思路二 1.4 小试牛刀 1. 旋转数组中的最小数字 原题链接: 剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode)https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-…

GCC学习笔记

(1)什么是GCC (2)用gcc编译文件 gcc test.c -o app 【编译test.c文件得到app可执行文件】 ./app 【运行可执行文件】 (3)编程语言的发展 (4)gcc工作流程 预处理 作用:…

剑指 Offer 26. 树的子结构

题目 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 给定的树 B: 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节…

JavaScript中如何将十进制转换为十六进制?

​ 在本文中,我们将学习如何在 JavaScript 中轻松地将十进制数转换为其等效的十六进制数。 我们将研究一些需要执行此操作的真实场景。 数字toString() 方法 要在 JavaScript 中将十进制转换为十六进制,请对十进制调用 toString() 方法,将 1…

JUC并发编程学习笔记(四)callable接口与辅助类

6 Callable&Future 接口 6.1 Callable 接口 创建线程的多种方式: 继承Thread类实现Runnable接口Callable接口线程池 ​ 目前我们学习了有两种创建线程的方法一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runn…

某电视 频道headers参数x-itouchtv-ca-signature逆向

本文仅供参考学习,如有侵权可联系本人 某电视(荔枝平台)平台逆向 目标链接 aHR0cHM6Ly93d3cuZ2R0di5jbi9jaGFubmVsRGV0YWlsLzI0Ng接口链接: aHR0cHM6Ly9nZHR2LWFwaS5nZHR2LmNuL2FwaS9jaGFubmVsL3YxL25ld3M/cGFnZVNpemU9NDAmY2hhbm5lbElkPTI0NiZjdXJy…

纯注解驱动SSM整合

纯注解驱动SSM整合 Jdbc.java package com.itheima.confing;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class J…

思购趣拼秒杀模式的逻辑与模式特点

读:小镇上来了一个陌生的年轻人,年轻人交了一百块定金给旅馆的老板去楼上挑房间,旅馆老板拿着这一百块钱还给了卖猪肉的,卖猪肉的把钱还给了卖饲料的,卖饲料的把钱还了厂商,厂商拿着钱还给了按摩店的小姐&a…

一文说清MySQL索引数据结构

前言 接上篇说到,小A匆匆忙忙的赶回宿舍,因为晚上他要给女神整理讲解MySQL中索引数据结构资料。一边整理一边忍住不笑了起来,等小美看到这篇文章不得爱上自己。当上小美男朋友,从此踏上人生巅峰不是梦(该考虑一下孩子…

C#,图像二值化(12)——基于谷底最小值的全局阈值算法与源代码

1、基于谷底最小值的阈值 这个方法适用于通过有限的迭代次数,平滑后能得到双峰的图像,让双峰的谷底成为阈值。当执行完基于谷底最小值的阈值操作的时候,改变了直方图信息,使之成为处理过后的直方图信息,这时候显示Doc…

LeetCodeday05

面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: public class Leetcode0207 {public static void main(…

ChatGPT背后的模型

文章目录1.RLHF方法2.ChatGPT中的RLHF方法2.1 微调模型GPT-32.2 训练奖励模型2.3 利用强化学习进一步微调语言模型3.效果4.面临挑战5.参考InstructGPT语言模型,是一个比 GPT-3 更善于遵循用户意图,同时使用通过我们的对齐研究开发的技术使它们更真实、毒…