通俗易懂理解CA(Coordinate Attention)

news2024/11/18 21:41:07

一、参考资料

github代码:CoordAttention

Coordinate Attention

二、相关介绍

通道注意力与空间注意力

关于通道注意力和空间注意力的详细介绍,请参考另一篇博客:通俗易懂理解通道注意力机制(CAM)与空间注意力机制(SAM)

注意力机制是用来告诉模型需要关注哪些内容和哪些位置。对于网络的某一点输出,尺寸一般是(batchsize,C,H,W),channel attention 是利用通道信息( C ),spatial attention 是利用位置信息(H, W)。

三、CA(Coordinate Attention)相关介绍

1. 不同注意力方法对比

1.1 不同注意力的结构

  • SE模块[1]从feature map中channel着手,学习模型应该关注哪些通道,如图(a);
  • CBAM(Convolutional Block Attention Module)[2]作为SE的改进版本,结合了channel和spatial,如图(b);
  • 实际上,CBAM提取空间注意力是用局部卷积,只能捕获局部的信息,无法获得长距离依赖。且CBAM全局池化会有位置损失,实际上pool这种都会有信息损失,基于此作者提出了CA[3],充分利用了位置信息,而且控制了计算开销,如图©;

在这里插入图片描述

解释说明

  • GAP,表示全局平均池化(global average pooling);
  • GMP,表示全局最大池化(global max pooling);
  • X Avg Pool,表示一维水平全局池化(1D horizontal global average pooling);
  • Y Avg Pool,表示一维垂直全局平均池化(1D vertical global average pooling)。

1.2 不同注意力的性能

不同注意力方法在三种经典视觉任务中的表现,如下图所示:

在这里插入图片描述

解释说明

  • MBV2,表示MobileNetV2

2. (Paddle)代码实现

# CA (coordinate attention)

import paddle
import paddle.nn as nn
import math
import paddle.nn.functional as F


