热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

特征金字塔技术初识

前言不同大小的目标都经过了相同的降采样比例后会出现较大的语义代沟,最常见的表现就是小目标检测精度比较低。特征金字塔具有在不同尺度下有不同分辨率的特点,不同大小的目标都可以在相应的尺


前言

不同大小的目标都经过了相同的降采样比例后会出现较大的语义代沟,最常见的表现就是小目标检测精度比较低。特征金字塔具有在不同尺度下有不同分辨率的特点,不同大小的目标都可以在相应的尺度下拥有合适的特征表示,通过融合多尺度信息,在不同尺度下对不同大小的目标进行预测,从而很好地提升了模型的性能。

本文将介绍特征金字塔的两种构建方式,介绍目前特征金字塔的主要改进思路和方案,主要有:ASPP, FPN, PANet, RFB, ASFF, FPT, YOLOF等。


两种构建方式
  1.  通过多次降采样生成不同分辨率的层构成,这种方式应用比较广,比较常见的应用有SSD, FPN, YOLO_v3, ...此外还有很多。
  2.  通过多条具有不同空洞率的空洞卷积的支路来构建。目前这方面的应用有ASPP, RFP等。

构建金字塔只是个基础操作,对于构建后的处理才是重点,目前有多种多样的方法去处理,这方面的改进主要有ASFF, PANet, FPT, YOLOF, BiFPN, STDN等。

 


ASPP(2017)

ASPP是基于第二种方式来构建的,具体如下图所示:

通过多支路后进行concate,再进行1x1卷积。这篇论文比较简单,主要贡献就是提出了这种构建方式。

 


FPN(2017)

对于一般的神经网络都是采用图b所示的方式来预测,通过对图像多次降采样,在最后一层进行预测,这种方式的缺点是对小目标的检测效果不好。

在SSD中采用了图c的方式,利用前几层的信息进行多尺度预测,这种方式的缺点是低层的语义信息不够,而且SSD为了避免重复使用前面已经卷积过的feature map,而从靠后的层(eg: conv4_3 of VGG nets )才开始构建金字塔,这样做的缺点就是金字塔的低层的分辨率也不够,丢失了前面层高分辨率的信息,而那些才是对识别小目标起重要作用的信息。

而FPN是目前应用比较广的一种方式,在图C的基础上增加了一条自上而下的路径,主要目的就是解决前面三种方式存在的问题。通过自上而下的路径,使得低层的feature map具有较好的语义信息。

 这条路径的实现方式如下图所示。

 注:FPN的效果非常好,但仍然存在不少改进的空间,后续会出现好几篇论文逐一改进这些问题。


PANet(2018)

缩短信息流动路径和增加不同分支来增加信息流动路径的思想会产生比较强的性能,总结起来就是“split-transform-merge”和“feature reuse”,这也是这几年神经网络的主要改进思想,几乎可以说所有的改进方案都是基于这两种思想。

在PANet同样基于这一点,提出了在FPN中自上而下的路径的基础上增加了一条自下而上的路径,具体如下图所示。

具体路径的实现方式如下图所示,对lower level先进行步长为2,大小为3x3的卷积进行降采样,再与邻侧同大小的level逐像素相加,再进行3x3卷积,形成Ni+1。 

 在FPN中采用了分而治之的思想,所谓分而治之,就是对于大的目标在金字塔高层检测,小的目标在金字塔低层检测。基于这种思想的论文还有很多,例如YOLO_V3,根据数据集上的先验提出了9个尺寸不同的候选框,根据这9个候选框的尺寸分别在不同的level上检测。

PANet论文提出当目标大小相差超过10个像素的时候,就有可能被分到不同的level上检测,而事实上这两个目标可能差不多,因此这种方式并不是最优方案。

PANet论文的第二点贡献是提出自适应特征池化( Adaptive Feature Pooling)

主要思想是将所有level中产生的候选框中的信息,都用来参与预测。而不是大的目标在higher level检测,小的目标在lower level检测。

