Feature Pyramid Grids 原理与代码解析

发布时间:2024年01月24日

paper:Feature Pyramid Grids

third-party implementation:https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/necks/fpg.py

存在的问题

基于NAS得到的特征金字塔结构如NAS-FPN展现了良好的性能表现,但用NAS寻找改进结构意味着:

  • 最终的模型结构比较复杂,难以理解,限制了模型的使用。
  • NAS的搜索成本很大
  • 最终
  • 的结构可能难以很好的推广到其它检测框架中。例如NAS-FPN是在RetinaNet上搜索到的,尚不清楚它是否能在其它检测模型中表现出相似的性能。

本文的创新点

本文提出了Feature Pyramid Grids(FPG),一种深度多路径特征金字塔网络,它将特征尺度空间表示为平行路径之间通过多向横向连接融合的规则网格,如图1所示。

FPG通过多个平行金字塔路径丰富了卷积网络的backbone中构建的层次特征表示。FPG是FPN在密集横向连接结构下从1到 \(p\) 条路径的深度推广。

和FPN不同的是,所有单独的路径都是以自下而上的方式构建。为了得到一个深度特征金字塔网络,路径通过各种跨尺度和同尺度的横向连接交织在一起,使得信息可以在各层级之间交换。如图1所示,这些横向连接可以分为四类:AcrossSame \(\longrightarrow \),AcrossUp \(\nearrow \),AcrossDown \(\searrow \),AcrossSkip \(\curvearrowright\)。

方法介绍

作者通过消融试验发现,图1所示的结构可以大大简化。首先bottom-up的方式有两种:SameUp和AcrossUp,去掉AcrossUp对结果没有显著影响,SameUp足够提供从低层到高层的信息流动,因为低层的语义信息不够丰富,因此较低的表示能力就足够了。其次,作者发现直接去除高分辨率特征的“下三角”连接不会降低性能,关于原因作者的猜想是低层的特征图首先需要通过自上而下的传播丰富语义信息,然后才能从深层路径结构中受益。简化后的结构如图2所示,这是最终的结构,接下来的实验也都是基于该结构。

代码解析

这篇文章没有官方的实现,只有mmdetection中第三方的实现,且实现和图2所示的结构有一定出入。由于图2的结构非常清晰,这里就不一步步降具体的实现,主要总结一下实现和图示不一样的地方。

1、以ResNet50为例,backbone的输出是 \(\{C_{2},C_{3},C_{4},C_{5}\}\) 对应步长分别为 \(\{4,8,16,32\}\)。对于Faster R-CNN和Mask R-CNN采用 \(P_{2}\sim P_{6} \),对于RetinaNet采用 \(P_{3}\sim P_{7} \)。图2中是 \(P_{2}\sim P_{6} \) 的结构,下面贴的代码是基于RetinaNet的因此是 \(P_{3}\sim P_{7} \)。具体来说就是 \(C_{3}\sim C_{5}\)?分别经过1x1的lateral conv后得到 \(P_{3}\sim P_{5}\),然后 \(P_{5}\) 经过两次stride=2的3x3 conv得到 \(P_{6},P_{7}\)。

2、在实现中,通过两层for循环实现,外层循环遍历stack_times,即文中的路径条数 \(p=9\)。内层循环自下而上遍历每个节点的输出。

3、第一点不同的是论文中提到grids的左下三角被删去了,但图2中没画全,\(p0\) 和 \(p1\) 左上角的连接应该只有一个,但图2画了两个。下面是 \(p1\) 路径自下而上的操作,可以看出下面4个节点没有连接,最上的节点的输入包括三个:same_up、across_lateral、across_skip。

4、第二点不同是图2中所有Identity连接对应的AcrossDown应该删去。只有Lateral连接时才有AcrossDown。

5、当路径 \(p\ge 5\) 时,右侧的路径就没有被删去的下三角连接了。下面是 \(p=9\) 时最下节点、中间节点、最上节点的操作。

可以看出最下节点没有same_up,有across_lateral、across_down、across_skip三个操作。

中间节点的输入是完整的4个:same_up、across_lateral、across_down、across_skip

最上节点没有across_down,有same_up、across_lateral、across_skip三个操作。

6、 因为所有路径都是自下而上的,所以所有的节点输入都不包括same_down。因为same_up就够用了,所以所有的across_up都删去了。

实验结果

在不同模型上与FPN和NAS-FPN的对比如表1所示,为了公平也对FPN和NAS-FPN进行了扩展,可以看到在相似的FLOPs和参数量下,在所有模型上FPG的效果都是最好的。

从表中还可以看出,相比与RetinaNet,在其它多阶段检测模型中,FPG相比NAS-FPN的提升更多,这也表明了基于RetinaNet搜索到的NAS-FPN结构不能很好的推广到多阶段检测模型中。

从图3可以看出,当路径数量增加超过3时FPN的表现出现了下降,这验证了将FPN简单扩展到多个自顶向下路径无法得到FPG实现的类似的性能。

文章来源:https://blog.csdn.net/ooooocj/article/details/135793839
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。