18_特征金字塔网络FPN结构详解

1.1 简介

在深度学习领域,尤其是计算机视觉和目标检测任务中,Feature Pyramid Networks (FPN) 是一种革命性的架构设计,它解决了多尺度特征检测和融合的关键问题。FPN最初由何凯明等人在2017年的论文《Feature Pyramid Networks for Object Detection》中提出,自那以后,它成为了许多现代目标检测框架的核心组件。

FPN的核心思想

FPN的核心思想在于构建一个特征金字塔,这个金字塔能够同时利用深度卷积网络中不同层级的特征。传统的卷积网络往往只能在某个固定的特征层级进行预测,这限制了它们对多尺度目标的有效检测。FPN通过引入自顶向下的路径和横向连接,巧妙地融合了高层的语义信息(丰富的类别信息但空间分辨率较低)与底层的空间细节信息(高分辨率但语义信息较少),从而在不同的尺度上都能实现高效且准确的目标定位。

架构特点

  1. 自顶向下的路径:FPN首先将深层(高语义级别但低分辨率)特征图通过上采样(例如双线性插值)逐级上移,使其尺寸与浅层特征图匹配。

  2. 横向连接:在每个上采样后的特征图与其对应的浅层特征图之间添加横向连接,通过1x1卷积来调整通道数,并将两者相加,以此结合深层次的语义信息与浅层次的空间细节信息。

  3. 多尺度预测:在每个融合后的特征图上都设置预测头(例如用于分类和回归的任务头),这样可以在每个层级上都对不同大小的目标进行检测,提高了对小物体检测的准确性。

应用与影响

FPN的提出显著提升了目标检测系统的性能,尤其是在处理不同尺度物体检测方面,减少了小物体的漏检率,同时保持了对大物体的高检测精度。它的有效性不仅限于目标检测,还被广泛应用于实例分割、语义分割以及其他需要多尺度特征分析的视觉任务中。

总结

FPN通过其创新的特征融合机制,为深度学习中的多尺度目标检测问题提供了一个优雅且高效的解决方案。它不仅提升了检测系统的准确性和效率,还促进了后续一系列基于特征金字塔结构的改进和发展,成为了现代计算机视觉架构设计中不可或缺的一部分。

1.2 FPN的原理

原理

核心挑战:在目标检测任务中,目标可能出现在图像的不同位置和不同尺度上。传统方法如图像金字塔或单独使用高层(高语义但低分辨率)或低层(高分辨率但低语义)特征图往往不能有效同时解决多尺度问题。

解决方案:FPN通过创建一个特征金字塔来合并不同尺度的特征,这个金字塔包含了从细粒度到粗粒度的所有尺度信息。它利用了骨干网络(如ResNet、VGG等)生成的多层特征图,通过自顶向下和横向连接的方式融合这些特征。

流程

  1. 自下而上(Bottom-Up Pathway)

    • 输入图像通过骨干网络(如ResNet的C1至C5层),每经过一层卷积和池化,特征图的尺寸减小(分辨率降低),但通道数(特征维度)增加。这个过程提取了从低级到高级的特征,高级特征富含语义信息但空间分辨率较低。
  2. 构建顶层特征

    • 从骨干网络的最后一层特征(例如C5)开始,使用1x1卷积来减少通道数,生成一个高层次特征图,标记为P5。这个操作既降低了计算复杂度,也为后续上采样操作做准备。
  3. 自顶向下路径(Top-Down Pathway)

    • 对P5进行上采样(常用双线性插值或最近邻插值),使其尺寸与下一层特征图(例如C4)匹配,然后通过横向连接与C4特征图相加。这里的横向连接先用1x1卷积调整C4的通道数,确保与上采样后的P5具有相同数量的通道,之后相加得到新的特征图P4。这个过程递归进行,直到覆盖所有需要的尺度。
  4. 特征融合与输出

    • 在每个融合后的特征图(P2至P5)上,可以附加额外的卷积层来生成最终的预测,比如边界框的回归和类别的分类得分。这样,FPN能够在每个尺度上直接预测目标,适应不同大小的目标检测。

优势

  • 多尺度特征融合:通过自顶向下和横向连接,FPN能够在不同尺度上综合语义信息和空间细节,提高了对小目标的检测能力。
  • 高效计算:相比图像金字塔,FPN复用了同一输入图像的特征,避免了多次运行骨干网络的高昂计算成本。
  • 灵活性:FPN结构易于集成到现有的目标检测框架中,如Faster R-CNN、Mask R-CNN等,提升了整体性能。

