YOLO11 改进 - 特征融合 | SMMM结构感知多尺度掩码模块,筛除冗余、强化边界与语义交互,助力图像分割高效涨点 | AAAI 2026 前言本文介绍了结构感知多尺度掩码模块——SMMM用于优化编码器与解码器之间的特征融合。该方法通过多尺度深度可分离卷积捕获不同感受野下的边缘、纹理与结构信息并利用结构显著性掩码对关键区域进行自适应筛选抑制背景噪声与冗余特征。我们将 SMMM 成功集成进 YOLO11 的特征融合路径中替代传统简单拼接Contact方式增强多尺度语义交互与边界细节表达从而提升目标检测中特征对齐、结构感知和复杂场景下的检测性能。文章目录 YOLO11改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLO11改进专栏介绍针对 Transformer 解码器在捕捉边缘细节、识别局部纹理以及建模空间连续性方面存在的不足本文提出一种专为医学图像分割设计的新型解码器框架该框架包含三大核心模块。第一自适应交叉融合注意力ACFA模块将通道特征增强与空间注意力机制相结合并引入平面、水平、垂直三个方向的可学习引导提升模型对关键区域与结构走向的响应能力。第二三重特征融合注意力TFFA模块融合空间域、傅里叶域与小波域特征构建频域 - 空间联合表征在保留边缘、纹理等局部信息的同时强化全局依赖关系与结构建模能力在复杂、模糊边界场景下效果尤为突出。最后结构感知多尺度掩码模块SMMM借助多尺度上下文信息与结构显著性滤波优化编码器与解码器之间的跳跃连接有效降低特征冗余提升语义交互质量。各模块协同工作不仅弥补了传统解码器的缺陷还显著提升肿瘤分割、器官边界提取等高精度任务的性能同时改善分割精度与模型泛化能力。实验结果表明该框架为医学图像分割提供了一种高效且具备实用性的解决方案。文章链接论文地址论文地址**代码地址**代码地址基本原理解决的关键问题SMMM即 Structural-aware Multi-scale Masking Module是文章提出的医学图像分割解码器中的核心模块之一。它主要针对传统编码器-解码器结构中跳跃连接的不足。常见 U-Net 类模型会把编码器的浅层空间细节直接传给解码器但这种连接通常只是简单相加或拼接缺少筛选机制容易把无关背景、噪声和冗余纹理一并引入解码阶段。对于医学图像而言病灶边界模糊、器官形态复杂、局部结构细小这种粗粒度融合会削弱边界定位和语义对齐能力。SMMM的目标就是在保留多尺度空间细节的同时过滤无效信息突出结构显著区域提升编码器特征与解码器特征的交互质量。整体架构在整篇模型中SMMM位于编码器与解码器之间的跳跃连接路径上承担多尺度跳连融合的角色。文章的整体解码器由 ACFA、TFFA 和 SMMM 三个模块组成ACFA增强方向与空间结构感知TFFA融合空间域、傅里叶域和小波域信息而SMMM负责对来自编码器和解码器的同尺度特征进行结构化筛选与融合。具体来说SMMM接收形状一致的编码器特征 X 和解码器特征 Y先通过逐点卷积进行通道对齐和空间线索激活然后进入多尺度感知模块再经过掩码模块完成显著区域建模。最终融合后的特征会经过空洞卷积、归一化和逐点卷积进一步稳定特征分布并输出给后续解码过程。技术原理SMMM的核心思想是“多尺度感知 结构显著性掩码”。首先它使用深度可分离卷积构建多尺度分支例如 3×3 和 5×5 卷积以扩大感受野使模型同时捕获细小边缘和较大范围的器官轮廓。文章还引入通道划分和 ReLU 激活使不同尺度的信息能够交互并增强非线性表达。随后SMMM将编码器和解码器特征送入掩码模块通过多个通道门控过滤器识别空间域中最具判别性的区域并用 Softmax 形成加权策略使高响应区域获得更大关注。这相当于让模型自动判断哪些结构信息值得保留哪些冗余背景应被削弱。之后经过筛选的特征被相加并使用膨胀率为2的空洞卷积继续扩大上下文范围在不降低分辨率的前提下增强对病灶形状、器官边界和结构连续性的捕获能力。实验消融结果也显示加入SMMM后模型在ISIC皮肤病灶和Synapse多器官分割任务上进一步提升说明它确实改善了边界细化、空间细节保持和特征对齐效果。核心代码无YOLO11引入代码在根目录下的ultralytics/nn/目录新建一个featureFusion目录然后新建一个以SMMM为文件名的py文件 把代码拷贝进去。importtorchimporttorch.nnasnndefmake_group_norm(channels,max_groups4):groupsmin(max_groups,channels)whilechannels%groups!0:groups-1returnnn.GroupNorm(groups,channels)classDepthwiseSeparableConv(nn.Module):Depthwise separable convolution used in the multi-scale perception module.def__init__(self,in_channels,out_channels,kernel_size):super().__init__()paddingkernel_size//2self.depthwisenn.Conv2d(in_channels,in_channels,kernel_sizekernel_size,paddingpadding,groupsin_channels,biasFalse,)self.pointwisenn.Conv2d(in_channels,out_channels,kernel_size1,biasFalse)self.bnnn.BatchNorm2d(out_channels)self.actnn.ReLU(inplaceTrue)defforward(self,x):returnself.act(self.bn(self.pointwise(self.depthwise(x))))classMultiScaleExtractor(nn.Module):SMMM multi-scale perception module with 3x3 and 5x5 branches.def__init__(self,channels):super().__init__()self.normnn.LayerNorm(channels)self.stage1_dwconv3DepthwiseSeparableConv(channels,channels,3)self.stage1_dwconv5DepthwiseSeparableConv(channels,channels,5)self.stage2_dwconv3DepthwiseSeparableConv(2*channels,channels,3)self.stage2_dwconv5DepthwiseSeparableConv(2*channels,channels,5)self.fusionnn.Conv2d(2*channels,channels,kernel_size1)defforward(self,x):xself.norm(x.permute(0,2,3,1)).permute(0,3,1,2).contiguous()x3self.stage1_dwconv3(x)x5self.stage1_dwconv5(x)xtorch.cat((x3,x5),dim1)y3self.stage2_dwconv3(x)y5self.stage2_dwconv5(x)returnself.fusion(torch.cat((y3,y5),dim1))classMaskLayer(nn.Module):Structural saliency mask with channel-wise 1x1, 3x3, and 5x5 filters.def__init__(self,channels):super().__init__()self.mask_conv1nn.Conv2d(channels,channels,kernel_size1,groupschannels)self.mask_conv3nn.Conv2d(channels,channels,kernel_size3,padding1,groupschannels)self.mask_conv5nn.Conv2d(channels,channels,kernel_size5,padding2,groupschannels)self.softmaxnn.Softmax(dim1)defforward(self,x):maskself.mask_conv1(x)self.mask_conv3(x)self.mask_conv5(x)returnx*self.softmax(mask)classSMMM(nn.Module): Structural-Aware Multi-scale Masking Module. This YOLO-friendly implementation keeps the papers two-input fusion idea and projects both feature maps to a shared output channel before structural masking. def__init__(self,channels):super().__init__()out_channelschannels self.encoder_projectionnn.LazyConv2d(out_channels,kernel_size1)self.decoder_projectionnn.LazyConv2d(out_channels,kernel_size1)self.encoder_multiscaleMultiScaleExtractor(out_channels)self.decoder_multiscaleMultiScaleExtractor(out_channels)self.encoder_maskMaskLayer(out_channels)self.decoder_maskMaskLayer(out_channels)self.dilated_fusionnn.Conv2d(out_channels,out_channels,kernel_size3,padding2,dilation2,biasFalse,)self.normmake_group_norm(out_channels)self.output_projectionnn.Conv2d(out_channels,out_channels,kernel_size1)defforward(self,x):encoder_feature,decoder_featurex encoder_featureself.encoder_projection(encoder_feature)decoder_featureself.decoder_projection(decoder_feature)encoder_featureself.encoder_multiscale(encoder_feature)decoder_featureself.decoder_multiscale(decoder_feature)fused_featureself.encoder_mask(encoder_feature)self.decoder_mask(decoder_feature)returnself.output_projection(self.norm(self.dilated_fusion(fused_feature)))注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.featureFusion.SMMMimportSMMM步骤2修改def parse_model(d, ch, verboseTrue):elifmisSMMM:c2ch[f[1]]args[c2,*args]配置yolo11-SMMM.yaml# Ultralytics YOLO , AGPL-3.0 license# YOLO11 object detection model with SMMM feature fusion.nc:8# number of classesscales:# [depth, width, max_channels]n:[0.50,0.25,1024]s:[0.50,0.50,1024]m:[0.50,1.00,512]l:[1.00,1.00,512]x:[1.00,1.50,512]backbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,2,C3k2,[256,False,0.25]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,2,C3k2,[512,False,0.25]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,2,C3k2,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,2,C3k2,[1024,True]]-[-1,1,SPPF,[1024,5]]# 9-[-1,2,C2PSA,[1024]]# 10head:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,SMMM,[]]# SMMM fuse backbone P4-[-1,2,C3k2,[512,False]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,SMMM,[]]# SMMM fuse backbone P3-[-1,2,C3k2,[256,False]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,SMMM,[]]# SMMM fuse head P4-[-1,2,C3k2,[512,False]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,SMMM,[]]# SMMM fuse head P5-[-1,2,C3k2,[1024,True]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importwarnings warnings.filterwarnings(ignore)fromultralyticsimportYOLOif__name____main__:# 修改为自己的配置文件地址modelYOLO(./ultralytics/cfg/models/11/yolo11-SMMM.yaml)# 修改为自己的数据集地址model.train(data./ultralytics/cfg/datasets/coco8.yaml,cacheFalse,imgsz640,epochs10,single_clsFalse,# 是否是单类别检测batch8,close_mosaic10,workers0,optimizerSGD,ampTrue,projectruns/train,nameSMMM,)结果