【Block总结】完全注意力Fully Attentional,同时捕捉空间和通道的注意力|即插即用

论文信息

  • 标题: Fully Attentional Network for Semantic Segmentation
  • 论文链接: https://arxiv.org/pdf/2112.04108
  • GitHub链接: https://github.com/maggiesong7/FullyAttentional
    在这里插入图片描述

创新点

  • 全注意力模块(FLA): 该模块能够在一个相似性图中同时捕捉空间和通道的注意力,解决了传统方法中存在的“注意力缺失”问题。FLA模块通过有效的特征响应收集,增强了模型对小物体和大物体的分割能力。

方法

  1. 特征提取: 使用ResNet-101或HRNetV2-W48作为基础网络提取特征图。

  2. 全注意力模块:

    • 输入特征图经过卷积处理以减少通道数,得到 ( F i n ) ( F_{in}) (Fin)
    • 通过全注意力模块(FLA)处理 ( F i n ) ( F_{in} ) (Fin),生成经过注意力加权的特征图 ( F o u t ) ( F_{out} ) (Fout)
    • FLA模块结合了空间和通道的注意力机制,确保每个空间位置能够感知到其他位置的特征响应。
  3. 计算效率: 该方法在保持高性能的同时,显著降低了计算复杂度,适合实时应用。
    在这里插入图片描述

全注意力模块

全注意力模块(Fully Attentional Block, FLA)是用于语义分割任务的一种新型注意力机制,旨在同时捕捉空间和通道的特征响应。FLA模块通过在单个相似性图中编码这两种注意力,解决了传统方法中存在的“注意力缺失”问题,尤其在处理小物体和大物体时表现出色。

FLA模块的结构主要包括以下几个部分:

  1. 输入特征图: 输入特征图 F i n F_{in} Fin 经过卷积处理以降低通道数,得到特征图 F i n F_{in} Fin

  2. 全局上下文获取:

    • 通过全局平均池化,FLA模块生成全局上下文信息,帮助每个空间位置捕捉特征响应。
    • 该过程确保每个空间位置能够从具有相同水平和垂直坐标的全局上下文中获取信息。
  3. 自注意力机制:

    • 使用自注意力机制来捕捉任意两个通道图和相关空间位置之间的相似性。
    • 通过计算通道之间的相似度,FLA模块能够有效整合来自不同通道的信息。
  4. 特征更新:

    • 通过生成的全注意力相似性 A A A 和特征图 V V V 进行矩阵乘法,更新每个通道图。
    • 最终输出的特征图 F o u t F_{out} Fout 是通过将更新后的特征与输入特征图进行加权求和得到的

FLA模块的优势:

  • 全面的上下文视图: FLA模块能够捕捉不同空间位置之间的关系,提供更全面的上下文信息。
  • 增强特征辨别能力: 通过全局感受野的构建,FLA模块提高了特征的辨别能力,尤其在复杂场景中表现突出。
  • 适应性强: FLA模块在处理不同类别和大小的物体时,能够有效提升分割精度,减少小物体的忽略和大物体的分割不一致问题。

效果

  • FLANet在多个标准数据集上表现出色,具体性能如下:
    • Cityscapes测试集: 83.6%
    • ADE20K验证集: 46.99%
    • PASCAL VOC测试集: 88.5%

这些结果表明,FLANet在处理复杂场景和多样化物体时,能够有效提高分割精度。

实验结果

  • 对比实验: FLANet与传统的全卷积网络(FCN)和其他基于注意力的模型进行了比较,结果显示FLANet在整体准确率和平均交并比(mIoU)上均有显著提升。

  • 消融实验: 通过逐步去除或替换模型中的不同组件,验证了全注意力模块在提升模型性能中的关键作用。

总结

FLANet通过引入全注意力机制,成功解决了传统语义分割模型在小物体和大物体分割中的不足。其在多个标准数据集上的优异表现,证明了该方法的有效性和创新性。未来的研究可以进一步探索如何将FLANet应用于更广泛的视觉任务中,以及如何优化其计算效率以适应实时应用场景。