下图中的(d)就是FPN结构。我们先看一下abc,对于a是将不同尺度的图片生成的特征图都做一次预测,这样做明显速度非常慢。b是将图片最后的特征图做一次预测,c是同一尺度的图片生成的不同尺度的特征图都做一次预测。

对于FPN,它并不是在我们backbone上不同特征图进行一个预测,而是会将我们不同特征图上的特征去进行一个融合,然后在我们融合之后的特征图上再进行一个预测。通过论文的实验我们可以了解到,这样做确实有助于我们提升网络的检测效果。

1.3 FPN的具体细节

特征图大小的选取是有规则的,即自底向上依次除以2,假如最底层是28x28,那么上面一层就是14x14,在上面一层是7x7.

针对每一个特征图,我们都会先去使用一个1x1的卷积层进行处理(调整channel保证一致),因为不同特征图对应的channel一般情况下是不一样的。

那么高层(上面)的特征图如何与下面的特征图进行融合的呢?就是将上面的特征图进行一个2倍的上采样后,与1x1卷积之后的那个较大的特征图进行一个add的操作。

那么2倍上采样是怎么实现的呢?论文里使用的就是“临近插值算法”。

临近插值算法

临近插值算法(Nearest Neighbor Interpolation),又称最近邻插值,是一种简单且计算效率高的图像缩放方法。在数字图像处理中,当需要改变图像的尺寸,特别是放大图像时,临近插值算法通过直接复制最近的像素值来估算新像素的位置值,不涉及像素值的混合或计算。

原理

  1. 定义: 当需要从一个低分辨率图像创建一个高分辨率图像时,新图像中的每个像素都需要从原图像中找到一个对应的值。在临近插值中,新图像中的每个像素值直接取自原图中距离最近的已知像素点的值。

  2. 操作步骤:

    • 首先,确定新图像的尺寸和原始图像的尺寸之间的比例关系。
    • 对于新图像中的每一个像素位置,计算该像素在原始图像中的对应位置。由于尺寸变化,这个对应位置通常是浮点数,而非整数坐标。
    • 取这个浮点坐标的整数部分,即找到了原图中最邻近的像素。
    • 将该邻近像素的值直接赋给新图像中的当前位置,忽略小数部分,不进行任何插值计算。

特点

  • 优点:

    • 计算速度快,实现简单,不需要额外的计算资源。
    • 保持了原图的锐利边缘,适用于需要保持图像边缘清晰度的场合。
  • 缺点:

    • 图像放大后,由于直接复制像素,会导致图像看起来像素化严重,边缘可能出现明显的阶梯效应,降低了图像的视觉质量。
    • 对于含有精细细节或渐变区域的图像,这种插值方法不能很好地恢复细节,可能会丢失重要的图像信息。

应用场景

尽管临近插值因牺牲图像质量而不适合要求高的图像处理任务,但它在某些特定情况下仍非常有用,比如在实时系统中,当处理速度优先于图像质量时,或者在一些算法的初步处理阶段,当需要快速预览结果而不关注细节时。此外,在某些特定的图像处理算法,如一些目标检测或图像分类任务的预处理阶段,如果对图像细节的要求不高,也可能使用临近插值来加速处理过程。

1.4 FPN网络结构

以Resnet50为例,假设输入的图像是640x640x3的RGB图像,我们对每个CONV生成的特征矩阵记为C2、C3、C4、C5,然后将我们得到的特征图进行一个1x1的卷积来调整channel,然后我从再从C5到C2(自顶向下)进行特征图的融合

因为我们最后生成了不同尺度的预测特征层,所以我们可以在不同的预测特征层上去分别针对不同尺度的目标进行预测。

我们之前看Faster R-CNN只有一个预测特征层,所以我们只在那一个层上去生成不同尺度和比例的anchor。

在FPN当中,我们不同的预测特征层会针对不同的面积,例如P2,P2是底层的特征层,它会保留更多的底层细节信息,所以它更适合去预测小型的目标,所以我们会将32²,比例为1:1,2:1,1:2的anchor在P2上进行生成。同理P3使用64²,P4使用128²,P5使用256²,P6使用512²。

