FPN解读

article/2025/9/22 8:57:06

前两篇博客中都说到了FPN这个神器,今天就花了点时间看了下这篇论文,喜欢这个很赞很干净的结构。

Motivation

凡是都要从motivation说起,哈哈哈。rcnn系列在单个scale的feature map做检测(b),尽管conv已经对scale有些鲁棒了,但是还是不够。物体各种各样的scale还是是个难题,尤其是小物体,所以有很多论文在这上面做工作,最简单的做法就是类似于数据增强了,train时把图片放缩成不同尺度送入网络进行训练,但是图片变大很吃内存,一般只在测试时放缩图片,这样一来测试时需要测试好几遍时间就慢了(a)。另一种就是SSD的做法©,在不同尺度的feature map上做检测,按理说它该在计算好的不同scale的feature map上做检测,但是它放弃了前面的low-level的feature map,而是从conv4_3开始用而且在后面加了一些conv,生成更多高层语义的feature map在上面检测(我猜想是因为这些low-leve的feature map一是太大了很大地拖慢SSD最追求的速度,二是这些low-level语义信息太差了,效果没太多提升)。

所以本文就想即利用conv net本身的这种已经计算过的不同scale的feature,又想让low-level的高分辩的feature具有很强的语义,所以自然的想法就是把high-level的低分辨的feature map融合过来。类似的工作还有RON: Reverse Connection with Objectness Prior Networks for Object Detection

这里写图片描述

Approach

做法很简单,down-top top-down lateral conn(侧路连接)如图所示。以Resnet101为例:

  1. down-top就是每个residual block(C1去掉了,太大太耗内存了),scale缩小2,C2,C3,C4,C5(1/4, 1/8, 1/16, 1/32)。
  2. top-down就是把高层的低分辨强语义的feature 最近邻上采样2x
  3. lateral conn 比如把C2通过1x1卷积调整channel和top-down过来的一样,然后两者直接相加
    通过上述操作一直迭代到生成最好分辨率的feature(此处指C2)
    这里写图片描述

具体迭代操作:

  1. 从C5(512)开始加个1*1到256个channel,生成分辨率最低但语义最强的feature P5,开始迭代
  2. 然后P5上采样放大2倍,C4经过一个1*1的卷积后和放大后P5尺寸什么都一样了,然后add
  3. 以此迭代下去到P2结束
  4. 每个Pk后加一个3*3的卷积(原文说reduce the aliasing effect of upsampling)
    详细可下面代码
# Build the shared convolutional layers.
# Bottom-up Layers
# Returns a list of the last layers of each stage, 5 in total.
# 扔掉了C1
_, C2, C3, C4, C5 = resnet_graph(input_image, "resnet101", stage5=True)
# Top-down Layers
# TODO: add assert to varify feature map sizes match what's in config
P5 = KL.Conv2D(256, (1, 1), name='fpn_c5p5')(C5)
P4 = KL.Add(name="fpn_p4add")([KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5),KL.Conv2D(256, (1, 1), name='fpn_c4p4')(C4)])
P3 = KL.Add(name="fpn_p3add")([KL.UpSampling2D(size=(2, 2), name="fpn_p4upsampled")(P4),KL.Conv2D(256, (1, 1), name='fpn_c3p3')(C3)])
P2 = KL.Add(name="fpn_p2add")([KL.UpSampling2D(size=(2, 2), name="fpn_p3upsampled")(P3),KL.Conv2D(256, (1, 1), name='fpn_c2p2')(C2)])
# Attach 3x3 conv to all P layers to get the final feature maps.
P2 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p2")(P2)
P3 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p3")(P3)
P4 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p4")(P4)
P5 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p5")(P5)
# P6 is used for the 5th anchor scale in RPN. Generated by
# subsampling from P5 with stride of 2.
P6 = KL.MaxPooling2D(pool_size=(1, 1), strides=2, name="fpn_p6")(P5)
# Note that P6 is used in RPN, but not in the classifier heads.
rpn_feature_maps = [P2, P3, P4, P5, P6]
mrcnn_feature_maps = [P2, P3, P4, P5]

Experiments

RPN

首先想证明这个FPN对RPN有效果。如图所示,每个level的feature P2,P3,P4,P5,P6只对应一种scale,比例还是3个比例。
这里写图片描述

还有一个问题,RPN生成roi后对应feature时在哪个level上取呢?
k0是faster rcnn时在哪取的feature map如resnet那篇文章是在C4取的,k0=4(C5相当于fc,也有在C5取的,在后面再多添加fc),比如roi是w/2,h/2,那么k=k0-1=4-1=3,就在P3取
这里写图片描述

还有个问题,从不同level取feature做roipooling后需要分类和回归,这些各个level需要共享吗?本文的做法是共享,还有一点不同的是resnet论文中是把C5作为fc来用的,本文由于C5已经用到前面feature了,所以采用在后面加fc6 fc7,注意这样是比把C5弄到后面快一点。
实验结果如下,RPN的召回率高出baseline10个点左右的
(d)是去掉top-down,即类似于SSD在各个不同scale的feature上做预测
(e)是没有lateral,那就是只把低分辨强语义的feature上采样放大做预测
(f)这个是只用迭代到最后分辨率最高的P2,所有scale和比例的anchor都在P2取,由于P2比较大所有scale都在它上面取,anchor数量提升了很多,速度会慢。它的精度好于baseline但是低于©,原文解释:RPN is a sliding window detector with a fixed window size, so scanning over pyramid levels can increase its robustness to scale variance. 就是解释而已,怎么说都是他对…
这里写图片描述

Fast/Faster RCNN

直接使用上一步生成的proposal(Fast RCNN)
这里写图片描述

和RPN共享feature(Faster RCNN),证明end2end还是有提升的
这里写图片描述

