介绍
摘要
作为事实上的解决方案,标准的视觉变换器(ViTs)被鼓励模拟任意图像块之间的长距离依赖性,而全局关注的接受域导致了二次计算成本。视觉变换器的另一个分支受到CNNs启发,利用局部注意力,只模拟小邻域内块之间的交互。尽管这样的解决方案降低了计算成本,但它自然会受到小的关注接受域的限制,这可能会限制性能。在这项工作中,我们探索有效的视觉变换器,以追求计算复杂性和关注接受域大小之间的理想折衷。通过分析ViTs中全局注意力的块交互,我们观察到浅层中的两个关键属性,即局部性和稀疏性,表明在ViTs的浅层中全局依赖性建模的冗余。因此,我们提出多尺度扩张注意力(MSDA),在滑动窗口内模拟局部和稀疏的块交互。通过金字塔架构,我们通过在低级阶段堆叠MSDA块和在高级阶段堆叠全局多头自注意力块,构建了多尺度扩张变换器(DilateFormer)。我们的实验结果表明,我们的DilateFormer在各种视觉任务上实现了最先进的性能。在ImageNet-1K分类任务上,与现有的最先进模型相比,DilateFormer实现了相当的性能,而计算成本减少了70%。我们的DilateFormer-Base在ImageNet-1K分类任务上实现了85.6%的顶级准确率,在COCO对象检测/实例分割任务上实现了53.5%的框mAP/46.1%的掩码mAP,在ADE20K语义分割任务上实现了51.1%的MS mIoU。
YOLOv11目标检测创新改进与实战案例专栏
点击查看文章目录: YOLOv11创新改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
点击查看专栏链接: YOLOv11目标检测创新改进与实战案例
文章链接
论文地址:论文地址
代码地址:代码地址
参考文章:文章地址
基本原理
MSDA模块的多头设计是指在MSDA中,不同的头部(heads)具有不同的扩张率 ,以实现多尺度的特征聚合和语义信息捕获。通过设置不同的扩张率,每个头部可以在不同的尺度上聚焦于输入特征图的不同区域,从而有效地捕获多尺度的语义信息。这种多头设计使得MSDA能够更全面地理解和利用输入数据的特征,提高了模型的性能和泛化能力。
MSDA(Multi-Scale Dilated Attention)的工作原理如下:
特征映射处理:给定一个特征映射X,通过线性投影得到相应的查询(Q)、键(K)和值(V)。
多头设计:将特征映射的通道分成n个不同的头部,每个头部使用不同的扩张率进行多尺度的Sliding Window Dilated Attention(SWDA)操作。
多尺度SWDA操作:每个头部的SWDA操作用于在不同尺度上捕获语义信息。具体地,对于第i个头部,其输出表示为hi = SWDA(Qi, Ki, Vi, ri),其中ri是第i个头部的扩张率。
特征聚合:将各个头部的输出进行拼接,然后通过线性层进行特征聚合,得到最终的输出特征表示X。
核心代码
class Globalstage(nn.Module):
""" A basic Transformer layer for one stage."""
def __init__(self, dim, depth, num_heads, mlp_ratio=4., qkv_bias=True, qk_scale=None,
drop=0., attn_drop=0., drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm,
cpe_per_satge=False, cpe_per_block=False,
downsample=True, merging_way=None):
super().__init__()
# build blocks
self.blocks = nn.ModuleList([
GlobalBlock(dim=dim, num_heads=num_heads,
mlp_ratio=mlp_ratio,qkv_bias=qkv_bias,
qk_scale=qk_scale, drop=drop, attn_drop=attn_drop,
drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path,
norm_layer=norm_layer, act_layer=act_layer, cpe_per_block=cpe_per_block)
for i in range(depth)])
# patch merging layer
self.downsample = PatchMerging(dim, int(dim*2), merging_way, cpe_per_satge) if downsample else nn.Identity()
task与yaml配置
详见:https://blog.csdn.net/shangyanaf/article/details/143052542