至于不同的预测特征层,是否需要针对每一个特征层都去使用RPN和FastRCNN的模块呢?在论文里作者也进行了实验,在原论文当中,实验结果发现我们在不同的预测特征层上共用同一个RPN和FastRCNN和我们分别用,效果或者说检测精度几乎没有什么差异,所以共享是更好的,这样做能够减少训练参数和网络的大小,提升训练速度。

1.5  RPN生成的proposal如何映射到对应的预测特征层上

w,h对应的是PRN预测得到的一系列proposal它在原图上的宽高,k0=4,k代表之前提到的P2-P5。

举个例子proposal在原图上的宽高是112x112,那么log2括号内的值为1/2,log2(1/2)应为-1,加上k0后等于3,再向下取整还是3,那么就对应在我们的P3特征预测层上进行预测。

 pytorch官方实现

1.6 有哪些网络用到了FPN

特征金字塔网络(FPN)自从被提出以来,因其在物体检测和语义分割任务中显著提升性能的能力,已被广泛应用于多种深度学习网络结构中。以下是一些采用或集成FPN结构的知名网络模型:

  1. Faster R-CNN with FPN:FPN首次被提出时,就是作为 Faster R-CNN 模型的一部分,用于改进候选区域生成网络(Region Proposal Network, RPN),以及在检测阶段结合多尺度特征。

  2. Mask R-CNN:在Mask R-CNN中,FPN也被用来改善实例分割任务的表现,通过在FPN的不同层上进行预测,提高了对不同尺度物体的分割精度。

  3. RetinaNet:这是与FPN一同发表的另一项工作,它结合FPN结构设计了一个新的单阶段物体检测器,利用FPN的多尺度特性来解决物体检测中的类别不平衡问题,并且使用了Focal Loss。

  4. YOLOv3/YOLOv4:YOLO(You Only Look Once)系列的后期版本,如YOLOv3和YOLOv4,也采用了特征金字塔网络的思想来处理多尺度检测,以提高对不同大小目标的检测能力。

  5. EfficientDet:这是一个高效的目标检测模型系列,它结合了BiFPN(即改进的特征金字塔网络)来优化特征融合和多尺度特征处理,从而在保持较高精度的同时显著提高了运行效率。

  6. Panoptic FPN:这是为了解决全景分割任务而提出的,它在FPN的基础上进一步发展,旨在统一实例分割和语义分割,提供一个全面的分割输出。

  7. COCO-DRN:Deep Residual Network(DRN)结合FPN用于COCO数据集上的目标检测任务,展示了FPN在不同网络架构上的泛化能力。

除了这些,还有许多研究者在自己的定制化网络结构中融入了FPN的理念,以期在不同的视觉任务上取得更好的性能。FPN因其灵活性和有效性,已成为现代物体检测和分割网络设计中的一个标准组件。

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

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

相关文章

保护您的数据:应对MKP勒索病毒的有效策略

导言: 在当今数字化时代,.mkp勒索病毒等恶意软件已经成为广泛存在的安全威胁,对个人用户和企业的数据安全构成了严峻挑战。本文将探讨.mkp勒索病毒的特点、传播方式以及创新的应对策略,旨在帮助读者更有效地应对这一威胁。如不幸…

Python面试题:请解释什么是模块和包,并描述它们的区别

在 Python 中,模块(module)和包(package)是组织和管理代码的两种方式。它们帮助开发者创建结构化、可维护和可复用的代码。 模块(Module) 模块是包含 Python 代码的文件,扩展名为 …

ansible常见问题配置好了密码还是报错

| FAILED! > { “msg”: “Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host’s fingerprint to your known_hosts file to manage this host.” } 怎么解决&#xf…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时,脸部细节往往不够精细? 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时,我们往往会发现自己…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗? 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑,并提供完整的项目代码和电路图,即使是 Ardu…

在mac下 Vue2和Vue3并存 全局Vue2环境创建Vue3新项目(Vue cli2和Vue cli4)

全局安装vue2 npm install vue-cli -g自行在任意位置创建一个文件夹vue3,局部安装vue3,注意不要带-g npm install vue/cli安装完成后,进入目录,修改vue为vue3 找到vue3/node-moudles/.bin/vue,把vue改成vue3。 对环境变量进行配置…

linux修改内核实现禁止被ping(随手记)

概述 Linux默认允许被ping。其主要决定因素为: 内核参数防火墙(iptables/firewall) 以上的决定因素是与的关系,即需要均满足。 因此,修改linux禁被ping有以上两种方法可以实现。 修改内核文件使禁ping 1. 临时生…