代码

import torch
import torch.nn.functional
import torch.nn.functional as F
from torch import nn
from torch.nn import SyncBatchNormclass FullyAttentionalBlock(nn.Module):def __init__(self, plane, norm_layer=SyncBatchNorm):super(FullyAttentionalBlock, self).__init__()self.conv1 = nn.Linear(plane, plane)self.conv2 = nn.Linear(plane, plane)self.conv = nn.Sequential(nn.Conv2d(plane, plane, 3, stride=1, padding=1, bias=False),norm_layer(plane),nn.ReLU())self.softmax = nn.Softmax(dim=-1)self.gamma = nn.Parameter(torch.zeros(1))def forward(self, x):batch_size, _, height, width = x.size()feat_h = x.permute(0, 3, 1, 2).contiguous().view(batch_size * width, -1, height)feat_w = x.permute(0, 2, 1, 3).contiguous().view(batch_size * height, -1, width)encode_h = self.conv1(F.avg_pool2d(x, [1, width]).view(batch_size, -1, height).permute(0, 2, 1).contiguous())encode_w = self.conv2(F.avg_pool2d(x, [height, 1]).view(batch_size, -1, width).permute(0, 2, 1).contiguous())energy_h = torch.matmul(feat_h, encode_h.repeat(width, 1, 1))energy_w = torch.matmul(feat_w, encode_w.repeat(height, 1, 1))full_relation_h = self.softmax(energy_h)  # [b*w, c, c]full_relation_w = self.softmax(energy_w)full_aug_h = torch.bmm(full_relation_h, feat_h).view(batch_size, width, -1, height).permute(0, 2, 3, 1)full_aug_w = torch.bmm(full_relation_w, feat_w).view(batch_size, height, -1, width).permute(0, 2, 1, 3)out = self.gamma * (full_aug_h + full_aug_w) + xout = self.conv(out)return outif __name__ == "__main__":dim=64# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, height, width,channels)x = torch.randn(2,dim,40,40).to(device)# 初始化 FullyAttentionalBlock 模块block = FullyAttentionalBlock(dim)print(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)

在这里插入图片描述

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

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

相关文章

强化学习、深度学习、深度强化学习的区别是什么?

前言 深度强化学习就是 深度学习 和 强化学习 的结合体。它让计算机程序(也就是智能体)在特定环境中不断尝试,从错误中学习,最终找到最优的行动策略。 深度学习是AlphaGo从棋谱里学习,强化学些Alphazero 学习规则&am…

99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)

目录 0. 承前1. 核心知识点拆解2. 中药搭配比喻方案分析2.1 比喻的合理性 3. 通俗易懂的解释3.1 以中药房为例3.2 配方原理 4. 实际应用举例4.1 基础配方示例4.2 效果说明 5. 注意事项5.1 个性化配置5.2 定期调整 6. 总结7. 代码实现 0. 承前 本文主旨: 本文通过中…

笔灵ai写作技术浅析(四):知识图谱

知识图谱(Knowledge Graph)是一种结构化的知识表示方式,通过将知识以图的形式进行组织,帮助AI系统更好地理解和利用信息。在笔灵AI写作中,知识图谱技术被广泛应用于结构化组织各种领域的知识,使AI能够根据写作主题快速获取相关的背景知识、概念关系等,从而为生成内容提供…

基于python的Kimi AI 聊天应用

因为这几天deepseek有点状况,导致apikey一直生成不了,用kimi练练手。这是一个基于 Moonshot AI 的 Kimi 接口开发的聊天应用程序,使用 Python Tkinter 构建图形界面。 项目结构 项目由三个主要Python文件组成: 1. main_kimi.py…

python算法和数据结构刷题[5]:动态规划

动态规划(Dynamic Programming, DP)是一种算法思想,用于解决具有最优子结构的问题。它通过将大问题分解为小问题,并找到这些小问题的最优解,从而得到整个问题的最优解。动态规划与分治法相似,但区别在于动态…

JavaFX - 3D 形状