具体做法如下图所示,使用ROIAlign将金字塔reshape到相同的大小,使用共享的一个全连接层对这四个level分别计算,再通过逐像素求和或取max的方式融合四个level到一个feature map。

 


RFB(2018)

RFB论文认为ASPP使用不同空洞率的空洞卷积所组成的多分支结构效果很好,但由于在使用之前,使用的是同尺寸的卷积核,导致每条分支产生的分辨率仍然是相同的,只是感受野不同而已。这样的方式与雏菊型卷积核相比,产生的特征并不是那么明显。

因此,RFB论文提出了Receptive Field Block,主要做法就是在进行空洞卷积前加一层不同大小的卷积层,分别是1x1, 3x3, 5x5这样每条支路产生的分辨率不同。

 这种方式的效果与其它方式的对比


ASFF(2019)

在FPN中这种分而治之除了在PANet中提到的一个问题是,当一个大的目标在higher level上检测时,小的目标在higher level是被当作了background。同理,大目标在lower level中被当成了background,实际上在这些地方是存在目标的,只是不在这一层检测而已,因此这样会存在较大的问题。

基于这个问题,ASFF提出了adaptively spatial feature fusion (ASFF)。主要思想是将每层的信息都相互融合起来。

具体操作是先对每一层进行1x1降维,对于第一和二,第二和第三层这种分辨率比为1:2的,通过3x3,步长为2的卷积降采样,对于第一和第三层这种分辨率比为1:4的,先对进行max-pooling,再通过3x3,步长为2的卷积降采样。然后通过系数加权融合。

 该方法用于YOLO_v3,提高了大概5-10的mAP。

 基于这种方式改进的还有Feature Pyramid Transformer。


FPT(2020)

这篇论文的主要观点是认为背景中其它物品的存在也会辅助识别某一个类别,例如电脑只会在电脑桌上,而不是大街上或水里,背景中的鼠标,键盘也会辅助区分电视机与电脑显示器。因此需要融合金字塔其它level的信息,这虽然出发点与ASFF不同,但实际改进的思路都是一样的,都是让每一层都融合其它层的语义信息。

 主要思想:利用Non Local Block的操作,以一层为query,其它每层为key,value,计算相似性,得出加权系数,对该层进行加权,每一层都进行这样的操作。

具体在实现细节上有所区别,要介绍清楚实现操作比较费时,对Non Local Block也得解释,因此这里只介绍个思路,关于这两篇论文在公众号《CV技术指南》中有详细解读,详情请点击下方链接。读者可根据这两篇论文了解transformer如何在CV中应用,建议看一看。

《NLN: Non-Local Neural Network》

《FPT: Feature Pyramid Transformer》


YOLOF(2021)

YOLOF通过实验得出结论在特征金字塔的C5层已经有足够的语义信息,融合其它层信息并不会带来很大的精度提升,也就1的mAp,而使用分而治之的思想极为有效,可以提升大概12的mAP。

因此YOLOF提出只需要使用C5层信息,并仍然基于分而治之的思想。但由于使用max-iou的匹配方式,只在C5层预测会出现对大小不同的目标生成的positive anchor数量不平衡的问题;分而治之存在计算量大,需要的内存大,推理速度慢的问题。

基于这两个问题,YOLOF提出Dialted encoder和Uniform Matching来实现在单层上进行预测,而这种预测可以做到仍然是基于分而治之的思想。

关于Dialted Encoder结构如下:

 主要操作是串联四个不同空洞率的3x3空洞卷积,注意与ASPP,RFB不同的是,这里是串联,ASPP和RFB是多支路并联。

Uniform Matching是使用最近邻方式来匹配,替代了Max-IOU。具体方式是选择GT boxes最近的K个boxes,这样的方式不管GT boxes大小可以匹配相同数量的Boxes。

 


其它改进的特征金字塔

除了以上这些改进方案外,还存在一些其它的结构或信息融合方式。这里只提个来源和结构图,感兴趣的读者请自行了解。


SFAM(2019)

来源于论文《M2Det: A Single-Shot Object Detector Based on Multi-Level Feature Pyramid Network》

 


STDN(2018)

