CBAM:Convolutional Block Attention Module

news2024/11/23 18:51:01

CBAM(Convolutional Block Attention Module)是一种深度学习领域的注意力机制,旨在增强卷积神经网络对图像特征的建模和表示能力。CBAM引入了通道和空间两种不同的注意力机制,使模型能够动态调整特征图的权重,以适应不同的任务和场景。
在这里插入图片描述
在这里插入图片描述

参考论文:https://arxiv.org/pdf/1807.06521.pdf

背景

深度学习中的卷积神经网络在图像分类、目标检测、图像分割等计算机视觉任务中取得了显著的成功。然而,随着网络结构的不断深化和任务复杂性的增加,传统的CNN模型在一些情况下仍然难以捕捉到图像中的关键特征。这可能是因为传统CNN在处理图像特征时对不同通道和空间位置的信息处理是均等的,忽略了不同通道和空间位置之间的差异性。CBAM的诞生正是为了应对这一挑战。

结构

CBAM模块由两部分组成,分别是通道注意力和空间注意力。以下是CBAM模块的主要组成部分:
(1)通道注意力(Channel Attention)
通道注意力机制用于自适应地调整不同通道的特征响应,以提高对不同特征的敏感性。通道注意力包括以下步骤:
平均池化:对每个通道的特征图进行全局平均池化,得到每个通道上的全局特征。
全连接层:将全局特征映射到一个新的特征空间。这个全连接层负责学习每个通道的权重,以确定其在最终的特征响应中的贡献。
预处理:在使用全连接层输出之前,对其进行一些适当的处理,如使用激活函数。这有助于限制权重的范围并增加模型的非线性表示能力。
广播与相乘:最后通过将通道特定的权重应用到原始的特征图上,获得了自适应调整后的特征响应。这个过程涉及将学习到的通道权重广播到每个空间位置,然后将它们应用到对应的通道特征上。

(2)空间注意力(Spatial Attention)
空间注意力机制用于自适应地调整不同空间位置的特征响应,以提高对不同位置的敏感性。空间注意力包括以下步骤:
最大池化:首先对每个通道的特征图进行全局最大池化,得到每个通道上的最大响应值。
全连接层:将全局最大响应值映射到一个新的特征空间。这个全连接层负责学习每个空间位置的权重,以确定其在最终的特征响应中的贡献。
预处理:与通道注意力类似,空间注意力中的全连接层输出也经过适当的处理,如激活函数。
广播与相乘:最后通过将空间位置特定的权重应用到原始的特征图上,获得了自适应调整后的特征响应。这个过程涉及将学习到的空间位置权重广播到每个通道特征上,然后将它们应用到对应的空间位置上。

通道注意力和空间注意力分别关注了不同方面的特征响应,通道注意力关注通道之间的关系,而空间注意力关注空间位置的关系。通道注意力通过学习每个通道的权重,使模型能够自适应地调整通道特征的重要性,增强对不同特征的建模能力。空间注意力通过学习每个空间位置的权重,使模型能够自适应地调整空间位置特征的重要性,增强对不同位置的建模能力。通过将通道注意力和空间注意力相乘,得到最终的自适应特征响应,这样模型可以在通道和空间维度上更好地捕捉和表示图像特征。

代码实现

import torch
import torch.nn as nn
import torch.nn.functional as F
class ChannelAttentionModule(nn.Module):
    def __init__(self, c1, reduction=16):
        super(ChannelAttentionModule, self).__init__()
        mid_channel = c1 // reduction
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)

        self.shared_MLP = nn.Sequential(
            nn.Linear(in_features=c1, out_features=mid_channel),
            nn.LeakyReLU(0.1, inplace=True),
            nn.Linear(in_features=mid_channel, out_features=c1)
        )
        self.act = nn.Sigmoid()
        # self.act=nn.SiLU()

    def forward(self, x):
        avgout = self.shared_MLP(self.avg_pool(x).view(x.size(0), -1)).unsqueeze(2).unsqueeze(3)
        maxout = self.shared_MLP(self.max_pool(x).view(x.size(0), -1)).unsqueeze(2).unsqueeze(3)
        return self.act(avgout + maxout)


class SpatialAttentionModule(nn.Module):
    def __init__(self):
        super(SpatialAttentionModule, self).__init__()
        self.conv2d = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=7, stride=1, padding=3)
        self.act = nn.Sigmoid()

    def forward(self, x):
        avgout = torch.mean(x, dim=1, keepdim=True)
        maxout, _ = torch.max(x, dim=1, keepdim=True)
        out = torch.cat([avgout, maxout], dim=1)
        out = self.act(self.conv2d(out))
        return out


class CBAM(nn.Module):
    def __init__(self, c1, c2):
        super(CBAM, self).__init__()
        self.channel_attention = ChannelAttentionModule(c1)
        self.spatial_attention = SpatialAttentionModule()

    def forward(self, x):
        out = self.channel_attention(x) * x
        out = self.spatial_attention(out) * out
        return out

在YOLOv5模型中配置模块:

# Parameters
nc:3  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# anchors
anchors:
  #- [5,6, 7,9, 12,10]      # P2/4
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]               
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2           [c=3,64*0.5=32,3]
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4    
   [-1, 3, C3, [128]],                                
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8            
   [-1, 6, C3, [256]],                         
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16       
   [-1, 9, C3, [512]],                     
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]], 
   [-1, 1, CBAM, [1024]], #9
   [-1, 1, SPPF, [1024,5]], #10
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [512, 1, 1]], 
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 14

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 18 (P3/8-small)
   [-1, 1, CBAM, [256]],   #19
   
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 15], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 22 (P4/16-medium)       [256, 256, 1, False]  
   [-1, 1, CBAM, [512]],

   [-1, 1, Conv, [512, 3, 2]],                           #[256, 256, 3, 2] 
   [[-1, 11], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 25 (P5/32-large)       [512, 512, 1, False]
   [-1, 1, CBAM, [1024]],     

   [[19, 23, 27], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

在配置文件中,Backbone和Head中均包含CBAM模块,在训练时加入CBAM训练更稳定,因此一般推荐在Backbone中SPPF前面添加以及在输出预测层前添加

应用领域

CBAM注意力模块已经在多个计算机视觉任务中取得了显著的成功,以下是一些主要应用领域:

  1. 图像分类:CBAM模块可以嵌入到CNN架构中,用于提高图像分类任务的性能。通过自适应特征调整,模型可以更好地捕获图像中不同通道和位置的特征。
  2. 目标检测:在目标检测任务中,CBAM模块可以应用于改进目标检测器的性能。通过引入通道和空间的自适应调整,CBAM可以增强目标检测器对不同目标尺寸和位置的敏感性,提高检测的准确性。
  3. 图像分割:在图像分割任务中,CBAM模块有助于提高分割模型对图像不同区域的关注度。这可以导致更准确的分割结果,尤其在复杂的场景中。
  4. 迁移学习:CBAM模块的自适应特征调整性质使其非常适合迁移学习。预训练的模型可以通过微调以适应不同的任务,而CBAM模块有助于提高模型性能,无需从头开始训练。

延伸方向

  1. 轻量化:目前CBAM模块在一些轻量级模型或嵌入式设备上的应用仍然有挑战,因为它引入了额外的计算和参数。未来的研究可以关注如何设计更轻量级的CBAM变体,以适应资源受限的环境。
  2. 多尺度和多模态:CBAM模块的设计主要针对单一尺度的图像,未来可以考虑如何扩展CBAM以处理多尺度和多模态数据。这将使CBAM更适用于更广泛的应用领域。
  3. 结合其他注意力机制:CBAM是通道和空间注意力的组合,未来的研究可以探索如何将CBAM与其他类型的注意力机制结合,以进一步提高模型的性能。
  4. 可解释性:CBAM的内部机制相对复杂,如何提高模型的可解释性仍然是一个重要的研究方向。理解CBAM如何决定通道和空间的权重以及如何将其应用于特征响应的过程将有助于更好地理解模型的决策。

总结

CBAM作为一种强大的注意力模块,为卷积神经网络的性能提升和特征建模提供了重要的工具。随着未来研究的不断发展,CBAM模块将继续在计算机视觉和其他领域中发挥关键作用,为解决复杂的模式识别和数据建模问题提供更好的解决方案。同时,CBAM的核心思想也将激发更多关于注意力机制和特征调整的研究,推动深度学习领域的发展。欢迎大家关注本博主的微信公众号 BestSongC,后续更多的资源如模型改进、可视化界面等都会在此发布。

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

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

相关文章

Python 文件处理指南:打开、读取、写入、追加、创建和删除文件

文件处理是任何Web应用程序的重要部分。Python有多个用于创建、读取、更新和删除文件的函数。 文件处理 在Python中处理文件的关键函数是open()函数。open()函数接受两个参数:文件名和模式。 有四种不同的方法(模式)可以打开文件&#xff…

[直播自学]-[汇川easy320]搞起来(2)看文档

2023.11.06.NIGHT 一 、读 《Easy320可编程逻辑控制器用户手册-CN-A02.PDF》 21:30 好现在看文档 里面提到 I/O滤波可设置: I/O支持短路保护,I/O指示灯程序控制 热量是向上走的,而PLC是大脑,所以放到最下面&am…

Qt 继承QAbstractTableModel实现自定义TableModel

1.简介 QAbstractTableModel为将数据表示为二维项数组的模型提供了一个标准接口。它不直接使用,但必须进行子类化。 由于该模型提供了比QAbstractItemModel更专业的接口,因此它不适合与树视图一起使用,尽管它可以用于向QListView提供数据。…

Ansible playbook自动化运维工具详解

Ansible playbook自动化运维工具详解 一、playbook的相关知识1.1、playbook 的简介1.2、playbook的 各部分组成 二、基础的playbook剧本编写实例三、 playbook的定义、引用变量3.1、基础变量的定义与引用3.2、引用fact信息中的变量 四、playbook中的when条件判断和变量循环使用…

Swin Transformer V2:扩展容量和分辨率

目标检测是计算机视觉的一个任务,它将指定的输入图像或视频帧转换为对象识别、定位和分类的结果。它非常类似于分类,但添加了定位的元素,它可以确定图像中的特定对象所在的位置。主要用于物体识别、跟踪和车牌识别。 Swin Transformer V2 ✅…

想入行单片机开发的学生们的忠告

想入行单片机开发的学生们的忠告 做嵌入式单片机开发十来年。想给那些想入行单片机开发的同学一些建议。 1.想做这行,做好坚持学习的准备。最近很多小伙伴找我,说想要一些单片机的资料,然后我根据自己从业十年经验,熬夜搞了几个通…

SPSS协方差分析

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

【C++】构造函数和析构函数第三部分(各种构造函数调用规则、多个对象的构造和析构、初始化列表)--- 2023.11.6

目录 各种构造函数的调用规则对象以值的方式给函数参数用一个已有的对象去初始化另一个对象函数的局部对象以值的方式从函数返回调用规则1调用规则2 多个对象的构造和析构初始化列表结束语 各种构造函数的调用规则 对象以值的方式给函数参数 实例: class Maker {…

思维模型 布里丹毛驴效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。犹豫不决是病,得治~ 1 布里丹毛驴效应的应用 1.1 犹豫不决的产品“施乐 914” 20 世纪 60 年代,美国一家名为施乐(Xerox)的公司…

如何在CPU上进行高效大语言模型推理

大语言模型(LLMs)已经在广泛的任务中展示出了令人瞩目的表现和巨大的发展潜力。然而,由于这些模型的参数量异常庞大,使得它们的部署变得相当具有挑战性,这不仅需要有足够大的内存空间,还需要有高速的内存传…

5+单细胞+铜死亡+实验,干湿结合生信思路,有条件做实验的可模仿

今天给同学们分享一篇生信文章“Single-cell transcriptomics reveals immune infiltrate in sepsis”,这篇文章发表在Front Pharmacol期刊上,影响因子为5.6。 结果解读 作者研究的流程图 作者首先制定了这项研究的总体技术路线,如图1所示。…

UVM源码--uvm_component 浅析(一)

目录 1. uvm_object 2. uvm_component 3. 为什么在uvm_component 例化是需要指定一个parent? 4.uvm_component 的树形结构是如何组织起来的? 5. 静态函数与非静态函数的区别: 6. uvm_root 的单实例实现思路: 7. run_test 的…

动态头:用注意力统一目标检测头

目标检测是回答计算机视觉应用中“哪些目标位于哪里”的问题。在深度学习时代,几乎所有现代目标检测器共享相同的范式——特征提取的主干和定位和分类任务的头部。如何提高目标检测头的性能已经成为现有目标检测工作中的一个关键问题。检测头应该是尺度感知&#xf…

modelscope适配昇腾NPU

注意 我只做了raner,raner-50cls,corom这三个模型的适配,不能保证其他模型同样好使。 我的环境信息 NPU: Atlas 300I Pro Modelsope: 1.9.4(最好要使用这个版本呀,因为后面要改一下源码) python: 3.8 torch: 2.0.1 内核以…

深度学习之基于YoloV5交通信号标志识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于YoloV5交通信号标志识别系统介绍 基于YoloV5的交通信号标志识别系统是一种深度学习应用,旨在通过使…

《国产服务器操作系统发展报告(2023)》重磅发布

11月1日,《国产服务器操作系统发展报告(2023)》(以下简称“报告”)在 2023 云栖大会上正式发布,开放原子开源基金会理事长孙文龙、中国信息通信研究院副总工程师石友康、阿里云基础软件部副总裁马涛、浪潮信…

明御安全网关任意文件上传漏洞复现

简介 安恒信息明御安全网关(NGFW) 秉持安全可视、简单有效的理念,以资产为视角的全流程防御的下一代安全防护体系,并融合传统防火墙、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 较低版本的系统存…

享搭低代码平台:快速构建符合需求的会议室管理系统应用

本文介绍了享搭低代码平台如何赋予用户快速构建会议室管理系统应用的能力。通过在应用商店安装费用会议室管理模板,并通过拖拽方式对模板进行自定义扩充,用户可以快速搭建符合自身需求的会议室管理系统,从而提高会议室预订和管理的效率。 介绍…

华为eNSP实验-三层交换机的不同网段通信(通过OSPF路由方式)

1.拓扑图 2.过程如下 2.1 首先PC1和PC2配置好IP地址 2.2 在SW1上配置虚拟网关及VLAN <Huawei>system-view [Huawei]sysname SW1 [SW1]undo info-center enable [SW1] [SW1]vlan batch 10 20 [SW1]interface GigabitEthernet 0/0/1 [SW1-GigabitEthernet0/0/1]port li…

maven项目子类项目版本与父类版本不一致

项目的依赖关系 A项目的父pom是spring boot&#xff0c;A依赖pom B&#xff0c;B依赖hibernate B引用的hibernate版本为8.0.1 A引用的hibernate版本为6.2.0 maven helper插件显示无依赖冲突 这就很奇怪&#xff0c;为何依赖版本有问题呢&#xff1f;是在看不出来问题&#xff…