FPN(Feature Pyramid Network)详解

2024-04-11 03:04

本文主要是介绍FPN(Feature Pyramid Network)详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章涉及个人理解部分,可能有不准确的地方,敬请指正

0. 概述

FPN,全名Feature Pyramid Networks,中文称为特征金字塔网络。它是2017年cvpr上提出的一种网络,主要解决的是目标检测中的多尺度问题。FPN通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小物体检测的性能。

1. 产生动机

目标检测领域中,多尺度检测一直是个挑战,特别是小目标。以往(作者成文的时候,不是现在)检测主要分为三类:
在这里插入图片描述
a)使用单特征层。将特征提取网络最后一层输出的特征图,拿去做检测、识别,这是最早期,最一般的方法,该方法的缺点在于,最后一层特征图的尺寸一般都比较小了,无法准确定位目标。
b)多尺度输入。将输入图像resize成多个尺度,然后对每个尺度的图像提取出不同尺度的特征,这种方法计算量很大,因为要进行多次特征提取,即走了好几遍backbone。
c)多尺度特征。在特征提取时,保留中间层的不同尺度上的特征图,对每个尺度的特征图进行预测,这样做是不错的,但是高层特征图只具有丰富的语义信息,而低层特征图只有丰富的位置信息,没有将两者进行结合。

此时,文章作者就想到,如果能对方法 c)中不同尺度的特征图进行融合,岂不美哉,于是FPN就诞生了。

FPN的大致结构长这样:在这里插入图片描述
FPN对高层特征图(尺寸越小越高)进行上采样,然后跟上一层的特征图进行相加融合,这样就使融合后的特征图既包含高层的语义信息,又包含低层的结构信息。而且这样做只增加少量的计算量,是完全可以接受的。

所以简单来说,FPN主要有两个特点

  • 输出多尺度特征图,对不同尺度的目标都有不错的效果;
  • 不同尺度特征图之间进行了融合,使特征图同时具有高层语义信息和低层结构信息。

2. 网络结构详解

在这里插入图片描述
网络结构大致可以分为三个部分讲解,作者还分别给他们起了名

2.1 buttom-up

这一部分就是常见的特征提取网络,比如VGG,ResNet之类的,不过对特征图的输出尺度有要求,相邻的输出特征图尺度是2倍的关系。作者以ResNet为例,以conv2, conv3, conv4, conv5的输出作为输出特征图,假设他们的输出特征图分别是 { C 2 , C 3 , C 4 , C 5 } \{C2,C3,C4,C5\} {C2,C3,C4,C5},他们的尺度分别是输入图像的 { 1 4 , 1 8 , 1 16 , 1 32 } \{{\frac{1}{4}, \frac{1}{8},\frac{1}{16},\frac{1}{32}}\} {41,81,161,321},可以看到,相邻的特征图之间的尺寸是2倍的关系。

2.2 top-down

该部分进行特征的融合操作,具体流程是, C 5 C5 C5特征图进行2倍上采样,与 C 4 C4 C4相加,因为 C 5 C5 C5的尺寸是 C 4 C4 C4 1 2 \frac{1}{2} 21,所以进行2倍上采样之后,尺寸与 C 4 C4 C4一致,可以进行相加。然后将相加的结果再进行2倍上采样,与 C 3 C3 C3相加,以此类推。每一层融合后的特征图都要拿去做预测。

2.3 lateral

这一部分定义了融合操作的具体操作
1、每一层的输出特征图要先经过一个 1 × 1 1×1 1×1的卷积核,为啥呢,为了将每个特征图的通道数变为相同,因为高层特征图的通道数往往比较多,而低层特征图的通道数比较少,即使进行了上采样也无法进行相加
2、2倍上采样采用的是最简单的最近邻插值
3、相加操作就是对应元素相加,这里要与yolov3的concatenate操作做区别,concatenate是拼接,会增加通道数的,而FPN里的融合不会改变特征图的尺寸

这篇关于FPN(Feature Pyramid Network)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892912

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.