在前面的章节中,我们已经了解了如何在 JavaFX 应用程序中的 XY 平面上绘制 2D 形状。除了这些 2D 形状之外,我们还可以使用 JavaFX 绘制其他几个 3D 形状。 通常,3D 形状是可以在 XYZ 平面上绘制的几何图形。它们由两个或多个维度定义&#…

wax到底是什么意思

在很久很久以前,人类还没有诞生文字之前,人类就产生了语言;在诞生文字之前,人类就已经使用了语言很久很久。 没有文字之前,人们的语言其实是相对比较简单的,因为人类的生产和生活水平非常低下,…

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页:chian-ocean 文章专栏-Linux 前言: 在Linux中,进程替换(Process Substitution)是一个非常强大的特性,它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…

Python 中最大堆和最小堆的构建与应用:以寻找第 k 大元素为例

引言 在数据处理和算法设计中,堆(Heap)是一种非常重要的数据结构。它是一种特殊的完全二叉树,具有高效的插入和删除操作特性,时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)。堆主要分为最大堆和最小堆,…

使用Avalonia UI实现DataGrid

1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中,DataGrid 是一个独立的包 Avalonia.Controls.DataGrid,因此需要单独通过 NuGet 安装。接下来,将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…

21款炫酷烟花代码

系列专栏 《Python趣味编程》《C/C趣味编程》《HTML趣味编程》《Java趣味编程》 写在前面 Python、C/C、HTML、Java等4种语言实现21款炫酷烟花的代码。 Python Python烟花① 完整代码:Python动漫烟花(完整代码) ​ Python烟花② 完整…

为什么LabVIEW适合软硬件结合的项目?

LabVIEW是一种基于图形化编程的开发平台,广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面,使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…

Cmake学习笔记

cmake的使用场景和功能:cmake 的诞生主要是为了解决直接使用 makeMakefile 这种方式无法实现跨平台的问题,所以 cmake 是可以实现跨平台的编译工具这是它最大的特点。cmake 仅仅只是根据不同平台生成对应的 Makefile,最终还是通过 make工具来…

计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)

应用层概述: 功能: 常见协议 应用层与其他层的关系 网络应用模型 C/S模型: 优点 缺点 P2P模型: 优点 缺点 DNS系统: 基本功能 系统架构 域名空间: DNS 服务器 根服务器: 顶级域…

基于WiFi的智能照明控制系统的设计与实现(论文+源码)

1系统方案设计 本设计智能照明控制系统,结合STM32F103单片机、光照检测模块、显示模块、按键模块、太阳能板、LED灯模块、WIFI模块等器件构成整个系统,在功能上可以实现光照强度检测,并且在自动模式下可以自动调节照明亮度,在手动…

openRv1126 AI算法部署实战之——TensorFlow TFLite Pytorch ONNX等模型转换实战

Conda简介 查看当前系统的环境列表 conda env list base为基础环境 py3.6-rknn-1.7.3为模型转换环境,rknn-toolkit版本V1.7.3,python版本3.6 py3.6-tensorflow-2.5.0为tensorflow模型训练环境,tensorflow版本2.5.0,python版本…

【react+redux】 react使用redux相关内容

首先说一下,文章中所提及的内容都是我自己的个人理解,是我理逻辑的时候,自我说服的方式,如果有问题有补充欢迎在评论区指出。 一、场景描述 为什么在react里面要使用redux,我的理解是因为想要使组件之间的通信更便捷…

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全,哎,真的讲不完,太多啦。 今天主要是讲一下JAVA中的反射机制,因为反序列化的利用基本都是要用到这个反射机制,还有一些攻击链条的构造,也会用到,所以就讲一下。 什么是反射…

vim交换文件的作用

1.数据恢复:因为vim异常的退出,使用交换文件可以恢复之前的修改内容。 2.防止多人同时编辑:vim检测到交换文件的存在,会给出提示,以避免一个文件同时被多人编辑。 (vim交换文件的工作原理:vim交换文件的工作…

无用知识之:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…