首页 > 其他分享 >[重读经典论文] FPN及PAN

[重读经典论文] FPN及PAN

时间:2023-06-02 20:56:13浏览次数:52  
标签:特征 FPN 融合 feature 卷积 PAN 浅层 重读

1. FPN

1.1. FPN简介

特征金字塔,全称Feature Pyramid Networks ,由Tsung-Yi Lin等2017年在论文《Feature Pyramid Networks for Object Detection》中提出,它的主要目标是解决在不同尺度上进行目标检测和分割时的信息丢失和分辨率不匹配的问题。FPN的框架可以总结为,为了在多尺度上建立高级语义特征映射(high-level semantic feature maps at all scales),一种带有横向连接(lateral connections)的自上而下的(topdown architecture)的框架。

1.2. 金字塔框架介绍

微信截图_20230602095852

如上图所示,识别不同尺度的物体是计算机视觉的一个基本挑战,论文列举了几种不同的实现方式。

(a)是图像金字塔,在传统图像处理算法中用得比较多,就是将图片resize到不同的大小,然后分别得到对应大小的特征,然后进行预测。这种方法虽然可以一定程度上解决多尺度的问题,但是很明显,带来的计算量也非常大。

(b) 使用单个feature map进行检测,这种结构在17年的时候是很多人在使用的结构,比如YOLOv1、YOLOv2、Faster R-CNN中使用的就是这种架构。直接使用这种架构导致预测层的特征尺度比较单一,对小目标检测效果比较差

(c) 像SSD(Single Shot Detector)采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量,但是不同的层次的特征图有巨大的语义差距,高分辨率的特征图只有低级特征,损害了表示能力,不利于目标识别。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。

(d) 经典FPN架构,通过自上而下和自下而上的路径来构建特征金字塔。自下而上的路径是指从底层特征图开始,通过下采样操作逐渐减小特征图的分辨率,同时增加其语义信息。自上而下的路径是指从顶层特征图开始,通过上采样操作逐渐增加特征图的分辨率,还引入了横向连接,用于在自上而下和自下而上的路径之间传递信息,高层特征图通过1x1卷积进行降维后与低层特征图进行融合,以产生具有更好分辨率和语义信息的金字塔特征。

1.3. 细节

 

微信截图_20230602110201

如上图所示,一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少feature map通道数和向下的路径匹配。

自底向上其实就是网络的前向过程。在前向过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。本论文用ResNet作为backbone,将每个stage的输出命名为Ci,i代表是bacbone中的哪个stage,如论文采用{C2,C3,C4,C5}对应的下采样的倍数为{4,8,16,32},因为考虑到内存占用,没用到C1。
自顶向下的过程采用上采样(upsampling)进行,而横向连接则是将上采样(一般用简单的最近邻插值)的结果和自底向上生成的相同大小的feature map进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。并假设生成的feature map结果是P2,P3,P4,P5,和原来自底向上的卷积结果C2,C3,C4,C5一一对应。

1.4. 基于FPN的Faster Rcnn

下载

如上图所示,Ci为上面提到的每个res stage的输出,在C2到C5之间做融合,产生P2到P5,然后P5再通过最大池化下采样为P6。

1.5. 总结

为什么FPN采用融合以后效果要比使用pyramidal feature hierarchy(ssd中采用的)这种方式要好呢,知乎上有个总结[1]:

  • 卷积虽然能够高效地向上提取语义,但是也存在像素错位问题,通过上采样还原特征图的方式很好地缓解了像素不准的问题。
  • backbone可以分为浅层网络和深层网络,浅层网络负责提取目标边缘等底层特征,而深层网络可以构建高级的语义信息,通过使用FPN这种方式,让深层网络更高级语义的部分的信息能够融合到稍浅层的网络,指导浅层网络进行识别
  • 从感受野的角度思考,浅层特征的感受野比较小,深层网络的感受野比较大,浅层网络主要负责小目标的检测,深层的网络负责大目标的检测,FPN中的top-down之路通过融合不同感受野,能够让高层加强低层所对应的感受野。

