目标检测neck算法之MPCA和FSA的源码实现

目标检测neck算法之MPCA和FSA的源码实现

使用BIBM2024 Spatial-Frequency Dual Domain Attention Network For Medical Image Segmentation的Frequency-Spatial Attention和Multi-scale Progressive Channel Attention改进neck.
接下来,我将讲解它的源码操作的实现,结构的设计哲学,已经代码复现需要的一些基本功知识

它的结构如下

在这里插入图片描述

MPCA

首先是,MPCA部分的复现
在这里插入图片描述
Multi-scale Progressive Channel Attention(MPCA) 是 SF-UNet 中提出的核心模块之一,目标是解决医学图像中多尺度目标(如病灶形状大小不一)难以统一感知的问题。

它的输入是两个不同维度的特征图F1,F2

1

在MPCA操作中,先对F1,F2各自先进行了一个池化(自适应平均池化),然后各自经过一层11卷积*

🎯 哲学解释
✅ 让每个通道“发言”总结自己的全图表现
GAP 是一种无参、结构不敏感的压缩方式:让每个通道用“平均值”代表自己,是信息保留最少失真的手段。
1×1 Conv 起到通道间的线性映射作用,让网络学会哪些通道更重要,哪些可以忽略
🔍 本质目的
将原始空间大特征 → 转为一个压缩的、通道维度的表示。
为后续注意力建模打下基础。

2

然后得到了两个新的F1,F2,进行了一个通道维度上的拼接
再经过一次1
1卷积操作和一个sigmoid操作*

🎯 哲学解释:
✅ 注意力的本质,是“资源分配”——哪一维特征更值得被关注
将两个层级的通道信息拼接,就是在做一种“横向对比”:看看同一语义在不同层级的表现。
用一个 1×1 卷积 + Sigmoid 激活,模拟一个资源管理者,决定哪些通道重要。
在 MPCA 中使用 Sigmoid,是为了让注意力权重具备【0-1连续调控能力】,既能表达通道重要性,又能保持稳定训练,是“柔性关注”的理性选择。
🔍 本质目的:
构建一个统一的注意力空间 ,融合并评估多尺度通道的重要性。

3

解耦注意力,分别分配给两组特征,将A分成,A1,A2

🎯 哲学解释:
✅ 统一评估,分别赋能
一开始统一建模注意力,是为了发现全局规律。
后续分别赋值,是为了保留不同层级的语义差异性。
🔍 本质目的:
防止“高低层特征被统一抹平”,而是给予它们独立但协同的注意力增强。

4

将A1,A2与原始的特征图P1,P2进行了通道乘法,
然后对维度较小的新的F2进行上采样,再对二者相加融合

🎯 哲学解释:
✅ 让网络“专注”于更有信息量的通道
注意力机制的核心作用:抑制冗余,强化关键。
每个通道根据其权重,被动态地放大或抑制。
✅ 融合不同层级的信息 —— 细节 + 语义
高层特征 :抽象语义强,但空间分辨率低。
低层特征:细节丰富,但语义弱。
将两个做加法融合,是在“补短板”:
用高层补语义
用低层保定位

🔍 本质目的:
为下游融合操作打下干净、结构明确的基础。
实现信息的多尺度整合,提升最终表达能力。

MPCA代码复现

