一、论文信息PSAA模块通过并行提取局部和全局特征、动态融合及残差增强在红外小目标检测中兼顾细节保留和语义理解实现了性能和效率的平衡。本文目录一、论文信息二、论文摘要概况三、PSAA并行自感知注意力结构图四、PSAA模块的作用五、PSAA模块的原理六、PSAA模块的优势七、即插即用模块代码论文题目Context-Aware and Semantic-Guided Adaptive Filtering Network for InfraredSmall Target Detection中文题目基于上下文感知与语义引导的红外小目标检测自适应滤波网络所属单位重庆大学二、论文摘要概况红外小目标检测ISTD是从红外图像中识别微小目标的关键任务。尽管现有的混合卷积神经网络CNN-Transformer方法已实现优异的分割性能但仍存在若干挑战首先自注意力机制对细微局部变化不敏感且计算成本高昂其次在特征融合阶段这些方法未能充分挖掘浅层特征所蕴含的关键信息导致在目标与背景高度相似的场景中难以高效准确地区分二者。为解决这些问题本文提出CSAFNet以提升目标与背景的区分能力。具体而言我们引入了并行自感知注意力PSAA该机制利用物理先验知识捕捉全局上下文并结合小波变换增强局部细节实现局部与全局特征的有效融合鉴于浅层特征对精确定位和精细分割的重要性我们在特征融合阶段设计了跨语义自适应滤波模块CAFM深度挖掘浅层特征中的关键信息并提升目标表征的相对显著性此外我们还提出动态多尺度空间金字塔DMSSP模块以提高边缘精度并提升分割准确性。针对最常用的两大 ISTD 数据集 NUAA - SIRST 和 IRSTD -1K开展的大量实验表明CSAFNet的表现优于其他最先进的方法。图1. 所提出的CSAFNet架构概述。 PSAA 是编码器和解码器的核心组件 CFAM 被引入跳跃连接层以提升特征融合效果在网络瓶颈层中 DMSSP 模块用于优化目标与背景信息的提取。三、PSAA并行自感知注意力结构图图2. 所提 PSAA 的示意图。该方案包含一个用于增强局部细节的 WDE 分支和一个用于建模全局特征的CAA分支。四、PSAA模块的作用1. 增强红外小目标特征感知能力PSAA模块能够同时捕获红外小目标的局部细节信息和全局语义信息使模型在复杂背景下更容易区分目标与背景提高小目标的显著性和可检测性。2. 提升目标定位精度通过并行处理局部和全局特征PSAA可以在保持全局上下文信息的同时精细化刻画小目标边缘和结构从而提升红外小目标的定位精度和边界完整性。3. 减少背景干扰PSAA能够通过特征权重调节和注意力机制抑制背景区域的干扰使网络更加专注于潜在目标区域降低误检率和漏检率。五、PSAA模块的原理1. 双分支结构设计PSAA由两条并行分支组成波let动态增强分支WDE用于捕捉局部高频细节特征上下文感知增强分支CAA用于建模全局语义信息。两条分支分别处理输入特征后再进行融合实现局部与全局信息的协同建模。2. 局部特征增强WDE分支通过小波变换提取局部高频信息增强小目标的纹理特征使模型能够保留目标的微小细节并增强边缘响应。3. 全局特征增强CAA分支利用图像全局上下文和SimAM神经元能量理论评估每个神经元的重要性从而捕获潜在目标区域的全局语义信息。4. 特征融合与残差连接两条分支输出通过Squeeze-and-Excitation模块和卷积操作进行加权融合并加入残差连接确保局部与全局信息充分交互同时保持训练稳定性和特征一致性。六、PSAA模块的优势1. 局部与全局信息互补PSAA通过WDE和CAA双分支结构同时关注局部纹理和全局语义使特征表达更全面提高小目标在复杂背景下的可区分性。2. 高效的特征表达模块利用注意力机制和残差连接增强特征表达能力同时不显著增加计算复杂度适合实时或高分辨率红外小目标检测任务。3. 提升检测性能通过局部细节增强和全局上下文整合PSAA能够显著降低漏检和误检改善复杂背景下红外小目标的检测精度。4. 可扩展性强该模块适用于其他需要同时捕获局部纹理与全局语义信息的计算机视觉任务例如小目标语义分割、低对比度目标检测或微小目标增强任务。表 I IRSTD-1K 和 NUAA-SIRST 与当前最先进方法的比较。性能最佳的方法以粗体标示。图6. 使用不同方法对 NUAA - SIRST 和 IRSTD -1K数据集代表性图像检测结果的可视化对比。图中红色方框表示正确检测结果绿色方框表示漏检结果黄色方框表示误报结果。七、即插即用模块代码import torch import torch.nn as nn import torch.nn.functional as F from pytorch_wavelets import DWTForward class simam_imt(torch.nn.Module): def __init__(self, e_lambda1e-4): super(simam_imt, self).__init__() self.activaton nn.Sigmoid() self.e_lambda e_lambda def __repr__(self): s self.__class__.__name__ ( s (lambda%f) % self.e_lambda) return s staticmethod def get_module_name(): return simam def forward(self, x): b, c, h, w x.size() n w * h - 1 x_minus_mu_square (x - x.mean(dim[2, 3], keepdimTrue)).pow(2) y x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim[2, 3], keepdimTrue) / n self.e_lambda)) 0.5 return y class Down_wt(nn.Module): def __init__(self, in_ch): super(Down_wt, self).__init__() self.wt DWTForward(J1, modezero, wavehaar) self.conv_bn_relu nn.Conv2d(in_ch, in_ch*2, kernel_size1, stride1) def forward(self, x):#1 32 256 256 size x.shape[2:] yL, yH self.wt(x) y_HL yH[0][:, :, 0, ::] y_LH yH[0][:, :, 1, ::] y_HH yH[0][:, :, 2, ::] x y_HL y_LH y_HH#1 96 128 128 # 使用最邻近插值上采样 x F.interpolate(x, sizesize, modenearest)#1 96 256 256 x self.conv_bn_relu(x) return x class WDE(nn.Module): def __init__(self, dim): super().__init__() self.dwconv3x3 nn.Conv2d(dim, dim, kernel_size3, padding3 // 2, groupsdim) self.dwconv3x3_2 nn.Conv2d(dim, dim, kernel_size3, padding1, groupsdim) self.conv_0 Down_wt(in_chdim) self.act nn.GELU() self.conv_1 nn.Conv2d(dim*2, dim, 1, 1, 0) def forward(self, x):#1 32 256 256 v self.dwconv3x3(x) attn self.dwconv3x3_2(x) attn self.conv_0(attn) attn self.act(attn)#1 96 256 256 attn self.conv_1(attn)#1 32 256 256 attn torch.tanh(attn) res attn.mul(v) return res class CAA(nn.Module): def __init__(self, dim36, scale8): super(CAA, self).__init__() self.down_scale scale self.conv1_0 nn.Conv2d(dim, dim * 2, 1, 1, 0) self.conv1_1 nn.Conv2d(dim, dim, 1, 1, 0) self.conv1_2 nn.Conv2d(dim, dim, 1, 1, 0) self.alpha nn.Parameter(torch.ones((1, dim, 1, 1))) self.belt nn.Parameter(torch.zeros((1, dim, 1, 1))) self.gelu nn.GELU() self.WDE WDE(dim) self.dwconv nn.Conv2d(dim, dim, 3, 1, 1, groupsdim) self.simam_imt simam_imt() self.ca nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(dim, dim // 4, kernel_size1), nn.GELU(), nn.Conv2d(dim // 4, dim, kernel_size1), nn.Sigmoid() ) def forward(self, f): _, _, h, w f.shape y, x self.conv1_0(f).chunk(2, dim1) # 1 32 256 256 e_t self.simam_imt(x) e_l self.dwconv(F.adaptive_avg_pool2d(x, (h // self.down_scale, w // self.down_scale))) x_caa F.interpolate(self.gelu(self.conv1_1(e_l * self.alpha)), size(h, w), modenearest) e_t * self.belt x_l x * x_caa y_d self.WDE(y) out x_l y_d out self.ca(out) * out out self.conv1_2(out) return out class PSAA(nn.Module): def __init__(self, in_dim, out_dim, scale): super(PSAA, self).__init__() self.LG_att CAA(in_dim, scale) self.Conv3 nn.Sequential( nn.Conv2d(in_channelsin_dim, out_channelsout_dim, kernel_size3, stride1, padding1), nn.BatchNorm2d(out_dim), nn.ReLU(inplaceTrue) ) self.Conv1 nn.Sequential( nn.Conv2d(in_dim, out_dim, kernel_size1), nn.BatchNorm2d(out_dim), nn.ReLU(inplaceTrue) ) def forward(self, x): x_f x self.LG_att(x) out self.Conv3(x_f) self.Conv1(x_f) return out if __name__ __main__: input torch.randn(2, 32, 128, 128) model PSAA(32, 32, 8) print(model) print(CSDN:AI魔改博士) output model(input) print(PSAA input_size:, input.size()) print(PSAA output_size:, output.size())
【TGRS 2026即插即用模块】PSAA并行自感知注意力,适合红外小目标检测、遥感图像处理、医学图像重建、遥感图像分割、目标分割、目标检测、图像增强等CV任务通用,涨点起飞!
一、论文信息PSAA模块通过并行提取局部和全局特征、动态融合及残差增强在红外小目标检测中兼顾细节保留和语义理解实现了性能和效率的平衡。本文目录一、论文信息二、论文摘要概况三、PSAA并行自感知注意力结构图四、PSAA模块的作用五、PSAA模块的原理六、PSAA模块的优势七、即插即用模块代码论文题目Context-Aware and Semantic-Guided Adaptive Filtering Network for InfraredSmall Target Detection中文题目基于上下文感知与语义引导的红外小目标检测自适应滤波网络所属单位重庆大学二、论文摘要概况红外小目标检测ISTD是从红外图像中识别微小目标的关键任务。尽管现有的混合卷积神经网络CNN-Transformer方法已实现优异的分割性能但仍存在若干挑战首先自注意力机制对细微局部变化不敏感且计算成本高昂其次在特征融合阶段这些方法未能充分挖掘浅层特征所蕴含的关键信息导致在目标与背景高度相似的场景中难以高效准确地区分二者。为解决这些问题本文提出CSAFNet以提升目标与背景的区分能力。具体而言我们引入了并行自感知注意力PSAA该机制利用物理先验知识捕捉全局上下文并结合小波变换增强局部细节实现局部与全局特征的有效融合鉴于浅层特征对精确定位和精细分割的重要性我们在特征融合阶段设计了跨语义自适应滤波模块CAFM深度挖掘浅层特征中的关键信息并提升目标表征的相对显著性此外我们还提出动态多尺度空间金字塔DMSSP模块以提高边缘精度并提升分割准确性。针对最常用的两大 ISTD 数据集 NUAA - SIRST 和 IRSTD -1K开展的大量实验表明CSAFNet的表现优于其他最先进的方法。图1. 所提出的CSAFNet架构概述。 PSAA 是编码器和解码器的核心组件 CFAM 被引入跳跃连接层以提升特征融合效果在网络瓶颈层中 DMSSP 模块用于优化目标与背景信息的提取。三、PSAA并行自感知注意力结构图图2. 所提 PSAA 的示意图。该方案包含一个用于增强局部细节的 WDE 分支和一个用于建模全局特征的CAA分支。四、PSAA模块的作用1. 增强红外小目标特征感知能力PSAA模块能够同时捕获红外小目标的局部细节信息和全局语义信息使模型在复杂背景下更容易区分目标与背景提高小目标的显著性和可检测性。2. 提升目标定位精度通过并行处理局部和全局特征PSAA可以在保持全局上下文信息的同时精细化刻画小目标边缘和结构从而提升红外小目标的定位精度和边界完整性。3. 减少背景干扰PSAA能够通过特征权重调节和注意力机制抑制背景区域的干扰使网络更加专注于潜在目标区域降低误检率和漏检率。五、PSAA模块的原理1. 双分支结构设计PSAA由两条并行分支组成波let动态增强分支WDE用于捕捉局部高频细节特征上下文感知增强分支CAA用于建模全局语义信息。两条分支分别处理输入特征后再进行融合实现局部与全局信息的协同建模。2. 局部特征增强WDE分支通过小波变换提取局部高频信息增强小目标的纹理特征使模型能够保留目标的微小细节并增强边缘响应。3. 全局特征增强CAA分支利用图像全局上下文和SimAM神经元能量理论评估每个神经元的重要性从而捕获潜在目标区域的全局语义信息。4. 特征融合与残差连接两条分支输出通过Squeeze-and-Excitation模块和卷积操作进行加权融合并加入残差连接确保局部与全局信息充分交互同时保持训练稳定性和特征一致性。六、PSAA模块的优势1. 局部与全局信息互补PSAA通过WDE和CAA双分支结构同时关注局部纹理和全局语义使特征表达更全面提高小目标在复杂背景下的可区分性。2. 高效的特征表达模块利用注意力机制和残差连接增强特征表达能力同时不显著增加计算复杂度适合实时或高分辨率红外小目标检测任务。3. 提升检测性能通过局部细节增强和全局上下文整合PSAA能够显著降低漏检和误检改善复杂背景下红外小目标的检测精度。4. 可扩展性强该模块适用于其他需要同时捕获局部纹理与全局语义信息的计算机视觉任务例如小目标语义分割、低对比度目标检测或微小目标增强任务。表 I IRSTD-1K 和 NUAA-SIRST 与当前最先进方法的比较。性能最佳的方法以粗体标示。图6. 使用不同方法对 NUAA - SIRST 和 IRSTD -1K数据集代表性图像检测结果的可视化对比。图中红色方框表示正确检测结果绿色方框表示漏检结果黄色方框表示误报结果。七、即插即用模块代码import torch import torch.nn as nn import torch.nn.functional as F from pytorch_wavelets import DWTForward class simam_imt(torch.nn.Module): def __init__(self, e_lambda1e-4): super(simam_imt, self).__init__() self.activaton nn.Sigmoid() self.e_lambda e_lambda def __repr__(self): s self.__class__.__name__ ( s (lambda%f) % self.e_lambda) return s staticmethod def get_module_name(): return simam def forward(self, x): b, c, h, w x.size() n w * h - 1 x_minus_mu_square (x - x.mean(dim[2, 3], keepdimTrue)).pow(2) y x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim[2, 3], keepdimTrue) / n self.e_lambda)) 0.5 return y class Down_wt(nn.Module): def __init__(self, in_ch): super(Down_wt, self).__init__() self.wt DWTForward(J1, modezero, wavehaar) self.conv_bn_relu nn.Conv2d(in_ch, in_ch*2, kernel_size1, stride1) def forward(self, x):#1 32 256 256 size x.shape[2:] yL, yH self.wt(x) y_HL yH[0][:, :, 0, ::] y_LH yH[0][:, :, 1, ::] y_HH yH[0][:, :, 2, ::] x y_HL y_LH y_HH#1 96 128 128 # 使用最邻近插值上采样 x F.interpolate(x, sizesize, modenearest)#1 96 256 256 x self.conv_bn_relu(x) return x class WDE(nn.Module): def __init__(self, dim): super().__init__() self.dwconv3x3 nn.Conv2d(dim, dim, kernel_size3, padding3 // 2, groupsdim) self.dwconv3x3_2 nn.Conv2d(dim, dim, kernel_size3, padding1, groupsdim) self.conv_0 Down_wt(in_chdim) self.act nn.GELU() self.conv_1 nn.Conv2d(dim*2, dim, 1, 1, 0) def forward(self, x):#1 32 256 256 v self.dwconv3x3(x) attn self.dwconv3x3_2(x) attn self.conv_0(attn) attn self.act(attn)#1 96 256 256 attn self.conv_1(attn)#1 32 256 256 attn torch.tanh(attn) res attn.mul(v) return res class CAA(nn.Module): def __init__(self, dim36, scale8): super(CAA, self).__init__() self.down_scale scale self.conv1_0 nn.Conv2d(dim, dim * 2, 1, 1, 0) self.conv1_1 nn.Conv2d(dim, dim, 1, 1, 0) self.conv1_2 nn.Conv2d(dim, dim, 1, 1, 0) self.alpha nn.Parameter(torch.ones((1, dim, 1, 1))) self.belt nn.Parameter(torch.zeros((1, dim, 1, 1))) self.gelu nn.GELU() self.WDE WDE(dim) self.dwconv nn.Conv2d(dim, dim, 3, 1, 1, groupsdim) self.simam_imt simam_imt() self.ca nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(dim, dim // 4, kernel_size1), nn.GELU(), nn.Conv2d(dim // 4, dim, kernel_size1), nn.Sigmoid() ) def forward(self, f): _, _, h, w f.shape y, x self.conv1_0(f).chunk(2, dim1) # 1 32 256 256 e_t self.simam_imt(x) e_l self.dwconv(F.adaptive_avg_pool2d(x, (h // self.down_scale, w // self.down_scale))) x_caa F.interpolate(self.gelu(self.conv1_1(e_l * self.alpha)), size(h, w), modenearest) e_t * self.belt x_l x * x_caa y_d self.WDE(y) out x_l y_d out self.ca(out) * out out self.conv1_2(out) return out class PSAA(nn.Module): def __init__(self, in_dim, out_dim, scale): super(PSAA, self).__init__() self.LG_att CAA(in_dim, scale) self.Conv3 nn.Sequential( nn.Conv2d(in_channelsin_dim, out_channelsout_dim, kernel_size3, stride1, padding1), nn.BatchNorm2d(out_dim), nn.ReLU(inplaceTrue) ) self.Conv1 nn.Sequential( nn.Conv2d(in_dim, out_dim, kernel_size1), nn.BatchNorm2d(out_dim), nn.ReLU(inplaceTrue) ) def forward(self, x): x_f x self.LG_att(x) out self.Conv3(x_f) self.Conv1(x_f) return out if __name__ __main__: input torch.randn(2, 32, 128, 128) model PSAA(32, 32, 8) print(model) print(CSDN:AI魔改博士) output model(input) print(PSAA input_size:, input.size()) print(PSAA output_size:, output.size())