实际上FPN Pi层的融合这里采用了add,后面还有各种变种是采用按通道concat。在这之后,几乎所有的检测算法都会采用FPN架构。

2. PAN

2.1. PAN简介

PAN(Path Aggregation Network),Shu Liu等在2018年《Path Aggregation Network for Instance Segmentation》中提出,它扩展了FPN的思想并改进了特征融合的方法。

FPN使用横向连接将高层特征图与低层特征图进行融合,但这种简单的融合方法可能会导致信息的不完整性,尤其是对于小目标或细节部分。PAN的主要目标是解决FPN在特征融合过程中可能存在的信息丢失和不完整的问题,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果

2.2. PAN框架介绍

微信截图_20230602200728

如上图所示,为PAN的网络架构。包括以下部分:

  • FPN(这个已经有了,不算论文的贡献)。
  • Bottom-Up Path Augmentation。
  • Adaptive Feature Pooling。
  • Fully-Connected Fusion。

2.3. 细节

2.3.1. Bottom-up Path Augmentation

Bottom-up Path Augemtation的提出主要是考虑到网络的浅层特征对于实例分割非常重要,因此,为了保留更多的浅层特征,论文引入了Bottom-up Path Augemtation。

在框架图Figure1 中红色的箭头自底向上的过程,浅层的特征传递到顶层需要经过几十个甚至上百个网络层(如backbone采用ResNet50或者101),因此经过这么多层传递之后,浅层的特征信息丢失就会比较严重。

绿色的箭头表作者添加了一个Bottom-up Path Augemtation结构,这个结构本身不到10层,这样浅层特征经过原始FPN中的横向连接到P2然后再从P2沿着Bottom-up Path Augemtation传递到顶层,经过的层数不到10层,能较好的保存浅层特征信息。注意,这里的N2和P2表示同一个特征图。 但N3,N4,N5和P3,P4,P5不一样,实际上N3,N4,N5是P3,P4,P5融合后的结果。

如下图所示是Bottom-up Path Augemtation的基本结构,这个是个常规的特征融合操作,Ni经过一个卷积核尺寸为3*3,步长为2的卷积层,特征尺寸减半,然后与粗粒度特征Pi+1相加,得到的特征图再经过一个卷积核尺寸为3*3,步长为1的卷积层,得到Ni+1。

微信截图_20230602202133

2.3.2. Adaptive Feature Pooling

v2-59539d975565feab09ef51fc0ac7cd05_r

主要做的还是特征融合,我们知道在Faster RCNN系列的目标检测或分割算法中,RPN网络得到的ROI需要经过ROI Pooling或ROI Align提取ROI特征,这一步操作中每个ROI所基于的特征都是单层特征(FPN也是如此),比如ResNet网络中常用的res5的输出。而adaptive feature pooling则是将单层特征也换成多层特征,也就是说每个ROI需要和多层特征(文中是4层)做ROI Align的操作,然后将得到的不同层的ROI特征融合在一起,这样每个ROI特征就融合了多层特征。后续的分类和回归都是基于此最终的特征进行。

2.3.3. Fully-Connected Fusion

 

 

微信截图_20230602204145

如上图所示,这是对原有的分割支路(FCN)引入一个前景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。主要是在原始的Mask支路(即带deconv那条支路)的基础上增加了下面那个支路做融合。增加的这个支路包含2个3*3 的卷积层,然后接一个全连接层,再经过reshape操作得到维度和上面支路相同的前背景Mask,即是说下面这个支路做的就是前景和背景的二分类,输出维度类似于文中说的28*28*1 。而上面的支路输出维度类似28*28*K ,其中K 代表数据集目标类别数。最终,这两条支路的输出Mask做融合以获得更加精细的最终结果。

3. 参考

[1] Feature Pyramid Network解读和理解

[2] 1.1.2 FPN结构详解

[3] FPN(feature pyramid networks)算法讲解

[4] PANet算法笔记