来源于论文《Scale-Transferrable Object Detection》


BiFPN(2020)

来源于论文《EffificientDet: Scalable and Effificient Object Detection》

此外,还包括一些比较复杂的结构,如RFP,NAS-FPN。

总结:本文介绍了特征金字塔的两种构建方式,特征金字塔的一些现有方案,主要都是围绕金字塔如何更好地融合信息进行预测来改进。特征金字塔算是比较有用的一个结构,用在目标检测、语义分割等领域有较好的性能。


参考论文

1.DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs2.Feature Pyramid Networks for Object Detection3.Path Aggregation Network for Instance Segmentation4.Receptive Field Block Net for Accurate and Fast Object Detection5.Learning Spatial Fusion for Single-Shot Object Detection6.Feature Pyramid Transformer7.You Only Look One-level Feature8.M2Det: A Single-Shot Object Detector Based on Multi-Level Feature Pyramid Network9.Scale-Transferrable Object Detection10.EffificientDet: Scalable and Effificient Object Detection11.DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution12.NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection


转载

特征金字塔技术总结



推荐阅读
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • Webpack中实现环境与代码的有效分离
    本文探讨了如何在Webpack中有效地区分开发与生产环境,并实现代码的合理分离,以提高项目的可维护性和加载性能。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • 本文档介绍了在使用GitLab进行数据仓库项目开发时,如何管理和维护代码版本,包括非标准gitflow工作流下的分支结构及其权限设置,以及git commit message的规范。 ... [详细]
  • ML学习笔记20210824分类算法模型选择与调优
    3.模型选择和调优3.1交叉验证定义目的为了让模型得精度更加可信3.2超参数搜索GridSearch对K值进行选择。k[1,2,3,4,5,6]循环遍历搜索。API参数1& ... [详细]
  • Vue 3.0 翻牌数字组件使用指南
    本文详细介绍了如何在 Vue 3.0 中使用翻牌数字组件,包括其基本设置和高级配置,旨在帮助开发者快速掌握并应用这一动态视觉效果。 ... [详细]
  • js常用方法(1)startWithJava代码varstartsWithfunction(str,regex){if(regexundefined||strundefined|| ... [详细]
  • addcslashes—以C语言风格使用反斜线转义字符串中的字符addslashes—使用反斜线引用字符串bin2hex—函数把包含数据的二进制字符串转换为十六进制值chop—rt ... [详细]
  • 本文介绍了Kettle资源库的基本概念、类型及其管理方法,同时探讨了Kettle的不同运行方式,包括图形界面、命令行以及API调用,并详细说明了日志记录的相关配置。 ... [详细]
  • iOS绘制就是采集点,贝塞尔曲线得到形状,绘图上下文去渲染出来AsanaDrawsana图形库,设计的挺好他可以画多种图形, ... [详细]
  • SQL执行计划解析(2) 基本查询的图形执行计划
    SQL执行计划解析(2)-基本查询的图形执行计划(上)某种程度上,学习阅读图形执行计划和学习一门新语言很类似。 ... [详细]
  • 本文探讨了如何使用Go语言从传统的INI配置文件中提取所需的信息。INI文件因其简单易用而在多种环境中广泛采用,如操作系统设置、游戏引擎配置以及版本控制系统等。 ... [详细]
  • 编程实践:创建抽奖游戏
    本文详细介绍了如何通过HTML、CSS和JavaScript构建一个简单的在线抽奖游戏,包括布局设计、样式设置和交互逻辑实现。 ... [详细]
  • SVG画布HTML5提供两种强有力的“画布”:SVG和Canvas。SVG的特点:SVG绘制的是矢量图,因此对图像进行放大不会失真基于XM ... [详细]
  • 动画队列的设计目的是为了确保一系列任务能够按照预定顺序执行,每个任务只有在其前一个任务完成后才开始。这些任务既可以是同步的,也可以是异步的。本文将探讨jQuery动画系统中的队列机制,并介绍如何使用队列来优化动画效果。 ... [详细]
author-avatar
尛爱总_305
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有