class CA(nn.Layer):
    def __init__(self, in_ch, reduction=32):
        super(CA, self).__init__()
        self.pool_h = nn.AdaptiveAvgPool2D((None, 1))
        self.pool_w = nn.AdaptiveAvgPool2D((1, None))

        mip = max(8, in_ch // reduction)

        self.conv1 = nn.Conv2D(in_ch, mip, kernel_size=1, stride=1, padding=0)
        self.bn1 = nn.BatchNorm2D(mip)
        self.act = nn.Hardswish()
        
        self.conv_h = nn.Conv2D(mip, in_ch, kernel_size=1, stride=1, padding=0)
        self.conv_w = nn.Conv2D(mip, in_ch, kernel_size=1, stride=1, padding=0)
        

    def forward(self, x):
        identity = x
        
        n,c,h,w = x.shape
        x_h = self.pool_h(x)
        x_w = self.pool_w(x).transpose([0, 1, 3, 2])

        y = paddle.concat([x_h, x_w], axis=2)
        y = self.conv1(y)
        y = self.bn1(y)
        y = self.act(y) 
        
        x_h, x_w = paddle.split(y, [h, w], axis=2)
        x_w = x_w.transpose([0, 1, 3, 2])

        x_h = F.sigmoid(self.conv_h(x_h))
        x_w = F.sigmoid(self.conv_w(x_w))      

        out = identity * x_w * x_h

        return out

验证

# validation
# input size = 64,512,14,14 --> CA --> output size = 64,512,14,14

ca = CA(512)                     # in_channel
x = paddle.randn([64,512,14,14]) # (batchsize, channel, H, W)
y = ca(x)
y.shape

四、参考文献

[1] Hu J, Shen L, Sun G. Squeeze-and-excitation networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 7132-7141.

[2] Woo S, Park J, Lee J Y, et al. Cbam: Convolutional block attention module[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 3-19.

[3] Hou Q, Zhou D, Feng J. Coordinate attention for efficient mobile network design[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 13713-13722.

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

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

相关文章

8、电源管理入门之休眠唤醒

目录 1.基本概念和框架 1.1 基本概念 1.2 休眠唤醒技术框架 2. 核心代码分析 3. 详细分析 3.1 suspend sys节点入口 3.2 state_store&pm_suspend 3.3 enter_state 3.3.1 valid_state 3.3.2 suspend_prepare 3.3.3 suspend_devices_and_enter 3.3.4 dpm_suspend…

基于ssm框架的高校班级管理系统设计与实现

为解决当前高校班级管理中管理方式落后、手段落后及效率低下等问题而以当前主流的互联网技术设计一款高校班级管理系统。该系统采用B/S模式的设计思路而将前端(JSP技术)和后端(SSM框架MySQL数据库)整合于一体并通过Java语言代码编…

可视化 RAG 数据 — EDA for Retrieval-Augmented Generation

目录 一、说明 二、准备好 三、准备文件 四、拆分和创建数据集的嵌入 五、构建 LangChain 六、问一个问题 七、可视化 八、下一步是什么? 九、引用 一、说明 像 GPT-4 这样的大型语言模型 (LLM) 在文本理解和生成方面表现出令人印象深刻的能力…

fpga_直方图均衡

直方图均衡是一种用于图像增强和对比度调整的图像处理技术。它通过重新分配图像中像素的灰度级分布,使得图像的直方图变得更加均衡,从而增强图像的视觉效果。 一 直方图 直方图源于柱状图 二 数字图像与灰度直方图 如图所示,灰度直方图是读…

【Vue渗透】Vue Devtools 浏览器插件

下载地址 Vue Devtools 浏览器插件 Vue站点渗透思路 【Vue渗透】Vue站点渗透思路 简介 Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌在开发者工具中,使用体验流畅。Vue Devtools 由…

【扩散模型】【网络结构探索】神经网络扩散:Neural Network Diffusion(论文解读)

项目地址:https://github.com/NUS-HPC-AI-Lab/Neural-Network-Diffusion 文章目录 摘要一、前言二、Nerual Network Diffusion (神经网络扩散)2.1扩散模型(预备知识)2.2 总览2.3 参数自动编码器2.4 参数生成 三、实验3…

harbor(docker仓库)仓库部署 - 高可用

harbor(docker仓库)仓库部署 - 高可用 1. harbor高可用1.1 方案说明1. 双主复制2. 多harbor实例共享后端存储 1.2 部署高可用(多harbor实例共享后端存储)1. 服务器划分2. 安装harbor(先部署一套Harbor,用于…

【LeetCode每日一题】 单调栈的案例84 柱状图中最大的矩形

84 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

unity ui界面优化

优化一个比较复杂的界面,里面有多个rt和组件。 在初次打开这个界面的时候会发生1s多的卡顿,还是非常严重的。 分析 通过profiler分析 1.打开界面时卡顿。 分析:除了update和dotween相关逻辑,主要在于打开时的lua function调用…

【Python笔记-设计模式】装饰器模式

一、说明 装饰器模式是一种结构型设计模式,旨在动态的给一个对象添加额外的职责。 (一) 解决问题 不改变原有对象结构的情况下,动态地给对象添加新的功能或职责,实现透明地对对象进行功能的扩展。 (二) 使用场景 如果用继承来扩展对象行…

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型 目录 多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍…

JAVA--File类与IO流

目录 1. java.io.File类的使用 1.1 概述 1.2 构造器 1.3 常用方法 1、获取文件和目录基本信息 2、列出目录的下一级 3、File类的重命名功能 4、判断功能的方法 5、创建、删除功能 2. IO流原理及流的分类 2.1 Java IO原理 2.2 流的分类 2.3 流的API 3. 节点流之一…

Unity之PUN2插件实现多人联机射击游戏

目录 📖一、准备工作 📺二、UI界面处理 📱2.1 登录UI并连接PUN2服务器 📱2.2 游戏大厅界面UI 📱2.3 创建房间UI 📱2.4 进入房间UI 📱2.5 玩家准备状态 📱2.6 加载战斗场景…

SpringCloud-Gateway解决跨域问题

Spring Cloud Gateway是一个基于Spring Framework的微服务网关,用于构建可扩展的分布式系统。在处理跨域问题时,可以通过配置网关来实现跨域资源共享(CORS)。要解决跨域问题,首先需要在网关的配置文件中添加相关的跨域…

【EI会议征稿通知】2024年软件自动化与程序分析国际学术会议(SAPA 2024)

2024年软件自动化与程序分析国际学术会议(SAPA 2024) 2024 International Conference on Software Automation and Program Analysis 在当今科技社会中,软件产业呈快速发展趋势,软件自动化与程序分析技术在提高软件质量、降低开发成本、提升…

【Java】继承与抽象(实验三)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 了解继承的概念,掌握派生类的定义。掌握派生类构造方法的执行过程。掌握方法的重载与覆盖。掌握抽象类的概念及上转型对象的使用 二、实验内容 1、定义一个抽象类Shape,类中封装属性name…

详解AP3216C(三合一sensor: 光照、距离、照射强度)驱动开发

目录 概述 1 认识AP3216C 1.1 AP3216C特性 1.2 AP3216C内部结构 1.3 AP3216C 硬件电路 1.4 AP3216C工作时序 1.4.1 I2C 写数据协议 1.4.2 I2C 读数据协议 1.5 重要的寄存器 1.5.1 系统配置寄存器 1.5.2 和中断相关寄存器 1.5.3 IR数据寄存器 1.5.4 ALS 数据寄存器 …

C++之stack与queue的模拟实现

一、 stack的介绍和使用 1. stack的介绍 stack 的文档介绍 翻译: 1. stack 是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被实现的&#xff…

C++的queue容器->基本概念、常用接口

#include<iostream> using namespace std; #include <queue> #include <string> //队列 queue class Person { public: Person(string name, int age) { this->m_Name name; this->m_Age age; } string m_Name; int…

.netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项

1、SqlSugarCore 相关 1.1 主项目添加数据&#xff0c;否则会报数据库连接错误&#xff1a; <InvariantGlobalization>false</InvariantGlobalization> <PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</…