全文包含可直接运行的代码建议点赞收藏 关注后续持续更新双模态检测改进创新系列内容。本文是双模态系列的第6篇收藏文集持续跟进顶刊创新思路。基于Selective Structured State Space for Multispectral-fused Small Target Detection的MEPF模块整体架构进行改进。https://blog.csdn.net/2201_75517551/article/details/159473872?spm1001.2014.3001.55021.跨模态掩码生成器(CrossModalityMaskGen)import torch import torch.nn as nn import torch.nn.functional as F # 1. 优化后的 CrossModalityMaskGen 模块 class CrossModalityMaskGen(nn.Module): 优化版的交叉模态交互让 RGB 和 IR 互相参考生成 Mask def __init__(self, rgb_ch3, ir_ch3): super().__init__() total_ch rgb_ch ir_ch # 适当扩大中间通道保证两种模态融合时的信息容量 inter_ch max(16, total_ch * 2) self.query_conv nn.Sequential( nn.Conv2d(total_ch, inter_ch, kernel_size3, padding1, biasFalse), nn.BatchNorm2d(inter_ch), nn.GELU() ) # 边缘提取器使用深度可分离卷积提取结构信息 self.edge_extractor nn.Sequential( nn.Conv2d(inter_ch, inter_ch, kernel_size3, padding1, groupsinter_ch, biasFalse), nn.Conv2d(inter_ch, inter_ch, kernel_size1, biasFalse), nn.Sigmoid() ) # 输出头不再自带 Sigmoid移至 forward 中防止多重抑制 self.rgb_mask_head nn.Conv2d(inter_ch, rgb_ch, kernel_size1, biasFalse) self.ir_mask_head nn.Conv2d(inter_ch, ir_ch, kernel_size1, biasFalse) def forward(self, x_rgb, x_ir): # 联合特征 combined torch.cat([x_rgb, x_ir], dim1) feat_inter self.query_conv(combined) # 【关键修复】引入残差连接feat_inter (feat_inter * mask) # 防止过强的 Sigmoid 直接抹除原始特征导致梯度断裂 feat_refined feat_inter feat_inter * self.edge_extractor(feat_inter) # 在最后一步生成范围 [0, 1] 的 Mask mask_rgb torch.sigmoid(self.rgb_mask_head(feat_refined)) mask_ir torch.sigmoid(self.ir_mask_head(feat_refined)) return mask_rgb, mask_ir # 2. 融入交叉掩码后的 MEPF class MEPF(nn.Module): 改进版 MEPF: Mask Enhanced Pixel-level Fusion (融合交叉模态注意力) 输入: 6通道 (RGB3 IR3) [B, 6, H, W] 输出: 6通道 融合特征 [B, 6, H, W] def __init__(self, in_channels6, rgb_channels3, ir_channels3, out_channels6): super(MEPF, self).__init__() # 修改点: 使用交叉模态 Mask 生成器 # 替代了原本独立的 mask_conv_rgb 和 mask_conv_ir self.cross_mask_gen CrossModalityMaskGen(rgb_chrgb_channels, ir_chir_channels) # 2. 特征融合模块 self.fusion_conv_rgb nn.Conv2d(3, 3, 3, 1, 1, biasTrue) self.fusion_conv_ir nn.Conv2d(3, 3, 3, 1, 1, biasTrue) # 3. 全局压缩模块 (SENet机制) self.global_avg_pool nn.AdaptiveAvgPool2d(1) self.fc1 nn.Linear(6, 1) # 6 → 1 self.fc2 nn.Linear(1, 6) # 1 → 6 self.sigmoid nn.Sigmoid() # 4. 输出整合 self.out_conv nn.Conv2d(6, out_channels, 1, 1, 0, biasTrue) self._init_weights() def _init_weights(self): for m in self.modules(): if isinstance(m, nn.Conv2d): nn.init.xavier_uniform_(m.weight) if m.bias is not None: nn.init.zeros_(m.bias) elif isinstance(m, nn.Linear): nn.init.normal_(m.weight, 0, 0.01) nn.init.zeros_(m.bias) def forward(self, x): B, C, H, W x.shape assert C 6, f输入必须是6通道当前为{C}通道 # 1. 拆分 RGB / IR x_rgb x[:, :3, :, :] x_ir x[:, 3:, :, :] # 2. 交叉生成掩码 (通过混合模态信息生成各自的 Mask) mask_rgb, mask_ir self.cross_mask_gen(x_rgb, x_ir) # 3. 加权 残差 卷积 rgb_fused self.fusion_conv_rgb(x_rgb x_rgb * mask_rgb) ir_fused self.fusion_conv_ir(x_ir x_ir * mask_ir) # 4. 拼接 cat_feat torch.cat([rgb_fused, ir_fused], dim1) # 5. 全局压缩生成 M (通道级注意力) gap self.global_avg_pool(cat_feat).view(B, 6) m_feat self.sigmoid(self.fc2(F.relu(self.fc1(gap)))) m_feat m_feat.view(B, 6, 1, 1) # 6. 最终融合 (公式7) fused cat_feat * m_feat # 7. 输出 out self.out_conv(fused) return out1. 打破模态隔离实现互相借鉴原版代码中RGB和IR的掩码是完全独立生成的相当于“盲人摸象”而改进后的模块首先将两种特征拼接在一起利用IR强烈的热辐射高频信号去指导RGB掩码的生成同时让RGB的纹理细节约束IR形成了一种早期级别的强交互。2. 显著增强感受野与边缘捕捉能力相较于原版仅仅依靠两个简单的串联卷积导致对空间边缘信息不够敏感新模块专门引入了基于深度可分离卷积架构的边缘提取器这种设计特别擅长提取目标的轮廓与独立结构从而能够生成质量更高且更贴合目标边界的掩码权重图避免产生模糊的斑块。3. 构建局部空间与全局通道的双重注意力协同原始模型过于依赖后半段的全局通道压缩前端的掩码过滤作用较弱而换上新模块后系统在前端先通过高精度的交叉空间注意力剔除冗余背景提取出干净的物体特征后再送入后端进行通道重标定这极大降低了伪影和噪声对最终融合结果的干扰。2.双向空间掩码生成器(BiDirectionalSpatialMaskGen)import torch import torch.nn as nn import torch.nn.functional as F # 1. 全新方案双向空间交叉掩码生成 class BiDirectionalSpatialMaskGen(nn.Module): 双向空间掩码生成器 核心思想用 IR 的空间特征指导 RGB 过滤背景用 RGB 的空间纹理指导 IR 补充细节。 def __init__(self, kernel_size3): super().__init__() padding kernel_size // 2 # 仅处理空间维度的拼接特征 (MaxPool AvgPool 2通道) - 输出单通道空间掩码 self.rgb_spatial_conv nn.Conv2d(2, 1, kernel_size, paddingpadding, biasFalse) self.ir_spatial_conv nn.Conv2d(2, 1, kernel_size, paddingpadding, biasFalse) # 初始化权重使初始阶段的 Mask 趋近于 0.5避免早期梯度消失 nn.init.normal_(self.rgb_spatial_conv.weight, std0.01) nn.init.normal_(self.ir_spatial_conv.weight, std0.01) def forward(self, x_rgb, x_ir): # 1. 提取 IR 的空间特征 (Avg Max) 来生成 RGB 的掩码 ir_avg torch.mean(x_ir, dim1, keepdimTrue) ir_max, _ torch.max(x_ir, dim1, keepdimTrue) ir_spatial torch.cat([ir_avg, ir_max], dim1) mask_rgb torch.sigmoid(self.rgb_spatial_conv(ir_spatial)) # 2. 提取 RGB 的空间特征 (Avg Max) 来生成 IR 的掩码 rgb_avg torch.mean(x_rgb, dim1, keepdimTrue) rgb_max, _ torch.max(x_rgb, dim1, keepdimTrue) rgb_spatial torch.cat([rgb_avg, rgb_max], dim1) mask_ir torch.sigmoid(self.ir_spatial_conv(rgb_spatial)) # 输出的 mask 形状为 [B, 1, H, W]后续会自动广播到 [B, 3, H, W] return mask_rgb, mask_ir # 2. 融入空间交叉掩码的 MEPF class MEPF_V2(nn.Module): 极致轻量版 MEPF: 采用空间交叉掩码增强 输入: 6通道 (RGB3 IR3) [B, 6, H, W] 输出: 6通道 融合特征 [B, 6, H, W] def __init__(self, in_channels6, rgb_channels3, ir_channels3, out_channels6): super(MEPF_V2, self).__init__() # 引入全新的空间掩码生成器 self.cross_spatial_mask BiDirectionalSpatialMaskGen() # 特征融合模块 self.fusion_conv_rgb nn.Conv2d(3, 3, 3, 1, 1, biasTrue) self.fusion_conv_ir nn.Conv2d(3, 3, 3, 1, 1, biasTrue) # 全局压缩模块 (SENet机制) self.global_avg_pool nn.AdaptiveAvgPool2d(1) self.fc1 nn.Linear(6, 1) self.fc2 nn.Linear(1, 6) self.sigmoid nn.Sigmoid() # 输出整合 self.out_conv nn.Conv2d(6, out_channels, 1, 1, 0, biasTrue) self._init_weights() def _init_weights(self): for m in self.modules(): if isinstance(m, nn.Conv2d) and m.bias is not None: nn.init.xavier_uniform_(m.weight) nn.init.zeros_(m.bias) elif isinstance(m, nn.Linear): nn.init.normal_(m.weight, 0, 0.01) nn.init.zeros_(m.bias) def forward(self, x): B, C, H, W x.shape x_rgb x[:, :3, :, :] x_ir x[:, 3:, :, :] # 1. 空间交叉注意力掩码生成 (mask 形状 [B, 1, H, W]) mask_rgb, mask_ir self.cross_spatial_mask(x_rgb, x_ir) # 2. 掩码广播相乘与残差连接 # mask_[B, 1, H, W] 会自动广播机制匹配 x_[B, 3, H, W] rgb_fused self.fusion_conv_rgb(x_rgb x_rgb * mask_rgb) ir_fused self.fusion_conv_ir(x_ir x_ir * mask_ir) # 3. 拼接与全局通道重标定 cat_feat torch.cat([rgb_fused, ir_fused], dim1) gap self.global_avg_pool(cat_feat).view(B, 6) m_feat self.sigmoid(self.fc2(F.relu(self.fc1(gap)))).view(B, 6, 1, 1) fused cat_feat * m_feat # 4. 输出 out self.out_conv(fused) return out1. 利用空间池化实现纯粹的跨模态空间引导新方案彻底放弃了将两个模态在通道维度硬性拼接的做法而是通过计算对方模态在通道维度的平均值和最大值AvgPool与MaxPool来提取纯粹的空间分布响应。这意味着IR模态的高亮发热区域可以直接转化为RGB的显著性空间权重图而RGB的丰富轮廓边缘也能直接用来精细化IR的掩码实现了更加自然且符合物理直觉的交叉引导。2. 极致的参数压缩与计算效率提升之前的模块由于需要处理拼接后的多通道特征必须引入较大的中间通道数并使用分组卷积不仅参数量增加还容易导致训练难以收敛。而这个新设计的掩码生成器内部仅仅包含两个输入为2通道、输出为1通道的普通卷积层其新增参数量几乎可以忽略不计。3.交叉先验引导掩码生成器(CrossGuidedMaskGen)import torch import torch.nn as nn import torch.nn.functional as F class CrossGuidedMaskGen(nn.Module): 交叉先验引导的掩码生成器 核心思想用 1x1 卷积提取对方模态的先验提示通过残差相加注入自身再生成掩码。 def __init__(self, channels3): super().__init__() # 1. 跨模态先验投影层 (提取对方的特征作为自身的提示) self.ir_to_rgb_prior nn.Conv2d(channels, channels, kernel_size1, biasFalse) self.rgb_to_ir_prior nn.Conv2d(channels, channels, kernel_size1, biasFalse) # 2. 独立且轻量的掩码生成头 (使用深度卷积关注空间分布) self.rgb_mask_head nn.Sequential( nn.Conv2d(channels, channels, kernel_size3, padding1, groupschannels, biasFalse), nn.BatchNorm2d(channels), nn.Sigmoid() ) self.ir_mask_head nn.Sequential( nn.Conv2d(channels, channels, kernel_size3, padding1, groupschannels, biasFalse), nn.BatchNorm2d(channels), nn.Sigmoid() ) def forward(self, x_rgb, x_ir): # 提取跨模态提示信息 ir_prior self.ir_to_rgb_prior(x_ir) rgb_prior self.rgb_to_ir_prior(x_rgb) # 提示信息与本征特征相加后送入深度卷积生成掩码 mask_rgb self.rgb_mask_head(x_rgb ir_prior) mask_ir self.ir_mask_head(x_ir rgb_prior) return mask_rgb, mask_ir class MEPF(nn.Module): MEPF V3: 基于交叉先验引导的掩码增强特征融合 输入: 6通道 (RGB3 IR3) [B, 6, H, W] 输出: 6通道 融合特征 [B, 6, H, W] def __init__(self, in_channels6, rgb_channels3, ir_channels3, out_channels6): super(MEPF, self).__init__() # 引入全新设计的交叉先验掩码生成器 self.cross_guided_mask CrossGuidedMaskGen(channels3) self.fusion_conv_rgb nn.Conv2d(3, 3, 3, 1, 1, biasTrue) self.fusion_conv_ir nn.Conv2d(3, 3, 3, 1, 1, biasTrue) self.global_avg_pool nn.AdaptiveAvgPool2d(1) self.fc1 nn.Linear(6, 1) self.fc2 nn.Linear(1, 6) self.sigmoid nn.Sigmoid() self.out_conv nn.Conv2d(6, out_channels, 1, 1, 0, biasTrue) self._init_weights() def _init_weights(self): for m in self.modules(): if isinstance(m, nn.Conv2d): nn.init.xavier_uniform_(m.weight) if m.bias is not None: nn.init.zeros_(m.bias) elif isinstance(m, nn.Linear): nn.init.normal_(m.weight, 0, 0.01) nn.init.zeros_(m.bias) def forward(self, x): B, C, H, W x.shape assert C 6, f输入必须是6通道当前为{C}通道 x_rgb x[:, :3, :, :] x_ir x[:, 3:, :, :] # 1. 获取交叉引导后的掩码 mask_rgb, mask_ir self.cross_guided_mask(x_rgb, x_ir) # 2. 掩码增强与残差特征提取 rgb_fused self.fusion_conv_rgb(x_rgb x_rgb * mask_rgb) ir_fused self.fusion_conv_ir(x_ir x_ir * mask_ir) # 3. 拼接与全局通道重标定 cat_feat torch.cat([rgb_fused, ir_fused], dim1) gap self.global_avg_pool(cat_feat).view(B, 6) m_feat self.sigmoid(self.fc2(F.relu(self.fc1(gap)))) m_feat m_feat.view(B, 6, 1, 1) fused cat_feat * m_feat # 4. 输出 out self.out_conv(fused) return out1. 优势在于采用了极其温和且高效的“先验注入”机制彻底避免了特征拼接带来的分布破坏。在之前的方案中无论是通道拼接还是空间池化都容易导致原始特征的高维语义在降维或融合过程中发生丢失。而这个全新方案通过一个轻量级的逐点卷积将红外模态的特征映射为一种软性的先验提示并直接以残差相加的形式注入到RGB模态中反之亦然。2. 优势体现在完美契合了可见光与红外模态的物理互补特性实现了双向的“取长补短”。红外图像通常能提供极其精准的热源定位但往往缺乏纹理且容易产生热晕而RGB图像拥有清晰的边界细节但在暗光或复杂背景下容易迷失。通过这种交叉引导架构红外的热力分布直接作为提示信息指导RGB掩码过滤掉无效的杂乱背景同时RGB的高频边界信息也作为提示注入到红外掩码中强行收束了红外特征边缘的扩散现象最终促使双方生成出边界锐利且目标突出的高质量特征掩码。总结与反思方案一通道拼接与边缘提取早期拼接红外与RGB通道利用深度可分离卷积精准捕捉边缘。该方案打破了模态隔离构建出空间与通道的双重协同注意力机制有效滤除冗余背景噪声。方案二纯空间池化交叉引导摒弃通道拼接利用空间池化提取对方模态的分布特征生成掩码。此方案新增参数几乎为零依靠广播机制实现极轻量引导完美保留了原始特征的通道语义。方案三交叉先验与残差注入提取对方模态特征作为“软提示”以残差形式温和注入自身网络。该设计不改变原生特征维度在实现极致解耦的同时双向发挥了红外与RGB的物理互补优势。后续将进行更新以及进行二次创新发顶刊必备。。。敬请关注笔者整理双模态检测的专属论文资料免费分享给粉丝需要关注后领取。