在COCO的test榜单上也是state-of-art,注意它是单模型,其他经过了各种融合等工程化手段
这里写图片描述

FPN也可以利用instance segmentation任务中,比如mask rcnn等


http://chatgpt.dhexx.cn/article/w5vhChC4.shtml

相关文章

目标检测之FPN网络详解

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达特征图金字塔网络FPN(Feature Pyramid Networks)是2017年提出的一种网络,FPN主要解决的是物体检测中的多尺度问题,通过简单…

FPN网络

论文是CVPR2017年的文章,采用特征金字塔做目标检测,有许多亮点,特来分享。 论文链接:https://arxiv.org/abs/1612.03144 译文:https://blog.csdn.net/quincuntial/article/details/80152314 FPN解决了什么问题&…

各种FPN:PANet、ASFF、NAS-FPN、BiFPN、Recursive-FPN...

早期的物体检测算法,无论是一步式的,还是两步式的,通常都是在Backbone的最后一个stage(特征图分辨率相同的所有卷积层归类为一个stage)最后一层的特征图,直接外接检测头做物体检测。此种物体检测算法&#…

FPN网络详解

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

FPN详解

论文题目:Feature Pyramid Networks for Object Detection 论文链接:论文链接 论文代码:Caffe版本代码链接 一、FPN初探 1. 图像金字塔 图1 图像金字塔 图2 高斯金字塔效果 如上图所示,这是一个图像金字塔,做CV的你…

卷积神经网络——FPN(Feature Pyramid Networks)介绍

FPN(Feature Pyramid Networks):特征金字塔网络,是用来提取不同尺度特征图的,提供给后面的网络执行预测任务。 为什么需要FPN呢?简要介绍一下,在目标检测的网络中,要识别不同大小的物体是该网络实现检测的基…

详解FPN网络

目录 导读 摘要 简介 相关工作 FPN算法 FPN应用于RPN FPN应用于Fast RCNN 对比实验 FPN对RPN网络的影响 FPN对Fast RCNN网络的影响 总结 参考文献 导读 《Feature Pyramid Networks for Object Detection》这篇文章主要是用来解决Faster RCNN物体检测算法在处理多尺…

深度学习中的FPN详解

深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 目录 一、FPN提出原因 二、FPN的参考思想 三、特征金字塔 四、FPN具体思路 一、FPN提出原因 卷积网络中,深层网…

CICD概念 k8s DevOps

概念 先看下docker官网给的相关文档 Continuous Integration (CI) and Continuous Delivery (CD) methodologies are key traits of a modern software development practice. Docker Enterprise Edition (Docker EE) can be a catalyst for this DevOps mindset, integrating …

Gitlab CICD配置runner

首先要安装gitlab-runner,安装过程略 1.进入Gitlab项目界面,点击侧边栏Settings->CD/CD→Runners Collapse→Specific runners,获得URL与token 2.登录装有gitlab-runner的电脑,命令行输入gitlab-runner register注册runner&am…

CICD与DevOps

CICD与DevOps 文章声明,本文选自网上关于CICD与DevOps的讲解综合,如有侵权,联系删除 什么是CI/CD 什么是持续集成(CI-Continuous integration) 持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一…

【云原生-DevOps】企业级DevOps平台搭建及技术选型-CICD篇

又是开篇 上一篇文章我们大概分享了DevOps项目管理中怎么企业级搭建本篇文章主要介绍两个子系统【CICD、效能看板】 CICD系统 CI(Continuous Integration):指持续集成,它属于开发人员的自动化流程。持续集成是一种软件开发实践&…

CICD和K8S实战

部署流程 拉取镜像,用docker 部署harbor镜像仓库 harbor是一个docker私有镜像仓库。 1、创建项目 2、创建成员 3、为项目添加成员。 后续是jenkins往harbor上传镜像,所以还需要一台jenkins服务器。 向harbor上传镜像 业务服务器 用来最终测试cd的结果。…

CICD构建实验

CICD CICD是一个可以集部署、拉取、上传等于一体的架构环境,它支持一线进行部署,免去了人工一条条的进行部署环境的工作流程,大大降低了人力手工运维成本和出错率。 CICD的搭建需要至少三台服务器,他们分别监管着Harbor&#xff…

请问什么是 CICD

CI,Continuous Integration,持续集成。CD,Continuous Deployment,持续部署。CICD 一般合称,无需特意区分二者区别。从开发、测试到上线的过程中,借助于 CICD 进行一些自动化处理,保障项目质量。 CICD 与 git 集成在一起,可理解为服务器端的 git hooks: 当代码 push 到…

企业级生产环境CICD入门

代码上线方案 部署代码,就是把程序包,传到linux服务器上,然后运行。 以前都是手动上传。 合理化上线方案 上线之前需要备份。 大型企业上线制度和流程 代码上线解决方案注意事项 持续集成,持续交付,持续部署&#…

前端搭建CICD流程

用Docker-compose 安装gitlab、gitlab-runner 源码地址 如果您觉得有用请STAR 安装docker 如果有已安装旧版docker需要先卸载 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docke…

搭建CICD平台

** 搭建CICD平台 ** 1、主机准备。 2、安装前预配置。准备相应的系统配置与软件依赖。 3、执行安装。 4、安装后配置。添加相应的组件以及修改配置。如导入模板等。 一、主机准备 Centos7.2 配置:内存大于4G。(其中Jenkins占1.5G、Gitlab占2G&#xf…

什么是CICD

什么是CICD 一、简介二、持续集成(CI)三、持续交付(CD)四、持续部署(CD)五、下一步是什么? 一、简介 CI / CD的采用改变了开发人员和测试人员如何发布软件。 最初是瀑布模型,后来是…