尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

多尺度特征融合13种方案:从FPN到Transformer与状态空间模型

发布时间:2026/9/29 1:46:13

资讯中心
01
ARTICLE

多尺度特征融合13种方案:从FPN到Transformer与状态空间模型

多尺度特征融合13种方案:从FPN到Transformer与状态空间模型
多尺度特征融合这个方向我在做检测和分割项目的这几年里反复踩坑又反复回头啃。最早的时候我以为把不同层的特征图直接拼在一起就完事了结果小目标掉点、大目标过平滑、显存还爆炸调了一周才发现问题根本不在数据增强上。后来一路从FPN啃到BiFPN、ASFF再到这两年Transformer和状态空间模型带起来的一批新玩法才算把这条链路理清楚。这篇文章我打算把多尺度特征融合里最有代表性的13种创新方案系统性地过一遍包含到2024年还在被大量引用的新思路。不管你是刚入门想搞懂为什么FPN能work还是已经做过几个项目想找融合模块的改进点我都尽量把原理、代码、参数和你真正会遇到的坑写明白让你看完就能往自己网络里塞。1. 先搞清楚多尺度融合到底在解决什么问题1.1 尺度变化的本质困难卷积网络有个天然的矛盾浅层特征图分辨率高、位置信息准但感受野小、语义弱深层特征图分辨率低、语义强但细节丢得厉害。你拿一个在ImageNet上训好的骨干去检测一张图可能一只猫占了几百个像素也可能占了几十个像素网络在固定层数下根本没办法同时把这两种尺度都表达好。这就是多尺度融合要解决的核心矛盾不是简单地信息越多越好而是让不同层级的语义和位置信息能够互补。我举个特别直观的例子。你在做交通标志检测大标志在深层特征图上语义清晰但一个远处的小标志在深层特征图上可能就剩几个像素甚至消失了。浅层有它但浅层分不清那是标志还是背景纹理。多尺度融合做的就是把深层的这是什么和浅层的在哪里结合起来。理解这一点非常关键因为它决定了你后面选方案时的判断标准你的任务到底是小目标吃亏还是大目标边界模糊还是两者都有。1.2 为什么直接concat往往效果一般很多新手第一反应是把不同层的特征图上采样到同一尺寸然后concat。我早期也这么干过。问题在于上采样用的是最近邻或双线性语义不对齐浅层特征里大量的背景噪声会被一起带进融合结果。更麻烦的是不同层特征的数值分布差异很大直接拼在一起后网络需要花额外容量去学习如何配平这些分布相当于浪费了表达能力。还有一个隐藏问题是通道数膨胀。你把四层特征拼起来通道变成原来的好几倍后面接的卷积计算量暴涨显存直接顶不住。所以真正好用的融合方案都会在如何对齐和如何加权这两个点上做文章。你判断一个融合模块好不好其实就看它有没有解决这两个问题。后面提到的所有方案本质上都是这两条主线上的不同取舍。1.3 选方案的三个判断维度在实际项目里我一般从三个维度来决策该用哪种融合方案。第一是任务类型检测更看重多尺度召回分割更看重边界和高分辨率细节分类对融合的依赖其实没那么强。第二是算力预算BiFPN这种带重复堆叠的结构效果好但吃显存ASFF相对轻量但需要额外对齐卷积。第三是骨干特征本身的特性如果骨干是HRNet这种一直保持高分辨率的融合逻辑和ResNet系列完全不一样。我的经验是先别急着上最复杂的方案。拿你现有基线先加一个最朴素的FPN看提升幅度如果提升明显说明你的任务确实吃多尺度再往复杂方案迭代。如果加了FPN几乎没变化那问题可能出在数据或标签上换更花哨的融合模块也救不回来。把这三个维度想清楚后面看具体方案时你就知道每个方案是为什么设计的、适合放在什么位置而不是无脑抄结构。2. 金字塔类融合方案从FPN到BiFPN的演进主线2.1 FPN自顶向下的经典范式FPN特征金字塔网络是绕不开的起点也是我建议每个做检测的人都亲手实现一遍的结构。它的核心思路特别干净从骨干网络的深层往浅层走把深层的语义通过上采样逐层传下来每一层再和对应尺度的浅层特征相加最后在每个融合后的层级上独立做预测。为什么是相加而不是拼接因为相加不增加通道数计算量可控而且深层和浅层经过1x1卷积统一到相同通道后逐元素相加等于让网络自己学习每个位置该信谁多一点。实测下来FPN在COCO这类数据集上对小目标召回提升非常明显这也是它当年能成为检测标配的原因。代码上最关键的几个点侧向连接用1x1卷积降通道上采样用最近邻融合后再过一个3x3卷积消除混叠效应。这个3x3千万别省省了之后特征图上会出现明显的棋盘格伪影影响后续检测头。import torch import torch.nn as nn import torch.nn.functional as F class FPN(nn.Module): def __init__(self, in_channels_list, out_channels256): super().__init__() self.lateral_convs nn.ModuleList([ nn.Conv2d(c, out_channels, 1) for c in in_channels_list ]) self.output_convs nn.ModuleList([ nn.Conv2d(out_channels, out_channels, 3, padding1) for _ in in_channels_list ]) def forward(self, features): laterals [conv(f) for conv, f in zip(self.lateral_convs, features)] for i in range(len(laterals) - 1, 0, -1): up F.interpolate(laterals[i], sizelaterals[i-1].shape[-2:], modenearest) laterals[i-1] laterals[i-1] up return [conv(l) for conv, l in zip(self.output_convs, laterals)]2.2 PANet补上自底向上的第二条路FPN只有自顶向下问题在于浅层的精确位置信息传到深层时会被稀释。PANet的做法是在FPN基础上再加一条自底向上的路径把浅层的高分辨率信息重新往深层聚合。你可以理解成FPN是把语义往下送PANet再把位置往上送两条路走完每个层级同时拿到了强语义和准位置。我实际用下来PANet在实例分割上的收益比检测更明显因为它对mask边界的帮助很大。代价是计算量几乎翻倍因为多了一整条路径。如果你的显存紧张或者做的是实时检测要慎重。实现上的细节是自底向上路径通常是先下采样再相加下采样用步长为2的3x3卷积比最大池化保留的信息更多一点这个在分割任务里能感觉到差异。2.3 BiFPN加权双向融合与重复堆叠BiFPN是EfficientDet里提出的我认为它是金字塔类方案里工程性价比最高的一个。它做了三件事删掉只有单输入的节点那些节点贡献很小对同一层级的原始输入和融合输入之间加跨层连接最重要的是把融合时的相加改成了带权重的加权融合而且权重是可学习的、经过归一化的。为什么要加权因为不同分辨率的特征对最终输出的贡献本来就不一样FPN里等权相加其实是一种妥协。BiFPN让网络自己学这个权重实测在EfficientDet上比等权融合有明显提升。权重用快速归一化而不是softmax是为了训练稳定和速度。BiFPN还有一个杀手锏是可重复堆叠你可以把整个block叠好几层像加深网络一样加深融合性能和算力能比较平滑地权衡。class BiFPNBlock(nn.Module): def __init__(self, channels, epsilon1e-4): super().__init__() self.epsilon epsilon # 每个融合节点的可学习权重 self.w nn.Parameter(torch.ones(2, 3, dtypetorch.float32)) self.conv nn.Conv2d(channels, channels, 3, padding1) def forward(self, p3, p4, p5): w F.relu(self.w) w w / (w.sum(dim0, keepdimTrue) self.epsilon) # 自顶向下 t4 self.conv(w[0,0]*p4 w[1,0]*F.interpolate(p5, sizep4.shape[-2:], modenearest)) t3 self.conv(w[0,1]*p3 w[1,1]*F.interpolate(t4, sizep3.shape[-2:], modenearest)) # 自底向上 o4 self.conv(w[0,0]*p4 w[1,0]*t4 w[0,2]*F.interpolate(t3, sizep4.shape[-2:], modenearest)) o5 self.conv(w[0,1]*p5 w[1,1]*F.interpolate(o4, sizep5.shape[-2:], modenearest)) return t3, o4, o52.4 NAS-FPN与EfficientDet的思路延伸NAS-FPN是用神经架构搜索自动找融合拓扑的它搜索出来的结构很复杂人眼看起来甚至有点乱但在特定数据集上确实能超过人工设计的FPN。我不建议直接复现它的搜索过程成本太高但可以借鉴它的结论融合不是越对称越好某些跨层连接比另一些更有价值。EfficientDet则是把BiFPN和复合缩放绑在一起同时缩放骨干、融合层和检测头。它给我的最大启发是多尺度融合不该孤立调参你放大骨干的同时如果不同步加深融合层收益会被吃掉。这个思路在做大模型的时候特别重要。要注意的是NAS类方法在数据集分布变化时泛化性会打折扣换到自己的数据上不一定还有优势这点我在跨域项目里吃过亏。3. 自适应与注意力驱动的融合方案3.1 ASFF自适应空间特征融合ASFF自适应空间特征融合解决的问题很具体不同层级的特征在空间上是冲突的某个位置可能浅层说是前景深层说是背景硬融合就会产生矛盾。ASFF的做法是给每个层级学一组空间权重图融合时按位置加权让网络自己决定每个空间位置该信哪层。我第一次看ASFF的时候觉得它和注意力很像其实它比标准注意力更空间局部化。它真的要输出和特征图同尺寸的权重所以计算量不小。实现上的关键细节是权重生成前要把各层特征都对齐到目标层尺寸然后拼起来过几层卷积再sigmoid最后归一化。实测ASFF在YOLO系检测器上对小目标和遮挡目标的效果比较稳因为它能抑制冲突位置的噪声。class ASFF(nn.Module): def __init__(self, level, channels, compress8): super().__init__() self.level level self.conv nn.Conv2d(channels * 3, channels, 1) self.weight nn.Sequential( nn.Conv2d(channels * 3, channels // compress, 1), nn.ReLU(), nn.Conv2d(channels // compress, 3, 1) ) def forward(self, feats): target_size feats[self.level].shape[-2:] aligned [F.interpolate(f, sizetarget_size, modenearest) for f in feats] concat torch.cat(aligned, dim1) w torch.sigmoid(self.weight(concat)) w w / (w.sum(dim1, keepdimTrue) 1e-6) fused sum(w[:, i:i1] * aligned[i] for i in range(3)) return self.conv(fused)3.2 注意力引导的上下文特征金字塔AC-FPNAC-FPN在FPN的基础上加了上下文提取模块和注意力引导模块。它的核心洞察是光靠局部卷积感受野不够大融合前应该先扩大每层的上下文。它用一个类似ASPP的多分支空洞卷积去提取上下文再用注意力去抑制不相关的上下文。为什么注意力在这里有用因为多尺度上下文提取会引入大量背景响应注意力相当于一个过滤器。我在做遥感图像分割时用AC-FPN的思路改过模块对大面积同类地物的连续性改善明显但对细碎目标的帮助有限。这里要提醒一句空洞卷积的膨胀率要和你输入分辨率匹配膨胀率太大在低分辨率特征图上会退化成1x1等于白加。3.3 通道注意与多尺度结合SE、CBAM类把SE或CBAM插到FPN的融合节点上是我试过最省算力的一种改进。做法很简单在每层融合输出后接一个通道注意力让网络自适应地重新标定通道重要性。SE只做通道CBAM加上了空间分支效果通常更好一点但更贵。要注意的坑是注意力模块插的位置很关键。我试过插在侧向卷积之后和插在融合相加之后效果差别很大。放在融合之后更好因为它能看到融合后的完整信息。另外在很深的网络里堆太多注意力反而会掉点因为注意力本身也有容量会和数据竞争。我的经验是每个融合节点最多插一个别贪多。4. 多分支并行与高分辨率保持类方案4.1 HRNet全程高分辨率的多尺度融合HRNet和前面所有方案的根本区别在于它不从低分辨率往高分辨率恢复而是全程都保持一条高分辨率分支让不同分辨率的子网络并行并且每一步都在做跨分辨率的信息交换。这个设计对关键点和分割这种极端依赖位置精度的任务特别友好。为什么它有效因为上采样恢复出来的高分辨率特征本质上是从低分辨率猜出来的位置精度有损。HRNet从头到尾都保留真实的高分辨率计算避免了这种有损恢复。代价是计算量很集中训练也比较慢。我做过对比在人体姿态估计上HRNet对关节点定位的稳定性确实比FPN系好。实现上的关键是跨分辨率交换用的是步长卷积和上采样交换频率要控制好太频繁显存扛不住。4.2 空洞卷积族ASPP、RFB与可变形卷积ASPP用不同膨胀率的空洞卷积并行提取多尺度上下文RFB借鉴了人类视觉的感受野结构用多分支不同核大小来模拟。它们严格说不是融合不同层级而是在同一层级造出多尺度。在很多场景下这比跨层融合更轻量。我的实际用法是把它们和FPN结合在深层特征上先过ASPP扩大上下文再参与FPN融合。可变形卷积则更进一步让卷积核的采样点可以偏移自适应地对齐不同尺度目标的形状。在目标形状变化剧烈的场景里可变形卷积的多尺度融合往往比固定核效果好但训练更不稳定学习率要调低一些。4.3 SFNet用语义流显式对齐SFNet提出了语义流的概念用一个可学习的流场把深层特征搬运到浅层对应的位置上而不是简单粗暴地上采样最近邻。为什么需要它因为深层和浅层特征在空间上本来就不对齐尤其在物体边界处简单上采样会把深层的语义错位地贴到浅层上。SFNet用一个轻量的流对齐模块预测偏移量再按偏移采样深层特征。这个思路和光流很像道理是让网络自己学该往哪搬。我在做边缘敏感的分割任务时用它的思路替换了普通上采样边界处的语义一致性有改善。要注意流场的预测分支不能太重否则训练时梯度容易乱。5. 2024年值得关注的新趋势5.1 跨尺度Transformer融合Transformer带来的自注意力天生适合做跨尺度融合因为它能在任意两个位置之间建模长程依赖。多尺度场景下你可以把不同层级的token拼在一起做全局注意力让深层的语义token直接去和浅层的细节token交互而不是靠逐层传递。我实践下来跨尺度注意力的融合质量确实高但计算复杂度是token数的平方特征图一大就顶不住。所以2024年的很多方案都在做降采样注意力或者局部窗口注意力把复杂度压下来。判断这类方案能不能用关键看你能不能接受在低分辨率上做全局注意力、在高分辨率上做局部注意力这种混合策略。5.2 状态空间模型与多尺度最近一年状态空间模型很火它的优势是线性复杂度却能建模长序列。用到多尺度融合上就是把不同层级的特征展平成序列用状态空间模型做跨层扫描让信息沿序列方向传播。相比注意力它在高分辨率特征上显存压力小很多这是它最大的吸引力。不过我要泼一点冷水状态空间模型在多尺度融合上的生态还不算成熟很多开箱即用的实现对特征图的扫描方向敏感换数据集后需要重新调。如果你的项目对稳定性要求高可以先在辅助分支上试别一上来就全换。5.3 大卷积核与动态融合权重2024年还有一个明显趋势是重新重视大卷积核。以前大家觉得大核太贵但配合深度可分离和重参数化技术大核变得可用了。大核天然能覆盖更大范围对多尺度上下文有帮助。另一条线是动态权重让融合权重不仅可学习还随输入内容变化本质上是把ASFF的思想推广到通道和层级两个维度。我的判断是这两个方向都是把融合做得更自适应的延续。真正落地时优先选那些有开源实现、能在你数据上快速验证的别被最新两个字带偏。新技术不一定适合你的算力预算和数据规模。6. 实操把多尺度融合落地到自己项目6.1 基线搭建与验证顺序我一般这样推进先用一个干净的骨干加简单检测头跑出基线记录每个尺度目标的AP然后加FPN看提升再加双向路径再考虑注意力或自适应权重。每一步都单独验证别一次性把一堆模块堆上去否则掉点了你都不知道是谁的锅。验证时重点关注小目标AP和大目标AP的变化这两个指标最能反映融合是否真的起作用。6.2 关键实现细节与参数融合层的通道数建议统一通常256或128太大会爆显存。上采样优先用最近邻而不是双线性双线性在训练早期梯度更平滑但会有模糊。融合后的3x3卷积别省。学习率方面加了融合模块后我一般把骨干学习率调低融合层用正常学习率因为融合层是随机初始化的需要更快学习。# 训练时分组设置学习率这招我在多个项目里都用 param_groups [ {params: backbone.parameters(), lr: base_lr * 0.1}, {params: fusion.parameters(), lr: base_lr}, {params: head.parameters(), lr: base_lr}, ]6.3 训练调参与收敛观察融合模块加进去后前几个epoch loss可能会比基线高这是正常的因为融合权重还在学。我一般会多观察两三个epoch如果一直不降再排查。另外要盯住梯度范数融合分支如果梯度爆炸多半是加权融合的归一化没做好检查epsilon和权重初始化。7. 常见问题与排查技巧实录7.1 显存爆炸怎么办这是最高频的问题。根因通常有三个融合层通道没控制、多路径特征同时驻留、注意力权重图太大。解决顺序是先降融合通道再考虑把低分辨率分支的全局注意力改成局部窗口最后才是减batch。我实测把融合通道从256降到128对小目标影响很小但显存能省将近一半性价比很高。7.2 加了融合反而掉点遇到这种情况先别怀疑方案按顺序查标注质量有没有问题小目标是不是本来就太少融合层的初始化和归一化对不对学习率是不是把骨干带崩了。我遇到过最坑的一次是数据里小目标标注框偏大加FPN后网络反而学到了错误的尺度先验。所以掉点第一步永远回去看数据。7.3 小目标迟迟不提升如果FPN都加了小目标还是不动检查两点一是输入分辨率是不是太低小目标在主干下采样后直接没了二是融合时低层特征是不是被过度平滑了。可以试试在浅层融合后少加卷积、保持高分辨率或者用空洞卷积替代部分下采样。7.4 常见问题速查表现象可能原因排查方向显存溢出融合通道过大、多分支驻留降通道、分阶段释放融合后掉点数据标注、学习率、归一化先查数据再查超参小目标无提升分辨率不足、浅层被平滑提高输入分辨率、保留浅层训练不稳定加权融合归一化、可变形卷积检查epsilon、调低学习率边界模糊上采样方式、未对齐换最近邻、加流对齐推理变慢注意力/大核过多精简高分辨率分支这套排查流程是我这几年反复用下来的基本能覆盖八成以上多尺度融合的落地问题。说实话融合模块本身没那么玄难的是把它和你的数据、算力、任务匹配起来。我个人的体会是与其追最新的结构不如先把基线和验证流程搭扎实这样每上一个新方案你都能清楚知道它到底带来了多少真实收益。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。