class MPCA(nn.Module):def __init__(self, input_channel1=128, input_channel2=64, gamma=2, bias=1):super(MPCA, self).__init__()self.input_channel1 = input_channel1self.input_channel2 = input_channel2self.avg1 = nn.AdaptiveAvgPool2d(1)self.avg2 = nn.AdaptiveAvgPool2d(1)kernel_size1 = int(abs((math.log(input_channel1, 2) + bias) / gamma))kernel_size1 = kernel_size1 if kernel_size1 % 2 else kernel_size1 + 1kernel_size2 = int(abs((math.log(input_channel2, 2) + bias) / gamma))kernel_size2 = kernel_size2 if kernel_size2 % 2 else kernel_size2 + 1kernel_size3 = int(abs((math.log(input_channel1 + input_channel2, 2) + bias) / gamma))kernel_size3 = kernel_size3 if kernel_size3 % 2 else kernel_size3 + 1self.conv1 = nn.Conv1d(1, 1, kernel_size=kernel_size1, padding=(kernel_size1 - 1) // 2, bias=False)self.conv2 = nn.Conv1d(1, 1, kernel_size=kernel_size2, padding=(kernel_size2 - 1) // 2, bias=False)self.conv3 = nn.Conv1d(1, 1, kernel_size=kernel_size3, padding=(kernel_size3 - 1) // 2, bias=False)self.sigmoid = nn.Sigmoid()self.up = nn.ConvTranspose2d(in_channels=input_channel2, out_channels=input_channel1, kernel_size=3, stride=2,padding=1, output_padding=1)

首先是类的属性的设置
这部分代码搭建了一些我们后面进行操作需要用到的积木,定义了一些积木的参数。
参数 比较多,自己看代码吧
积木
1*1卷积,
sigmoid,
卷积核大小的自适应公式,
上采样操作
还有一些pytorch的基本操作函数

项目内容
函数定义nn.AdaptiveAvgPool2d(output_size)
参数output_size=1 表示输出为 (1, 1),即每个通道输出一个值
输入形状(B, C, H, W)
输出形状(B, C, 1, 1)
功能说明全局平均池化(GAP),提取每个通道的全局统计量,压缩空间信息
在 MPCA 中作用把特征图每个通道压缩成一个标量,作为通道的重要性代表,供后续注意力机制使用
项目内容
函数定义nn.Conv1d(in_channels, out_channels, kernel_size, padding, bias)
常见用法nn.Conv1d(1, 1, k, padding=(k−1)//2, bias=False)
输入形状(B, 1, C):表示一个 batch,每个样本有 1 条通道长度为 C 的序列
输出形状(B, 1, C)(由于 padding 保持长度)
功能说明对通道维度进行一维卷积建模,常用于轻量通道注意力(如 ECA)
在 MPCA 中作用捕捉通道间的局部依赖关系,相当于局部注意力增强,而非全连接建模(像 SE 那样)
项目内容
函数定义nn.Sigmoid()
输入范围任意实数
输出范围(0, 1),对每个元素作用
功能说明激活函数,压缩权重到 [0,1],可视为门控机制注意力权重归一化
在 MPCA 中作用将通道注意力权重限制为 0~1,表示“保留程度”或“重要性”,供后续乘法使用
项目内容
函数定义nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, padding, output_padding)
输入形状(B, C_in, H_in, W_in)
输出形状通常为 (B, C_out, H_out, W_out),根据公式计算(与反卷积有关)
功能说明**反卷积(上采样)**操作,用于恢复空间分辨率
在 MPCA 中作用将低分辨率特征上采样到高分辨率尺度,便于与高分辨率分支进行融合

接着就是积木的使用

 def forward(self, x1, x2):x1_ = self.avg1(x1)x2_ = self.avg2(x2)x1_ = self.conv1(x1_.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)x2_ = self.conv2(x2_.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)x_middle = torch.cat((x1_, x2_), dim=1)x_middle = self.conv3(x_middle.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)x_middle = self.sigmoid(x_middle)x_1, x_2 = torch.split(x_middle, [self.input_channel1, self.input_channel2], dim=1)x1_out = x1 * x_1x2_out = x2 * x_2x2_out = self.up(x2_out)result = x1_out + x2_outreturn result

FSA

在这里插入图片描述

符号名称操作含义PyTorch 对应函数应用场景与设计哲学
◯ ©Concatenation(拼接)沿某一维度连接两个特征图(通常是通道维)torch.cat([x1, x2], dim=1)表示“信息融合但不混合”,保持两个输入的独立性;多尺度融合、跳跃连接常见
⊕ (+)Element-wise Addition(逐元素加法)对应位置的像素/通道值相加x1 + x2torch.add(x1, x2)特征叠加、残差连接;设计哲学是“增加信息但不改变结构”
⊗ (×)Element-wise Multiplication(逐元素乘法)对应位置值相乘,一般用于注意力机制x1 * x2常用于 attention,哲学是“信息调制”:重要的地方乘大值,不重要的抑制为零

FSA(Frequency Self-Attention)是一种将频域思想引入注意力机制的结构,其核心设计哲学是:
用频域信息替代空间卷积建模局部或全局依赖,提升特征表达效率与感受野,同时减少参数与计算负担。

它的输入是一个特征图,然后设计了两条分支

1

一条对特征图分别进行平均池化和最大池化(通道维度上的)然后进行拼接
然后对拼接得到的特征图进**行3
3卷积+sigmoid**再与原来的特征图进行相乘
得到一个全局注意力权重*

🎯 哲学解释:
✅ 多视角空间描述,增强局部判别性
最大池化 → 强调显著响应区域
平均池化 → 提取整体分布
合并后用卷积提取空间注意力,聚焦有用区域
🔍 本质目的:
用轻量级方式计算出空间中“该关注哪里”的地图,强化表达焦点。

2

频谱转换 + 频段分离
低频 × 可学习滤波器 + 高频重建
还原回空间域

🎯 哲学解释:
✅ 引入频域视角,识别隐藏结构特征
空间卷积对某些全局模式(如周期、纹理)难以建模,频域天然适合解析这类结构。
✅ 区分高频与低频的语义责任
高频:边缘、边界、细节
低频:轮廓、结构、全局分布
✅ 构建可调的结构增强模块
网络不是直接使用低频,而是学习一个与上下文适配的滤波器 N,作用于低频后再叠加。
✅ 细节与轮廓协同建构表达
高频直接注入,低频经过选择性增强,两者互补。
✅ 频域不是目标,是路径
网络最终还是要在空间域完成识别任务,因此必须将频域的增强信息解码为空间模式。

🔍 本质目的:
✅把输入特征拆解成两个语义功能不同的成分,分别处理,便于后续有针对性的增强。
✅构建一个能根据语境灵活强调结构区域的机制,既保留细节,又提升语义稳定性。
✅实现频域增强 → 空间域可用的表达迁移。

3

注意力加权 + 残差融合
频域增强图 × 空间注意力图 A → 输出图

🎯 哲学解释:
✅ 二次精炼表达结果,强化重点区域
加权增强区域,再残差加回来,保证新特征兼具稳定性与判别性。
✅ 残差哲学:让网络自己决定保留多少原始信息
不是完全覆盖,而是“加法式的优化”——不抛弃、不盲从。
🔍 本质目的:
提供频域视角的可控增强路径 + 空间域的局部精调,最终保持信息一致性和增强表达力。

FSA代码复现

class FSA(nn.Module):def __init__(self, ratio=10, input_channel=64, size=512):super(FSA, self).__init__()self.agf = Adaptive_global_filter(ratio=ratio, dim=input_channel, H=size, W=size)self.sa = SpatialAttention()def forward(self, x):f_out = self.agf(x)sa_out = self.sa(x)result = f_out + sa_outreturn result

首先还是准备积木,
Adaptive_global_filter
SpatialAttention()

class Adaptive_global_filter(nn.Module):def __init__(self, ratio=10, dim=32, H=512, W=512):super().__init__()self.ratio = ratioself.filter = nn.Parameter(torch.randn(dim, H, W, 2, dtype=torch.float32), requires_grad=True)self.mask_low = nn.Parameter(data=torch.zeros(size=(H, W)), requires_grad=False)self.mask_high = nn.Parameter(data=torch.ones(size=(H, W)), requires_grad=False)def forward(self, x):b, c, h, w = x.shapecrow, ccol = int(h / 2), int(w / 2)mask_lowpass = self.mask_lowmask_lowpass[crow - self.ratio:crow + self.ratio, ccol - self.ratio:ccol + self.ratio] = 1mask_highpass = self.mask_highmask_highpass[crow - self.ratio:crow + self.ratio, ccol - self.ratio:ccol + self.ratio] = 0x_fre = torch.fft.fftshift(torch.fft.fft2(x, dim=(-2, -1), norm='ortho'))weight = torch.view_as_complex(self.filter)x_fre_low = torch.mul(x_fre, mask_lowpass)x_fre_high = torch.mul(x_fre, mask_highpass)x_fre_low = torch.mul(x_fre_low, weight)x_fre_new = x_fre_low + x_fre_highx_out = torch.fft.ifft2(torch.fft.ifftshift(x_fre_new, dim=(-2, -1))).realreturn x_out
class SpatialAttention(nn.Module):  # Spatial Attention Moduledef __init__(self):super(SpatialAttention, self).__init__()self.conv1 = nn.Conv2d(2, 1, kernel_size=7, padding=3, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)out = torch.cat([avg_out, max_out], dim=1)out = self.conv1(out)out = self.sigmoid(out)result = x * outreturn result

本人思考

MPCA这个机制实际上是首先对不同维度的特征图分别处理,进行1*1卷积加权,得到了该特征图再不同维度信息的注意力,接着对不同维度进行拼接,加权,解耦,又融合了不同维度之间的注意力,再应用到原特征图上。经二者融合的结果去代替分辨率高的特征图。
我的想法:
进行每次操作时都是原特征图作为输入,可以考虑将更新后的特征图作为输入,类似于FPN的操作。(自顶向下)

最顶层的MPCA操作是最顶层已经它的下采样的特征图作为输出,实际上可能会丢失一部分信息,考虑进行通道注意之后直接输出

考虑引进残差设计机制,因为注意力机制可能过拟合/抑制有效通道:
如果注意力模块学习出了错误的通道权重分布,可能会误伤关键通道,导致特征退化。

对于FSA机制我有一些还未解决的疑惑
进行频域的操作到底是增大了还是减小了计算量
残差融合机制的变体

对比项逐元素加法 +逐元素乘法 ×
稳定性✅ 高:不抑制原始特征❌ 低:容易导致特征被压制
可解释性✅ 恒等映射 + 增量学习✅ 类 attention 门控
用途标准残差结构注意力残差、门控机制等
适合场景深层网络训练稳定有注意力权重参与的精调操作
风险可能累加噪声可能压制有效特征或梯度消失

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86265.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus的3.5.7和PageHelper的那个版本对应

MyBatis-Plus的3.5.7和PageHelper的那个版本对应 根据你的知识库中提到的信息: MyBatis-Plus 3.5.7 使用的是 JSqlParser 4.6 版本。PageHelper 若使用了不同版本的 JSqlParser(如 4.7),会导致冲突。 ✅ 推荐对应关系 为了保证…

Apifox 6 月产品更新|支持 AI 能力、交互优化、在线文档新增 SEO 设置、gRPC 项目支持前/后置操作

在 2025 年的 API 开发领域,Apifox 作为一款集 API 设计、调试、Mock 和测试于一体的协作平台,已成为开发者的“得力助手”。然而,随着业务需求的不断增长,开发者对工具的效率和功能提出了更高的要求。6 月份,Apifox 推…

Acrobat JavaScript 从浏览器到 PDF 环境的转换

目录 什么是 JavaScript?JavaScript 核心语言与 Acrobat 特定 API学习 JavaScript 核心语言的挑战浏览器与 Acrobat JavaScript 的关键差异在 Acrobat 中运行 JavaScript 代码替代浏览器特定函数的方法后续学习建议什么是 JavaScript? JavaScript 最初于 1995 年作为 Netsca…

OpenCV CUDA模块设备层-----指数运算函数exp()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV 的 CUDA 设备端数学函数 中的一个内联函数,用于在 GPU 上对 uchar1 类型(单通道图像像素)执行指数运算…

C++面向对象5——C++关键字、构造函数与拷贝构造函数

this关键字 C关键字this的深度解析 1. this指针的本质 在C中,this是一个特殊的隐式指针,它存在于每个非静态成员函数内部,指向调用该函数的当前对象。其类型为: 对于非const成员函数:ClassName* const(…

人工智能专业:探索未来的智慧前沿

亲戚家的小孩刚高考完,问我人工智能专业是学什么、做什么的。趁机就写一篇吧! 人工智能专业:探索未来的智慧前沿 人工智能(Artificial Intelligence,简称AI)无疑是当今最热门、最具颠覆性的技术之一。它正…

618风控战升级,瑞数信息“动态安全+AI”利剑出鞘

每年的618电商促销季,都是各大电商平台和商家的兵家必争之地。数以亿计的消费者涌入线上平台,期待已久的优惠券、秒杀商品如潮水般涌现,海量交易在瞬间达成,无疑是一场商业狂欢。 然而,在这场狂欢背后,自动…

神经网络的架构

神经网络中的基本术语 以上图为例,相关的术语描述如下: 最左边的称为输⼊层,其中的神经元称为输⼊神经元;最右边的,即输出层包含有输出神经元;本例中的输出神经元只有一个;中间层,既…

安全生产监测预警系统:构筑智能化的安全防线

安全生产监测预警系统是工业安全管理的核心工具,它利用物联网、大数据、人工智能等技术,实现对生产环境、设备运行和人员行为的全方位监测,确保风险早发现、早预警、早处置。其核心功能涵盖实时监测、智能预警、应急处置、数据分析与优化等多…

Java练习题精选6-10

Java练习题精选6-10 一、第六题二、第七题第八题第九题第十题 一、第六题 如何将两个变量的值进行交换?假设变量a1,b2。 public class Main {public static void main(String[] args) {int a 1;int b 2;int tmp;System.out.println("交换前a&qu…

【GESP】C++四级考试大纲知识点梳理, (2) 结构体和二维数组

GESP C四级官方考试大纲中,共有11条考点,本文针对第2条考点进行分析介绍。 (2)掌握 C结构体、二维及多维数组的基本概念及使用 四级其他考点回顾: 【GESP】C四级考试大纲知识点梳理, (1) 指针 全文详见:【G…

自动化测试--App自动化之项目实战脚本编写及封装流程

1.App测试范围 app自动化测试主要核心测试手机程序 测试方面: 功能测试 安装卸载测试 升级测试 兼容性测试 网络切换,中断测试 横竖屏切换 健壮性 2.测试环境的搭建 需要配置的环境 java jdk Java的环境 Android sdk 安卓环境 python环境…

【Unity】什么是前向渲染、延迟渲染、单通道渲染、多通道渲染?

好的,我们来深入剖析这些核心渲染概念,理解它们的原理、优缺点以及在Unity(特别是URP)中的应用。 核心概念:渲染路径 (Rendering Path) 渲染路径决定了光照和着色在场景中是如何计算和应用的。它定义了物体被绘制到屏…

OpenCV CUDA模块设备层-----GPU上执行线程安全的 “原子取最大值” 操作函数

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这是一个 OpenCV 的 CUDA 模块(cv::cudev) 中封装的原子操作函数,用于在 GPU 上执行线程安全的 “原子取最大…

【nRF52832】【环境搭建 1】【ubuntu下搭建nRF52832开发环境】

本文讲述如何在 ubuntu 22.04 下开发 nRF52832. host 环境说明: $ uname -a Linux leo 6.8.0-60-generic #63~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 22 19:00:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux1. 安装软件 sudo apt install gcc-arm-none-eabisudo apt-get i…

【Nginx】403 Forbidden错误

当 Nginx 代理配置出现 403 Forbidden 错误时,通常是由于权限或配置问题导致。以下是常见原因和解决方案: 常见原因及解决方法 1. 后端服务器拒绝访问 原因:后端 HTTPS 服务配置了 IP 白名单或访问控制解决: 检查后端服务器&…

详解 `pip install -e .` 命令【PythonLinux】

详解 pip install -e . 命令 pip install -e . 是 Python 开发中一个非常有用的命令,用于以"可编辑"或"开发"模式安装当前目录中的 Python 包。 命令分解 pip: Python 的包管理工具install: pip 的子命令,用于安装包-e: 是 --edi…

将VSCode的配置迁移到Cursor

目录 方式一:一键导入配置 1.适用场景 2.导入前的配置 3.导入步骤 4.查看导入效果 5.原理 6.注意 方式二:手动迁移配置文件 1.使用场景 2.导入步骤 3.注意 方式一:一键导入配置 1.适用场景 VSCode和Cursor这两个编辑器&#xff0…

大规模流媒体系统架构实践

📋 文章目录 系统概述 - 流媒体系统的基本挑战整体架构设计 - 分层架构与核心组件接入层设计 - CDN与负载均衡策略处理层架构 - 实时转码与分发存储层优化 - 多级缓存与热点数据监控与运维 - 全链路监控体系实战经验总结 - 踩坑指南与最佳实践 🎬 系统概…

Vue 3 + Vite 项目 px 转 vw 完整使用指南

Vue 3 Vite 项目 px 转 vw 完整使用指南 🚀 第一步:插件安装 1.1 安装命令 # 使用 npm 安装 npm install postcss-px-to-viewport-8-plugin --save-dev# 或使用 yarn 安装 yarn add postcss-px-to-viewport-8-plugin --dev# 或使用 pnpm 安装 pnpm a…