Windows环境安装Redis和Redis Desktop Manager图文详解教程

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Redis概述 Redis是一个开源的高性能键值对数据库,以其卓越的读写速度而著称,广泛用于数据库、缓存和消息代理。它主要将数据存储在内存中&#xff0…

C++初学者指南-5.标准库(第一部分)--迭代器

C初学者指南-5.标准库(第一部分)–迭代器 Iterators 文章目录 C初学者指南-5.标准库(第一部分)--迭代器 Iterators1.默认正向迭代器2.反向迭代器3.基于迭代器的循环4.示例:交换相邻的一对元素5.迭代器范围6.迭代器范围中的元素数量7. 总结:迭代器 指向某…

护网在即,知攻善防助力每一位安服仔~

前言 是不是已经有师傅进场了呢~ 是不是有安服🐒在值守呢~ 您是不是被网上眼花缭乱的常用应急响应工具而烦恼呢? 何以解忧?唯有知攻善防! 创作起源: 驻场、护网等,有的客户现场只允许用客户机器&…

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫:Scrapy框架的全面解析 一、引言 在当今互联网的时代,数据是最重要的资源之一。为了获取这些数据,我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言,拥有许多用于网络爬虫的工具和库…

puppeteer 爬虫初探

1. puppeteer 和 puppeteer-core 安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器; 安装 puppeteer-core ,不会安装 chrome, 若要程序打开浏览器运行时,需手动指定电脑系统安装的 chrome 浏览器路径; 2. puppeteer-core …

按键控制LED流水灯模式定时器时钟

目录 1.定时器 2. STC89C52定时器资源 3.定时器框图 4. 定时器工作模式 5.中断系统 1)介绍 2)流程图:​编辑 3)STC89C52中断资源 4)定时器和中断系统 5)定时器的相关寄存器 6.按键控制LED流水灯模…

一个最简单的comsol斜坡稳定性分析例子——详细步骤

一个最简单的comsol斜坡稳定性分析例子——详细步骤 标准模型例子—详细步骤 线弹性模型下的地应力平衡预应力与预应变、土壤塑性和安全系数求解的辅助扫描

七月记录上半

7.5 运行mysql脚本 mysql -u root -p 数据库名 < 脚本名 7.6 使用screen在服务器后台长期运行一个程序&#xff1a; screen -S 窗口名&#xff1a;创建窗口 执行程序脚本 ctrlad&#xff1a;退出窗口 screen -ls &#xff1a;查看所有窗口 screen -r 窗口号 &#…

SpringBoot整合Easy-Es最佳实践

文章目录 1.1 部署ES和Kibana1.2 SpringBoot整合ES及配置1.2.1 引入相关依赖1.2.2 YML相关配置 1.3 索引CRUD1.3.1 索引托管自动挡1.3.1.1 配置实体模板1.3.1.2 配置启动模式 1.3.2 索引手动挡1.3.2.1 配置启动模式1.3.2.2 配置实体模板1.3.2.3 创建索引1.3.2.4 查询索引1.3.2.…

【INTEL(ALTERA)】为什么在设计迁移后,无法在Nios II BSP 编辑器中找到 DDR3 作为内存区域

目录 说明 解决方法 说明 将设计从 Quartus II 14.1 及以下迁移到 Quartus prime 17.0 时&#xff0c;DDR3 不再被识别为Nios II BSP 编辑器区域中的内存区域。 解决方法 迁移设计后&#xff0c;从 Qsys 设计中移除 DDR3 IP&#xff0c;然后将其再次添加。生成 Qsys 文件后…

车牌号查车辆信息-车牌号查车辆信息接口-汽车API接口

接口简介&#xff1a;输入车牌号&#xff0c;返回车辆相关信息&#xff08;无车主信息&#xff09;。初始登记日期、上险日期、保险到期时间、车架号、品牌这些数据会返回&#xff0c;其他数据不一定全部返回&#xff0c;,详细参数请查看返回接口文档 一般在新车上险或过户后第…

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

数学系C++(六七)

目录 * &指针与地址 void指针 指针可以等于&#xff1a; const 指向常量的指针 const int *px 常指针 int * const px 指向常量的常指针const 类型标识符 * const 指针名 指针加减&#xff1a; 指针恒等式 函数指针【待续】 指针型函数&#xff1a; 指向函数的…