DSAM注意力机制:面向YOLO26目标检测的稀疏注意力优化实践 YOLO系列从第8个版本开始几乎成了工业界做检测的默认基线大家在这个框架上拼数据、拼增强、拼训练技巧但到了YOLO26这个阶段能挖的工程优化空间已经非常有限了。我一直在想既然结构上加宽加深的收益越来越小不如从注意力机制上找增量。折腾了一圈我最终在BiLevelRoutingAttention下称BRA的基础上做了三处自研改动凑出了一个完整的注意力模块命名为DSAM全称是Dual-branch Sparse Attention Mechanism。这个模块在模拟项目X的检测任务上把mAP50:95从34.2提到了35.7参数量只多了不到5%推理耗时增加了约8%我觉得这个性价比是可以接受的。这篇文章就把DSAM从设计动机、模块结构、插入位置、训练配置到踩坑记录完整拆一遍。如果你是做检测算法、模型结构优化或者注意力机制改进的应该能直接拿去参考。即便你只是想了解BRA和它的改进思路也能从中看到一份比较完整的从论文到落地的实战记录。1. 为什么拿BRA当底座先搞懂原始的BiLevelRoutingAttention在说DSAM之前必须先把BRA吃透。因为我的三个自研升级点全都是围绕BRA的短板展开的你要是不清楚它原本是怎么work的后面看我的改动会一头雾水。1.1 标准注意力的复杂度账本先算一笔账。普通的多头自注意力对输入张量 (X \in \mathbb{R}^{N \times C})其中N是token数量C是通道数它的复杂度是 (O(N^2 C))。放到检测任务里一张640x640的图经过backbone下采样到20x20的特征图N400N²16万看起来还能接受。但如果你想把注意力用在40x40甚至80x80的特征层上N6400N²就是4096万这个量级的计算哪怕是GPU也要心疼一下。有人会说那我可以只在通道上做注意力比如SE或者ECA复杂度只有 (O(C^2))这不就绕开空间维度的平方复杂度了吗确实SE和ECA在计算上非常廉价但它们的问题在于只建模了通道之间的依赖完全没有建模空间位置之间的关系。你拿它做分类可以做检测这种强依赖于空间定位的任务提升幅度往往有限。空间注意力和通道注意力之间的这个空档就是各种稀疏注意力要补的位置。1.2 BRA的两层路由是怎么省算力的BRA的核心思想非常直接不是所有token之间都有必要两两交互我可以先粗略找一下哪些区域之间可能有关系只在这些区域内部做精细的注意力计算。这就好比相亲你不可能跟场上所有人都聊一遍通常是先根据照片和简介粗略筛选出几个人再坐下来细聊。具体来说BRA把输入的二维特征图划分成 (S \times S) 个区域每个区域包含 (\frac{HW}{S^2}) 个token。第一步是区域级别的路由对每个区域计算一个区域级的query表示和key表示然后算区域与区域之间的相似度矩阵对每个区域取相似度最高的前k个区域包括自己。第二步是在这些被选中的区域内部做token级别的注意力。这样总的计算复杂度就变成了 (O(N \times k \times \frac{N}{S^2}))而不是 (O(N^2))在k远小于区域数量的情况下省算力是非常可观的。这个设计还有一个隐藏优势——它天然是动态的。不同query区域选的key区域集合是可以不同的不像是局部注意力那样固定在空间邻域里这让它既能控制计算量又能保持一定的全局视野。我当时看完BRA的机制之后的第一反应是这东西放在检测模型的深层特征上理论上应该非常适合因为深层特征图尺寸小、通道数大BRA能在不引入过多FLOPs的前提下给网络补充长距离依赖。1.3 BRA的短板路由质量与全局上下文的取舍但实际用了之后我发现了BRA在检测任务上的几个问题。第一个问题路由质量没有保障。区域级路由只用了query和key的相似度来做决策但相似度最高不等于对检测最有帮助。有些背景区域之间的相似度很高但它们对目标检测的贡献可能接近于零。换句话说BRA的路由只看相关性不看显著性和信息量。这会导致计算资源被浪费在无关的区域对之间。第二个问题稀疏注意力天然会丢掉一部分全局上下文。你只选了top-k个区域剩下那些区域的信息在这一次注意力计算里是彻底不参与的。如果目标处于一个复杂场景中需要借助周围环境来判断语义比如船在水上车在公路上那么单纯依赖稀疏选择就有漏掉关键上下文的风险。第三个问题更偏工程top-k这个k值是固定的。不管输入图是简单还是复杂每个区域都强制找k个关联区域。我后来统计过很多简单场景下大部分query区域真正有用的关联区域根本用不了k个那么多这部分的计算是被浪费的。反过来一些密集小目标场景下k又不够用。这三个短板正好对应了我在DSAM里做的三个升级点。说白了我的思路不是推翻BRA而是针对它最不舒服的三个地方做外科手术式的改进。2. DSAM模块的设计思路三个升级点从哪来DSAM这个模块的完整形态是显著性路由增强 通道补偿支路 自适应top-k筛选三位一体。下面把每个部分拆开讲包括设计动机和实现方式。2.1 升级点一显著性路由增强针对BRA只看相似度不看重要性的问题我给区域路由加了一个显著性分支。具体做法是对每个区域除了计算它与其他区域的query-key相似度之外还要计算它自身的区域显著性得分。这个显著性的计算方式是轻量级的我用了深度可分离卷积生成一个空间显著性图然后在每个区域内做全局平均池化得到一个区域级的显著性向量。最后这个向量会和区域相似度矩阵做加权融合。融合公式长这样[ R{ij} R{ij} \lambda \cdot (Sal_i Sal_j) ]其中 (R_{ij}) 是原始的区域相似度(Sal_i) 和 (Sal_j) 分别是来源区域和目标区域的显著性得分(\lambda) 是一个可学习的平衡系数初始值设为0.1。这样做的效果是一个区域即使与当前query区域的相似度不是最高但只要它本身包含明显的目标信息显著性高它就有机会被选进top-k集合。我做过一个直观的对比测试。在一张包含小目标和大量背景干扰的图上BRA选出的区域往往集中在纹理最复杂的背景区域而DSAM因为显著性支路的引入能把注意力分配到稀疏的小目标所在区域。这个改动对小目标检测的提升是非常明显的后面消融实验里有数据支撑。2.2 升级点二通道补偿支路稀疏空间注意力丢全局上下文的短板我用一条轻量的通道分支来补。通道补偿支路的设计思路很简单既然空间维度被打稀疏了那么我换一个维度和注意力机制——沿着通道维度建模全局依赖。但这里我没有直接用SE那种全局平均池化加两个全连接层的结构因为那种结构在检测任务中对空间细节不够敏感。我参考了ECAEfficient Channel Attention的思路用全局平均池化加一个一维卷积来做通道交互。一维卷积的kernel大小通过通道数自适应确定。补偿分支的输出会跟稀疏注意力分支的输出做加权融合[ Out AttnOut \odot Gate ChanOut \odot (1 - Gate) ]这里的Gate是一个可学习的门控标量初始值设在0.7意思是训练初期让稀疏注意力作为主干通道分支逐渐学习补充信息。你会发现这个门控在训练结束后会稳定在0.6-0.8之间说明通道分支确实能提供稀疏注意力给不了的那部分全局语义。可能有同学会质疑加一个通道分支计算量不是又多了一块吗确实会多一点但这一分支的实际计算量很小因为一维卷积只在池化后的向量上操作整个分支的FLOPs占比不到整个模块的3%可以忽略不计。2.3 升级点三自适应top-k筛选固定k值是BRA的一个结构限制要实现真正的自适应top-k我想过很多方案包括直接用可微的top-k采样、用Gumbel-Softmax近似但这些方案在训练中都有稳定性问题。最后我选了一个工程上更稳妥的思路k值由一个轻量预测网络动态输出但通过温度参数来控制它的变化速度。具体来说我计算每个query区域的信息复杂度 (C_i)定义为该区域内token特征的方差。信息方差越大说明这个区域内的内容越复杂需要关联更多区域来理解反之如果区域内的特征非常均匀比如大片天空背景那么它需要的关联区域就很少。基于这个复杂度指标我动态计算每个query区域的top-k值[ k_i \text{clip}\left(\text{round}\left(k_{base} \alpha \cdot \sigma(C_i)\right), k_{min}, k_{max}\right) ]其中 (k_{base}) 是基础值(\alpha) 是缩放系数。训练初期我会固定 (\alpha0)让网络先稳定学习训练到一半时再放开 (\alpha)。这样避免了一上来就引入动态形状带来的训练波动。动态top-k带来的计算收益不能小看。在模拟项目X的验证集上简单场景占多数平均实际使用的k值比固定k值小了近30%这意味着这部分理论上是白省的计算量。2.4 DSAM的完整结构与伪代码把三个升级点整合在一起DSAM的完整前向流程可以写成下面的伪代码。我贴在项目里的版本加了比较完整的注释方便后续维护import torch import torch.nn as nn import torch.nn.functional as F class DSAM(nn.Module): def __init__(self, dim, num_regions64, k_base8, k_min3, k_max16, k_scale0.1): super().__init__() self.num_regions num_regions # S*S self.k_base k_base self.k_min k_min self.k_max k_max self.k_scale k_scale self.qkv nn.Conv2d(dim, dim * 3, 1) # 区域显著性分支深度可分离卷积 池化 self.saliency_conv nn.Sequential( nn.Conv2d(dim, dim, 3, padding1, groupsdim, biasFalse), nn.BatchNorm2d(dim), nn.GELU() ) # 通道补偿分支池化 一维卷积 self.channel_branch nn.Conv1d(1, 1, kernel_size3, padding1, groups1) self.gate nn.Parameter(torch.tensor(0.7)) self.lambda_sal nn.Parameter(torch.tensor(0.1)) # 输出投影 self.proj nn.Conv2d(dim, dim, 1) self.norm nn.LayerNorm(dim) def forward(self, x): B, C, H, W x.shape S int(self.num_regions ** 0.5) assert H % S 0 and W % S 0 region_size_h, region_size_w H // S, W // S # 1. 生成QKV qkv self.qkv(x) # B,3C,H,W q, k, v torch.split(qkv, C, dim1) # 2. 区域级query-key相似度 q_regions q.reshape(B, C, S, region_size_h, S, region_size_w) q_regions q_regions.permute(0, 2, 4, 1, 3, 5).reshape(B, S*S, C, region_size_h*region_size_w) k_regions k.reshape(B, C, S, region_size_h, S, region_size_w) k_regions k_regions.permute(0, 2, 4, 1, 3, 5).reshape(B, S*S, C, region_size_h*region_size_w) q_region_rep q_regions.mean(dim-1) # B, S*S, C k_region_rep k_regions.mean(dim-1) sim torch.einsum(bic,bjc-bij, q_region_rep, k_region_rep) # 区域相似度矩阵 # 3. 显著性路由增强 sal_map self.saliency_conv(x) sal_regions sal_map.reshape(B, C, S, region_size_h, S, region_size_w) sal_regions sal_regions.permute(0, 2, 4, 1, 3, 5).reshape(B, S*S, C, -1) sal_region_score sal_regions.mean(dim(2, 3)) # B, S*S sim sim self.lambda_sal * (sal_region_score.unsqueeze(1) sal_region_score.unsqueeze(2)) # 4. 自适应topk region_var q_regions.var(dim-1).mean(dim2) # 区域内特征方差衡量复杂度 if self.training and self.k_scale 0: k_dynamic (self.k_base self.k_scale * region_var).round().clamp(self.k_min, self.k_max) # 训练中需要根据batch内复杂度动态确定k这里采用近似策略 else: k_dynamic torch.full_like(region_var, self.k_base, dtypetorch.long) top_k max(self.k_min, min(int(k_dynamic.float().mean().item()), self.k_max)) # 5. 选topk区域索引 topk_idx simp.topk(top_k, dim-1).indices # B, S*S, top_k # 6. token级注意力在选中的区域内计算示意 out self._routed_token_attention(q, k, v, topk_idx, S, region_size_h, region_size_w) # 7. 通道补偿分支 chan_attn self._channel_branch(x) # B, C, 1, 1 out out * self.gate chan_attn * x * (1 - self.gate) out self.proj(out) out self.norm(out.permute(0, 2, 3, 1)).permute(0, 3, 1, 2) return out x上面这个版本是模块结构示意实际在项目里我重写了token级注意力的实现用region gather的方式提高效率。这种事儿光看代码结构没用真正跑的版本里有大量index操作的细节后面讲踩坑的时候再说。3. 把DSAM塞进YOLO26结构改动与配置文件实操模块设计出来只是第一步把它塞进YOLO26并且能正常训练收敛才是真正的考验。这一部分我按照实际操作顺序来讲。3.1 YOLO26的骨架结构回顾YOLO26的骨架基本延续了CSPDarknet的结构但做了一些模块替换整体仍然由backbone、neck、head三部分构成。backbone包含多个stage每个stage由若干CSP风格的块组成stage之间通过卷积下采样降低分辨率。neck部分还是FPNPAN的结构负责把backbone不同层级的特征做融合。head部分沿用了解耦检测头的设计分类分支和回归分支分开。这个结构决定了DSAM可以插入的位置非常多backbone的每个stage输出之后、neck的上下采样路径上、甚至在head之前。但位置选得对不对效果差异非常大我后来是靠多组对比实验才确定了一套合理的插入方案。3.2 DSAM插入位置的选择逻辑我试过把DSAM放在backbone的所有stage输出后面理论上一共有4个位置可选但做了几组实验之后发现无脑全插反而会带来负面效果。这里面的关键规律是浅层特征图分辨率大比如第2个stage输出是160x160DSAM的区域划分和路由计算在这样的大分辨率上开销非常高而且浅层特征蕴含的主要是边缘、纹理等局部信息全局稀疏注意力的收益不明显。所以我最终把位置收敛到了两个第一个位置是backbone第4个stage输出之后也就是进入neck之前的最高层语义特征。这个特征图通常是20x20分辨率适中语义信息丰富DSAM在这里能有效建模跨区域的依赖。第二个位置是neck中PAN结构的上采样拼接之后也就是特征融合之后的一层。这里是多尺度信息交汇的地方加DSAM能帮助网络在融合后的特征中建立跨尺度的关系。我特意没在head前面插因为检测头希望保持位置敏感的特征分布注意力模块如果强行改变特征分布反而会导致边框回归的抖动。另外提醒一句如果你的检测任务是以小目标为主建议在浅层80x80或160x160至少保留一个通道补偿分支只做通道维度的交互不要做空间稀疏路由。我在项目中把这个配置称为轻量DSAM后面章节会提到。3.3 配置文件与超参详解YOLO26的结构定义通常用yaml文件描述DSAM添加之后的模块配置我放在了model配置里。核心配置项有这么几个配置项值说明region_regions64区域数即S8表示把特征图分成8x8个区域k_base8默认topk值每个query区域选择8个关联区域k_min3动态topk下限防止路由选择过少导致梯度稀疏k_max16动态topk上限防止复杂场景下关联区域不够用k_scale0.1动态k的缩放系数训练后半段放开chan_ratio0.5通道补偿分支的输出通道比例控制计算量place_at[backbone_stage4, neck_pan]插入位置列表我单独解释一下region_regions这个参数。它决定了稀疏路由的粒度。如果把特征图划分成4x416个区域每个区域内部有25个token以20x20为例那么路由粒度太粗token之间的细粒度交互不够。如果划分成16x16256个区域每个区域内部只有1到2个token区域路由退化成近似token级别的选择计算开销又上去了。试下来8x864这个折中值在20x20特征图上效果最好。k_base的选择也值得多花一句话。k_base太小模型无法建模足够的长距离关系k_base太大稀疏注意力的计算优势消失。我在8和12之间做了对比8的计算量要小约15%精度几乎没有下降。所以项目中默认用了8。3.4 训练配置与策略配置好模型结构之后训练策略的调整同样不能省。我基于自己的多次实验把关键的训练设置列在下面输入分辨率640x640多尺度训练范围是480到800优化器SGDmomentum0.937weight_decay0.0005初始学习率0.01使用cosine衰减warmup 3个epochBatch size16使用两块卡每块卡8张图训练轮数300个epochEMA指数移动平均0.9999数据增强Mosaic、MixUp、随机仿射变换、HSV扰动基本沿用YOLO系列增强管线针对DSAM还有两个专门的策略第一路由支路的初始化。由于显著性分支和通道补偿分支的加入DSAM在训练初期的行为比原始BRA更复杂我建议把所有分支层的权重都做小数值初始化保证初始输出近似恒等映射这样不会破坏backbone预训练权重已有的特征表达能力。我见过直接把DSAM接上去训练崩掉的情况大概率就是初始化没做好。第二动态top-k要晚点放开。前面提到了k_scale初始设为0前150个epoch都用固定k8来训练让路由矩阵先稳定下来。什么时候把k_scale改回0.1我的经验是总epoch的一半左右比较合适。放得太早动态k和路由之间的耦合会让训练loss出现明显震荡。4. 效果验证消融实验与对比数据结构改完了训练也跑通了接下来就是用数据说话。以下所有结果都是在模拟项目X上的参考数值任务包含了大中小三种尺度目标训练集约1.2万张图验证集3000张图。4.1 实验设置所有对比实验都使用同样的训练超参数和增强策略唯一的区别是注意力模块。基线是YOLO26原始结构对比模块包括SE、CBAM、EMA以及原始的BRA。所有模块都插在相同位置backbone第4个stage输出后和neck的PAN拼接后以保证对比公平。评估指标用mAP50和mAP50:95速度和参数量也一起统计。4.2 消融实验三个升级点各贡献多少消融实验的结果最能说明每个设计的必要性。我在DSAM基础上逐个去掉升级点得到下面这张表模型设置mAP50mAP50:95参数量FLOPsYOLO26基线52.434.29.2M18.7G基线BRA53.135.09.4M20.1GBRA显著性路由增强53.535.49.5M20.3GBRA显著性路由通道补偿54.035.79.6M20.6G完整DSAM含动态topk54.435.79.6M19.8G可以看到显著性路由增强单独贡献了0.4个点的mAP50:95提升通道补偿支路又贡献了0.3个点。动态topk虽然在mAP上没有带来额外提升但把FLOPs从20.6G拉低到了19.8G也就是说它以完全不影响精度的方式白赚了计算效率。这符合我设计它的初衷——精度是省出来的算力也不能浪费。4.3 与其他注意力模块的横向对比为了确认DSAM不只是随便加点注意力都有用我把几类主流注意力都测了一遍。这里的结果能看出来不同类型的注意力在检测任务上的差异模块mAP50mAP50:95相比基线推理耗时增加SE52.734.50.32%CBAM52.834.60.45%EMA53.034.90.710%BRA53.135.00.815%DSAM54.435.71.58%DSAM比原版BRA的mAP50:95高0.7推理耗时却少了不少主要就是动态topk省下来的。它在数据上取得了精度和推理成本的完美折中这也意味着如果只看mAPDSAM不是最激进的方案但综合性价比来看我目前没有找到比它更适合YOLO26的注意力改进。4.4 参数量与推理速度的账很多人关心加了DSAM之后模型会不会变大很多我实际测过。如上表所示参数量从9.2M增加到9.6M大概是4.3%的涨幅。FLOPs从18.7G增加到19.8G大约5.9%。推理耗时我在单张A100上用batch size1测过YOLO26基线约5.2ms加DSAM之后约5.6ms增加约8%。这个多出来的时间主要花在区域路由和gather操作上通道补偿分支的开销几乎可以忽略。如果是在移动端或者边缘设备上部署我建议直接用轻量DSAM版本——只保留通道补偿分支去掉空间路由参数量只增加不到2%mAP50:95大约提升0.5。这个版本我已经验证过可以用。5. 踩坑记录DSAM在落地过程中遇到的典型问题结构设计再好落地的时候该踩的坑一个都躲不掉。DSAM的实际实现、训练和部署过程中我遇到了不少问题挑几个最有代表性的记录在这里。5.1 路由分布坍塌问题第一次把DSAM完整跑起来之后我注意到一个奇怪的现象训练前150个epoch一切正常loss下降平稳但从某个epoch开始区域路由的topk选择结果几乎不发生变化所有query区域选中的都是同一批区域。这就是典型的路由分布坍塌。排查下来问题出在显著性路由增强上。当 (lambda) 这个可学习系数在训练中变得过大时显著性得分在路由权重中占比过高相似度矩阵的作用被压制路由选择退化成纯按显著性排序自然就没了多样性。解决办法有两个我自己都试过。一个是对 (\lambda) 加一个权重衰减让它在训练中不会增长过快另一个更狠的办法是把 (\lambda) 的初始化值从0.1改成0.01并且用sigmoid函数把它映射到0到1的范围再从0.01缓慢增长。实测之后我选的是第二种方案因为它解决了问题并且没有引入额外超参调整成本。5.2 显存与动态形状问题在训练阶段DSAM的主要显存压力来自token级注意力中的gather操作。当topk16且特征图是40x40时每个query需要和16个区域内的所有token计算注意力其中区域内的token数量是25个合计400个key和整图注意力1600个key相比已经省了很多但gather的过程会创建很多临时张量显存峰值反而比预期高。这个问题在推理阶段表现得更加突出。我的模型导出成ONNX之后动态topk产生的动态形状索引会让某些推理引擎无法静态化处理出现shape mismatch报错。当时这个报错让我排查了两个晚上最后确认问题根因是动态k值。我最终的落地策略是训练时保留动态topk来节省FLOPs导出部署模型时固定k为平均值8牺牲一点点的动态适应能力换来的是完美的静态图导出兼容性。这个取舍我觉得非常值。5.3 小目标漏检风险在一开始的实验中DSAM在标准COCO风格数据上mAP提升明显但我换到一张小目标占比很高的数据集上之后小目标的mAP反而掉了1个点左右。这个现象让我特别警觉因为小目标检测本来就是YOLO系列的强项不能被一个注意力模块拖后腿。分析原因小目标对应的特征在浅层大分辨率特征图上而我把DSAM只加在了深层。更麻烦的是深层特征被稀疏注意力强化之后网络可能逐渐偏向于使用深层特征来检测目标而浅层特征的反向传播梯度在某种程度上被稀释了。解决方法是前面提过的通道补偿思路用到浅层在backbone第2个stage输出后面加一个只有通道分支的轻量DSAM不做空间路由只做通道重标定。这个小改动小目标mAP就回到了基线以上同时增加的计算量几乎可以忽略。这个经验让我认识到注意力模块加在哪里不只是提升精度的问题还要考虑对梯度流的影响。5.4 训练震荡与收敛问题训练到第160个epoch左右也就是我准备放开动态topk的时候loss出现了一次明显的震荡。当时我先以为是学习率周期的问题查了日志发现不是后来定位到是动态k值导致的。原因不难理解我在batch size16的训练中每个batch内部图像的复杂度差异较大有些batch的平均k值是10有些是6这就导致每个step的计算图和梯度分布都不同优化过程当然会不稳定。我的解决办法是给动态topk加了一个batch内平均的平滑处理先把一个batch内所有query区域的信息方差做统计平均再用这个全局统计值来计算统一的topk。这样同一个batch内所有样本用的k值是一致的训练稳定性回来了而且动态性的损失非常小因为batch内平均的信息量仍然能反映当前阶段的数据复杂度。5.5 部署时的算子兼容问题最后说一个部署相关的坑这个坑主要出现在最终落地推理的时候。DSAM里的一些自定义操作比如torch.topk在导出时需要指定dim参数我最初用的写法在PyTorch 2.1导出到ONNX时是正常的但换到更新的推理引擎版本时却报了不支持topk动态索引的错误。排查下来发现这是不同推理框架对topk算子支持程度不同导致的。我最后的做法是对部署模型做了一个inplace重写把torch.topk替换成基于sort和gather的组合实现这样在多个推理引擎上都能通过兼容性测试。我说不上这个做法是标准的但在我的项目中实测可行如果你也遇到类似问题可以往这个方向排查。还有一个容易被忽略的细节DSAM中的LayerNorm在推理阶段需要静态指定normalized_shape如果插入位置导致特征通道数变化这个配置一定要同步更新。我当时就因为neck中融合后的通道数是256而在配置文件里沿用了backbone的512导致推理结果在几十个epoch后出现了诡异的长尾误差排查了很久才意识到是通道数不匹配。最后再说两句DSAM这个模块从最初的idea到最终在YOLO26上稳定落地前前后后花了大概三周时间。回头看最耗时间的不是模块设计本身而是那些稀奇古怪的工程问题——路由坍塌、动态形状、导出兼容性每一个单拎出来都足够让人头疼。但如果让我再来一次我还是会从BRA这个底座出发因为它确实提供了一个用可控算力换全局建模的正确框架剩下的事情都是在补齐它的边界。个人体会很朴素注意力模块的设计功夫不在结构图上而在你对数据、训练过程和部署环境的理解深度。DSAM的三个升级点每一个本质上都是在回答一个具体的不足——通道信息丢了就加通道分支路由不准确就加显著性算力浪费了就做动态k。这种从问题出发找方案的思路比照着榜单刷结构要有用得多也稳得多。如果后续有同学想在这个基础上继续扩展我觉得还有两个方向可以试一是把DSAM和检测任务的定位头结合直接在回归分支中引入区域路由让模块服务bbox的精细化回归二是给DSAM做一次结构重参数化把训练态的动态结构折叠成推理态的固定shape彻底解决部署兼容问题。这两件事我都在规划中等做出了效果再来分享。