常见特征金字塔网络FPN及变体
- 好久没有写文章了(对不起我在划水),最近在看北京的租房(真真贵呀)。
- 预告一下,最近无事,根据个人多年的证券操作策略和自己的浅显的AI时间序列的算法知识,还有自己Javascript的现学现卖,在微信小程序上弄了个简单的辅助系统。我先试试效果如何,不错的话将来弄个文章给大家介绍介绍。
感兴趣可以联系炼丹兄哦,WX:cyx645016617。
1 概述
FPN是Feature Parymid Network的缩写。
目标检测任务中,像是在YOLO1中那种,对一个图片使用卷积来提取特征,经过了多个池化层或者stride为2的卷积层之后,输出了一个小尺度的特征图。然后再这个特征图中来做目标检测。
换句话说,最后得到的目标检测的结果,完全是依赖于这一个特征图,这种方法叫做单stage物体检测算法。
可想而知,这种方法很难有效的识别出不同大小的目标,所以产生了多stage检测算法,其实就是要用到了特征金字塔FPN。
简单的说就是:一个图片同样是经过卷积网络来提取特征,本来是经过多个池化层输出一个特征图,现在是经过多个池化层,每经过一个池化层都会输出一个特征图,这样其实就提取出了多个尺度不同的特征图。
然后尺度不同的特征图,丢进特征金字塔网络FPN,做目标检测。
(如果还不明白,继续往下看就明白啦~)
2 FPN结构概述
从图中可以看到:
- 左边的c1啊,c2啊表示不同尺度的特征图。原始的图像input的尺寸经过一个池化层或者stride为2的卷积层之后,尺寸减少一半,这样就变成了C1特征图;如果又经过一个池化层,那么就变成C2特征图。
- C3,C4,C5,C6,C7这个四个尺度不同的特征图,进入FPN特征金字塔网络进行特征融合,然后再用检测头预测候选框。
- 这里说一些个人的理解(如果有错误,请指正呀): 这里刚好区分一下多stage检测算法和特征金字塔网络的区别。
- 多stage检测算法:从上图中我们可以看到P3,P4,P5,P6,P7这五个不同尺度的特征图进入一个检测头预测候选框,这个检测头其实就是一个人检测算法,不过这个神经网络的输入是多个不同尺度的特征图,输出则是候选框,所以这个多sgtage检测算法;
- 特征金字塔网络:这个其实是让不同尺度的特征图之间互相融合,来增强特征图表征能力的一种手段。这个过程不是预测候选框,应该算进特征提取的过程。FPN神经网络的输入也是多个不同尺度的特征图,输出也是多个不同尺度的特征图,和输入的特征图是相同的。
所以呢,一个多stage检测算法其实是可以没有FPN结构,直接用卷积网络输出的C3,C4,C5,C6,C7放进检测头输出候选框的。
3 最简单的FPN结构
自上而下单向融合的FPN,事实上仍然是当前物体检测模型的主流融合模式。如我们常见的Faster RCNN、Mask RCNN、Yolov3、RetinaNet、Cascade RCNN等,自上而下的单向的FPN结构如下图所示 :
这个结构的精髓就是:C5的特征图,经过上采样,然后和C4的特征图拼接,然后把拼接之后的特征图经过卷积层和BN层,输出得到P4特征图。其中P4和C4的特征图的shape相同。
经过这样的结构,所以P4可以学到来自C5更深层的语义,然后P3可以学到来自C4更深层的语义。个人对此结构有效的解释,因为对于预测精度来说,肯定是越深层的特征提取的越好,所以预测的越准确,但是深层的特征图尺度较小,通过上采样和浅层的特征图融合,可以强化浅层特征图的特征表述。
4 无FPN的多stage结构
这是一个没有用FPN结构的结构图。无融合,又利用多尺度特征的典型代表就是2016年日出的鼎鼎有名的SSD,它直接利用不同stage的特征图分别负责不同scale大小物体的检测。
可以看到,卷积网络输出的特征图直接就放进了特征头输出候选框。
5 简单双向融合
原来的FPN是自深到浅单向的融合,现在是先自深到浅、再从浅到深双向的的融合。PANet是第一个提出从下向上二次融合的模型:
- PAnet: Path Aggregation Network.2018年的CVPR的论文了。
- 论文地址:https://arxiv.org/abs/1803.01534
- 论文名称:Path Aggregation Network for Instance Segmentation
从图中可以看到,先有一个跟FPN相同的上采样过程,然后再从浅到深用stride为2的卷积完成下采样。用stride为2的卷积层把浅层的特征图P3下采样,然后尺寸和C4相同,两者拼接之后再用3x3的卷积层进行整理,生成P4特征图
此外还有很多复杂的双向融合的操作,这里不仔细介绍啦。
6 BiFPN
上面的PAnet是最简单的双向FPN,但是真正起名为BiFPN的是另外一个论文。
- BiFPN:2019年google团队提出的。
- 论文地址:https://arxiv.org/abs/1911.09070
- 论文名称:EfficientDet: Scalable and Efficient Object Detection
结构不难理解,其实就是在PAnet的结构上,做了一些小改进。但是这个论文的主要贡献还是EfficientDet的提出,所以BiFPN只是算是一个小贡献。
7 Recursive-FPN循环特征金字塔网络
- Recursive-FPN:效果之好令人惊讶,使用递归FPN的DetectoRS算是目标检测任务的SOTA了吧。(2020年的论文)
- 论文链接:https://arxiv.org/abs/2006.02334
- 论文名称:DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution
个人在自身的目标检测任务中,也使用了RFN结构,虽然要求的算力提升了一倍,但是效果确实提升的比较明显,大概有3到5个点的提升。 下面来看结构图:
可以看到,这个有一个虚线和实线构成了一个特征图和FPN网络之间的一个循环。下面展示一个2-step的RFP结构,也就是循环两次的FPN结构。(如果是1-step,那就是一般的FPN结构)
可以看到,就是把之前的FPN结构中的P3,P4,P5这些,再拼接到卷积网络的对应的特征提取过程。拼接之后使用一个3x3卷积层和BN层,把通道数恢复到要求的值就可以用了。
常见特征金字塔网络FPN及变体的更多相关文章
- 特征金字塔网络 FPN
一. 提出背景 论文:Feature Pyramid Networks for Object Detection [点击下载] 在传统的图像处理方法中,金字塔是比较常用的一种手段,像 SIFT 基于 ...
- 特征金字塔网络Feature Pyramid Networks
小目标检测很难,为什么难.想象一下,两幅图片,尺寸一样,都是拍的红绿灯,但是一副图是离得很近的拍的,一幅图是离得很远的拍的,红绿灯在图片里只占了很小的一个角落,即便是对人眼而言,后者图片中的红绿灯也更 ...
- (转) 干货 | 图解LSTM神经网络架构及其11种变体(附论文)
干货 | 图解LSTM神经网络架构及其11种变体(附论文) 2016-10-02 机器之心 选自FastML 作者:Zygmunt Z. 机器之心编译 参与:老红.李亚洲 就像雨季后非洲大草原许多野 ...
- 完全图解RNN、RNN变体、Seq2Seq、Attention机制
完全图解RNN.RNN变体.Seq2Seq.Attention机制 本文主要是利用图片的形式,详细地介绍了经典的RNN.RNN几个重要变体,以及Seq2Seq模型.Attention机制.希望这篇文章 ...
- SPPNet(特征金字塔池化)学习笔记
SPPNet paper:Spatial pyramid pooling in deep convolutional networks for visual recognition code 首先介绍 ...
- 二叉查找树及B-树、B+树、B*树变体
动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ), 都是典型的 ...
- [译] Z-variant (Z变体)
阅读目录 1. Z轴上的区别 2. 问题 Unihan 的 kZVariant 字段 译自: en.wikipedia.org/wiki/Z-variant | 已发布zh.wiki 在Unicode ...
- RNN-GRU-LSTM变体详解
首先介绍一下 encoder-decoder 框架 中文叫做编码-解码器,它一个最抽象的模式可以用下图来展现出来: 这个框架模式可以看做是RNN的一个变种:N vs M,叫做Encoder-Decod ...
- Gradle for Android ( 构建变体 )
链接: http://77blogs.com/?p=38 https://www.cnblogs.com/tangZH/p/10999060.html 有时候我们一个app需要有不同的版本,不同的版本 ...
随机推荐
- spring-boot-route(八)整合mybatis操作数据库
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- Python3基础——序列类型
开头写给自己,To Myself: 很久以来,都想要学习一门编程语言,从去年选择了python开始,反反复复重新开始了N多遍,每一次不会超过俩星期.昨天无意间翻开自己去年记的学习笔记,不禁感叹想当年我 ...
- Vue路由History模式分析
Vue路由History模式分析 Vue-router是Vue的核心组件,主要是作为Vue的路由管理器,Vue-router默认hash模式,通过引入Vue-router对象模块时配置mode属性可以 ...
- cobbler自动化安装centos
转载于:https://www.cnblogs.com/skymydaiji/p/10877533.html 一.cobbler介绍 1.前言 cobbler 是基于 python 语言开发的 pxe ...
- RHSA-2017:2907-重要: wpa_supplicant 安全更新
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- ORA-00018: maximum number of sessions exceeded 超出最大会话数
ORA-00018: maximum number of sessions exceededORA-00018: 超出最大会话数 Cause: All session state obje ...
- (OK) Android内核(4.9)集成最新版MPTCP---成功
Android内核(4.9)集成最新版MPTCP---成功
- Vue.js 学习笔记之五:编译 vue 组件
正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...
- Vagrant系列(一)----win10搭建Vagrant+VirtualBox环境_
一.Vagrant是什么? vagrant是一个操作虚拟机的工具.是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的 ...
- linux(centos8):禁用selinux(临时关闭/永久关闭)
一,selinux的用途 1,什么是selinux SELinux:即安全增强型 Linux(Security-Enhanced Linux) 它是一个 Linux 内核模块,也是 Linux 的一个 ...