[5] 【CV中的特征金字塔】四,CVPR 2018 PANet

(完)

标签:特征,FPN,融合,feature,卷积,PAN,浅层,重读
From: https://www.cnblogs.com/harrymore/p/17452884.html

相关文章

  • pandas 增加行 插入行
    pandas增加行方法locconcatpandas增加列方法[列名]#可结合np.where等判断函数concat(axis=1)merge#merge(how='left')+drop_duplicates(left_df.columns)==vlookupjoininsert......
  • 【pandas基础】--日期处理
    时间序列数据是数据分析中一类常见且重要的数据。它们按照时间顺序记录,通常是从某些现象的观察中收集的,比如经济指标、气象数据、股票价格、销售数据等等。时间序列数据的特点是有规律地随着时间变化而变化,它们的变化趋势可以被分析和预测。时间序列分析是一种用于预测未来值或......
  • pandas value_counts() 会忽略统计nan 但是不会忽略 true false
    pandasvalue_counts()会忽略统计nan 但是不会忽略truefalse'''每列包含多少项nan'''foriindf_2:print(df_2.loc[:,i].isna().value_counts())应用'''每列包含多少项nan'''dict_counts={}foriindf_2:......
  • span标签样式表
    title:SpanListcategories:-手册1《半小时漫画中国哲学史》2“既许一人以偏爱,愿尽余生之慷慨”3data.json文件链接4当使用重做日志文件来进行数据库恢复时,ORACLE将读取其中的重做记录(包括其中的修改向量),并且将这些修改用于相关的块中。5存储结构管理主要就......
  • Pandas_数据预处理_读写去重
    列编辑“Columnselectionmode”、“列块模式”、“列编辑”、“多光标功能notepad++列模式:alt+鼠标左键列模式选择vscode:Shift+Alt+鼠标左键列模式,多行同时操作的方法步骤快捷键Pandas数据预处理read_csv()sepheadernamesencodingdf['col']='str'......
  • 仙境传说RO:从零开始编译服务端开发环境搭建安装Pandas-rAthena
    仙境传说RO:从零开始编译服务端开发环境搭建安装Pandas-rAthena大家好,我是艾西今天跟大家分享下仙境传说RO开发脚本环境搭建。Pandas是RO的模拟器实际上是开源的一个叫做rAthenna的一个开源项目准备工具:Git2.25.0Setup建议放入D盘以免后期的麻烦(默认配置就好)TortoiseGit2.9.0.0......
  • Layout()方法用于布局管理器的更新,解决panel刷新后其中控件挤作一坨的问题
    在wxPython中,Layout()方法用于布局管理器的更新。它会告诉布局管理器重新计算和调整子控件的大小和位置。一般来说,当您:-添加或删除子控件-隐藏或显示子控件-改变子控件的大小-改变容器的大小这些情况下,您需要调用Layout()方法,告诉布局管理器进行重新布局。例如,在BoxSiz......
  • 【Python】pandas dataframe 插入一行数据
    pandas插入一行数据#需要借助numpy操作importnumpyasnpimportpandasaspdvalue={"a":[1,2,3],"b":[1,2,3],"c":[1,2,3]}df=pd.DataFrame(value)df1=pd.DataFrame(np.insert(df.values,0,values=[0,0,0],axis=0))df1.columns=df......
  • 渐变色Panel构造方法的重写
    #此类用于设置渐变色panelclassMyPanel(wx.Panel):def__init__(self,parent):wx.Panel.__init__(self,parent,wx.ID_ANY)self.SetBackgroundStyle(wx.BG_STYLE_PAINT)self.Bind(wx.EVT_PAINT,self.OnPaint)self.Bind(wx.EVT_SIZ......
  • Pandas中将字符串(object)格式的列,强制转换为浮点型的列
    importpandasaspddf=pd.DataFrame([['11.0',1,2,3],['22.0',4,5,6],['33.0',7,8,9]],columns=['a','b','c','d'])df['a']=pd.......