论文阅读|FPN
概要
利用特征金字塔检测不同尺度的目标是一种基本的方法,但很多目标检测器都避免使用特征金字塔,因为特征金字塔这种表示方法计算速度代价比较大。作者提出了一种内在多尺度,金字塔层级的表示结构,能够构造高级语义特征的不同尺度表示,并且增加了较少的代价,称为FPN特征金字塔。所谓的内在多尺度是在不同的层级上去预测,而不是融合不同层级的feature map然后去预测;而高级语义特征的不同尺度表示,我认为是因为每一层都有上一层的特征的融合,所以每一层的feature map也有一定的高级语义的表达能力,同时还保留着低级别的特征。
对于多尺度目标的表示,有上述四种方法。
a是特征化的图像金字塔,这种方式比较慢。论文中 These pyramids are scale-invariant in the sense that an object's scale change is offset by shifting its level in the pyramid,我的理解是这里的object表示的是同类别的不同尺度的目标,这些目标有大有小,较大的目标在高层次的feature map中的表示应该和较小的目标在低层次的feature map中的表示是形同的,所以就可以说这个金字塔是尺度不变的。
b是常见的单一feature map的预测,能够表示高级的语义信息,而且具有一定的尺度不变性,而且比上一种更快,但不能具有更鲁棒的尺度不变性。
c作者称为金字塔化的特征层级表示,就是从不同层级的feature map中去直接预测,与作者提出的很相近
d是作者所提出的方案,比较快而且也比较准确。
结构框架
FPN是一种自顶向下的结构,它不只是将top层上采样然后横向融合对应自底向上的一层,而是在融合之前,将自底向上中的对应层经过了1个1x1conv减少通道数 ,然后再进行的融合,后面结果表明这个lateral层很有必要;自顶向下经过迭代之后还不是最终的feature map,将各层feature map再经过一个3x3conv(目的是减少上采样的混叠效应,不太理解?)得到最终图中蓝框的feature maps,图中越蓝的框表示那一层有较强的语义信息。
应用
作者将FPN分别应用于rpn以及fast rcnn。
rpn,对于FPN的每一level都经过1个3x3conv和两个1x1conv,在这里所有一个共享参数,就是在rpn head时,每一level的特征都经过相同的层,比非共享表现好一点,而且时间更少,这说明金字塔各层次的feature map有相似的语义级别。rpn实际上就是按照feature map的每一个点去滑动anchor生成多个anchor,只不过之前是在一个feature map上去滑动窗口,anchor有面积纵横比的区别,area(32,64,128,256,512)5种,根据纵横比(0.5,1,2)3种,在feature map的每个点上有15种不同的anchor。而运用了fpn之后,area分别对应于5个level的feature map,每一level又有上面3种纵横比,也就是在每一level的feature map上的每个点上变成只有3个anchor。没用fpn之前通过不同area的anchor来捕获不同尺度的目标,而fpn有不同尺度的feature map则可以再不同的level上捕获不同尺度的目标特征。
fast cnn, 主要的区别在于ROI pooling不在是在一个feature map上而是在多level的feature maps上。对于从rpn得到的Bbox它是怎么确定level的呢?根据下面公式确定
k0 = 4 表示如果wh = 224时,它应该map到level4
,这个224是ImageNet标准的预训练的图片大小,fasterCNN中采用C4作为单feature map输出,因此这里k0取为4。因为从rpn得到的Bbox有不同的area,所以就会被map到不同的level,进行roipooling,ROIpooling固定输出7x7,经过两个fc层,最后进行最终分类以及回归
实验
数据集:coco
RPN vs FPN
lateral是使用横向的层,top-down是自顶向下迭代融合生成各level。
Fast R-CNN vs FPN
Faster R-CNN vs FPN
总结
FPN主要是提供了一个多尺度特征表示的方法,称之为特征金字塔,主要就是将高层特征上采样加上经过lateral的下层特征得到具体的一层,然后自顶向下依次构造,各层经过分别处理后得到最终的多level feature maps。
深层的卷积神经网络虽然有着更丰富的语义表达,具有有限的尺度不变性,因此需要多尺度的特征表示来弥补,这对于目标检测以及分割等任务都是有益的。
参考
https://blog.csdn.net/voxel_grid/article/details/79275637
https://www.jianshu.com/p/973b243b75d8
原文地址:https://www.cnblogs.com/QuintinLiu/p/11705966.html
- WordPress中添加自定义评论表情包的方法(附三套表情包下载)
- 使用新类型Nullable处理数据库表中null字段
- QT Creator 快速入门教程 读书笔记(二)
- 设计模式学习笔记-命令模式
- .com域名和.cn域名的介绍
- Windows安装和使用zookeeper
- 使用MagicAjax 实现无刷新Webparts
- Python 项目实践一(外星人入侵小游戏)第五篇
- Python 项目实践一(外星人入侵小游戏)第三篇
- WordPress自定义栏目运用实例 VI:设置外链缩略图/特色图像
- Python 项目实践一(外星人入侵小游戏)第二篇
- IBatisNet配置
- WordPress设置评论到达一定数量后自动关闭评论功能
- Python 项目实践一(外星人入侵)第一篇
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- UCSC-browser学习:创建自己的track hubs
- 五分钟快速搭建Serverless免费邮件服务
- 基于qiankun落地部署微前端爬”坑“记
- Android推送的群魔乱舞
- 用百度接口实现图片文字识别,并打包成安装包软件
- 视野前端(二)V8引擎是如何工作的
- 【干货】Chrome插件(扩展)开发全攻略
- 超性感的React Hooks(一):为何她独具魅力
- 超性感的React Hooks(二)再谈闭包
- Python全栈(一)基础之11.函数(3)
- Python全栈(二)数据结构和算法之1.算法和数据结构引入
- Android开发(第一行代码 第二版) 常见异常和解决办法(基于Android Studio)(一)
- Python SQLite 基本操作和经验技巧(一)
- Python字典及基本操作(超级详细)
- Python matplotlab库使用方法及注意事项