YOLOv5/v7 添加注意力机制,30多种模块分析②,BAM模块,CBAM模块

news2024/11/8 6:50:15

目录

    • 一、注意力机制介绍
      • 1、什么是注意力机制?
      • 2、注意力机制的分类
      • 3、注意力机制的核心
    • 二、BAM模块
      • 1、BAM模块的原理
      • 2、实验结果
      • 3、应用示例
    • 三、CBAM模块
      • 1、CBAM模块的原理
      • 2、实验结果
      • 3、应用示例

大家好,我是哪吒。

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。


在机器学习和自然语言处理领域,随着数据的不断增长和任务的复杂性提高,传统的模型在处理长序列或大型输入时面临一些困难。传统模型无法有效地区分每个输入的重要性,导致模型难以捕捉到与当前任务相关的关键信息。为了解决这个问题,注意力机制(Attention Mechanism)应运而生。

一、注意力机制介绍

1、什么是注意力机制?

注意力机制(Attention Mechanism)是一种在机器学习和自然语言处理领域中广泛应用的重要概念。它的出现解决了模型在处理长序列或大型输入时的困难,使得模型能够更加关注与当前任务相关的信息,从而提高模型的性能和效果。

本文将详细介绍注意力机制的原理、应用示例以及应用示例。

2、注意力机制的分类

类别描述
全局注意力机制(Global Attention)在计算注意力权重时,考虑输入序列中的所有位置或元素,适用于需要全局信息的任务。
局部注意力机制(Local Attention)在计算注意力权重时,只考虑输入序列中的局部区域或邻近元素,适用于需要关注局部信息的任务。
自注意力机制(Self Attention)在计算注意力权重时,根据输入序列内部的关系来决定每个位置的注意力权重,适用于序列中元素之间存在依赖关系的任务。
Bahdanau 注意力机制全局注意力机制的一种变体,通过引入可学习的对齐模型,对输入序列的每个位置计算注意力权重。
Luong 注意力机制全局注意力机制的另一种变体,通过引入不同的计算方式,对输入序列的每个位置计算注意力权重。
Transformer 注意力机制自注意力机制在Transformer模型中的具体实现,用于对输入序列中的元素进行关联建模和特征提取。

3、注意力机制的核心

注意力机制的核心思想是根据输入的上下文信息来动态地计算每个输入的权重。这个过程可以分为三个关键步骤:计算注意力权重、对输入进行加权和输出。首先,计算注意力权重是通过将输入与模型的当前状态进行比较,从而得到每个输入的注意力分数。这些注意力分数反映了每个输入对当前任务的重要性。对输入进行加权是将每个输入乘以其对应的注意力分数,从而根据其重要性对输入进行加权。最后,将加权后的输入进行求和或者拼接,得到最终的输出。注意力机制的关键之处在于它允许模型在不同的时间步或位置上关注不同的输入,从而捕捉到与任务相关的信息。

YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

二、BAM模块

1、BAM模块的原理

BAM模块是一种新型的注意力机制,其原理是通过对中间特征图进行通道注意力和空间注意力的双重调整,以提高模型对目标的感知能力。在通道注意力中,BAM模块通过学习一个通道权值向量,来对不同通道的特征进行加权处理;在空间注意力中,则通过计算每个空间位置的重要性,来得到空间权重矩阵。将这两种注意力结合起来,即可得到最终的注意力图,从而引导模型更加关注目标相关的特征。

在这里插入图片描述

在实现方面,BAM模块通常被集成到通用CNN架构中,并被放置在网络的每个瓶颈处。多个BAM模块组合起来,形成了一个类似于人类感知过程的分层注意力机制。具体地,在早期阶段,BAM模块会去除低级特征,例如背景纹理特征,随着网络的向前传递,BAM模块会逐渐聚焦于精确的目标,即高级语义。

BAM模块的详细架构如下图所示。给定中间特征图F,该模块通过通道Mc和空间Ms这两个单独的注意分支计算出相应的注意图M(F)。模块有两个超参数:膨胀值(d)和收缩比®。膨胀值决定了接受域的大小,有助于空间分支的上下文信息聚集;而收缩比则控制着两个注意力分支的能力和开销。

在这里插入图片描述

BAM模块在目标检测领域中被广泛应用,并且已经被成功地应用于多个重要的目标检测模型中,如YOLOv5、RetinaNet等。以YOLOv5为例,BAM模块被加入到CSPDarknet53的每个瓶颈处,以提高模型对目标的感知能力。实验结果表明,加入BAM模块的CSPDarknet53相比原版CSPDarknet53在COCO数据集上的mAP提高了1.2个点,同时参数量也略有增加。此外,研究者还通过可视化的方式观察到,BAM模块能够使得模型更加关注物体的边缘和细节部分,从而提升模型的准确性和鲁棒性。

2、实验结果

在这里插入图片描述

BAM相对于SE 的实验结果。在CIFAR-100数据集上报告了Top-1错误率。

3、应用示例

BAM模块的应用示例:

import torch
from torch import nn

class BAM(nn.Module):
    def __init__(self, inplanes):
        super(BAM, self).__init__()

        # 通道注意力分支
        self.channel_attention = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(inplanes, inplanes // 2, 1, padding=0),
            nn.ReLU(inplace=True),
            nn.Conv2d(inplanes // 2, inplanes, 1, padding=0),
            nn.Sigmoid()
        )

        # 空间注意力分支
        self.spatial_attention = nn.Sequential(
            nn.Conv2d(inplanes, 1, kernel_size=1, stride=1, padding=0),
            nn.Sigmoid()
        )

    def forward(self, x):
        # 通道注意力权重的计算
        channel_weight = self.channel_attention(x)

        # 将通道注意力权重应用于特征图上
        out = x * channel_weight

        # 空间注意力权重的计算
        spatial_weight = self.spatial_attention(out)

        # 将空间注意力权重应用于特征图上
        out = out * spatial_weight

        return out

以上代码展示了如何在YOLOv5中实现BAM模块。在该实现中,通道注意力分支和空间注意力分支都被定义为nn.Sequential()的形式,并且分别包含一系列卷积、池化、激活等操作。在前向传播时,先计算通道注意力权重,然后将其应用于特征图上,接着计算空间注意力权重,并将其应用于特征图上。最终的输出即为经过BAM模块处理后的特征图。

三、CBAM模块

1、CBAM模块的原理

CBAM是"Convolutional Block Attention Module"的缩写,是一种针对卷积神经网络(CNN)的注意力机制模块。CBAM通过学习的方式自动获取每个特征通道的重要程度和每个特征空间的重要程度。这些重要程度信息可以被用来提升对当前任务有帮助的特征,并抑制对当前任务不重要的特征,从而提高整个模型的性能。

在这里插入图片描述

CBAM的结构包含两个子模块:通道注意力模块(channel attention module)和空间注意力模块(spatial attention module)。其中,通道注意力模块主要负责计算每个特征通道的重要程度,空间注意力模块则负责计算每个特征空间的重要程度。这两个子模块可以分别或者同时使用,具体使用哪个子模块由实际任务和数据集决定。

在这里插入图片描述

在通道注意力模块中,CBAM使用了一个全局平均池化层(Global Average Pooling),将每个特征图的通道维度进行压缩得到一个全局的特征向量,然后通过一个小型的多层感知机(MLP)来计算每个通道的重要程度。这样,每个通道的重要程度信息就可以被用来对该通道的特征进行加权,从而提升有用的特征并且抑制无用的特征。

在这里插入图片描述

在空间注意力模块中,CBAM使用了一个全局最大池化层(Global Max Pooling),将每个特征图所有像素点中的最大值取出,然后同样通过一个小型的MLP计算每个像素点的重要程度。这样,每个像素点的重要程度信息就可以被用来对该像素点所在位置的特征进行加权,从而提升有用的特征并且抑制无用的特征。

在这里插入图片描述

CBAM与ResNet中的ResBlock集成。该图显示了我们的模块在ResBlock内部集成的确切位置。我们在每个块中对卷积输出应用CBAM。

2、实验结果

在这里插入图片描述

在MS COCO验证集上的目标检测平均精度(mAP,%)。我们采用Faster R-CNN [41]检测框架,并将我们的模块应用到基础网络中。CBAM使得两个基线网络的mAP@[.5, .95]都提高了0.9。

3、应用示例

以下是使用CBAM模块的应用示例:

import torch.nn as nn

class CBAM(nn.Module):
    def __init__(self, channels, reduction=16):
        super(CBAM, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.fc1 = nn.Conv2d(channels, channels // reduction, kernel_size=1, padding=0, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.fc2 = nn.Conv2d(channels // reduction, channels, kernel_size=1, padding=0, bias=False)
        self.sigmoid_channel = nn.Sigmoid()
        self.conv_after_concat = nn.Conv2d(2, 1, kernel_size=7, stride=1, padding=3, bias=False)
        self.sigmoid_spatial = nn.Sigmoid()
  
    def forward(self, x):
        avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x))))
        max_out = self.fc2(self.relu(self.fc1(self.max_pool(x))))
        channel_out = self.sigmoid_channel(avg_out + max_out)
        x = x * channel_out
        spatial_out = torch.cat([self.avg_pool(x), self.max_pool(x)], dim=1)
        spatial_out = self.conv_after_concat(spatial_out)
        spatial_out = self.sigmoid_spatial(spatial_out)
        x = x * spatial_out
        return x

上述代码中实现了CBAM模块的前向传播过程,包括通道注意力和空间注意力两部分。在YOLOv5中,可以将CBAM模块插入到Darknet53的多个卷积块中,以增强特征提取能力。

参考论文:

  1. http://arxiv-export-lb.library.cornell.edu/pdf/1807.06514
  2. https://arxiv.org/pdf/1807.06521.pdf

在这里插入图片描述

🏆本文收录于,目标检测YOLO改进指南。

本专栏均为全网独家首发,🚀内附代码,可直接使用,改进的方法均是2023年最近的模型、方法和注意力机制。每一篇都做了实验,并附有实验结果分析,模型对比。

🏆华为OD机试(JAVA)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

🏆往期回顾:

1、YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

2、YOLOv5结合BiFPN,如何替换YOLOv5的Neck实现更强的检测能力?

3、YOLOv5结合BiFPN:BiFPN网络结构调整,BiFPN训练模型训练技巧

4、YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

5、YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

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

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

相关文章

测试之路-我曾经跨过无数Bug,也怼过各大佬开发

前言: 这是我从事测试的第五个年头的开端,忙忙碌碌到头发现好像忙了个寂寞。也忘了最初走向这条不归路的初心是什么。当时14年学完计算机出来找工作,看着茫茫人海,第一反应就是退缩,该找什么工作?开发&…

sparkSQL的使用

sparksql只能处理结构化数据 基于rdd构建dataframe对象 from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerTypeif __name__ __main__:spark SparkSession.builder.appName(test).master(local[*]).getOrCreate()sc spa…

JS-Object无序问题

1、 背景 在开发图表功能时,由于历史原因,后端返回的图表数据如下: 是对象类型,键为日期,值为日期和当天日期的值。在H5端、微信小程序端运行结果正常,结果到了百度小程序突然发现,这个值的顺…

IDEA2021.1.3版本lombok插件--代码爆红问题解决

最近,突然心血来潮将自己工作中开发使用的idea升级到2021.1.3版本,安装成功后,打开代码发现有关get、set方法全部爆红,不用想,肯定是Lombok插件问题,通过setting->plugin里面搜索Lombok居然不存在&#…

终于有人把Linux系统收发网络数据包的过程讲清楚了!

Linux 服务器收到网络数据包,需要经过哪些处理,一步步将数据传给应用进程的呢?应用进程发送数据包时,Linux 又是如何操作将数据包发送出去的呢?今天我们就来聊聊这个话题。 在准备好接收网络数据包之前,Lin…

Mysql数据库入门基础篇--sql语句简单使用

Mysql数据库入门基础篇--sql语句简单使用 🔻一、数据库创建、删除、选择1.1 🍃 create database 创建数据库1.2 🍃 使用 mysqladmin 创建数据库1.3 🍃 drop 命令删除数据库--一般不建议在数据库执行delete、drop等命令1.4 &#x…

redis入门学习

redis基本数据结构 redis的返回值 在设置一个key-value对的时候通常会返回ok告诉我们操作成功了,1代表成功,0代表失败,通常会根据返回值的不同处理不同的业务逻辑用redis.cn来查看命令 全局操作 flushdb清空内存数据库keys *展示所有存储…

第十八章:MySQL8其他新特性

第十八章:MySQL8其他新特性 18.1:MySQL8新特性概述 ​ MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出…

2023-06-08 Unity AssetBundle1——AB包介绍与使用

文章目录 一、AB 包介绍二、AB 包资源打包(一)导入 AB 包(二)将资源关联 AB 包(三)打包参数选项(四)打包结果(五)AB 包信息 三、加载 AB 包资源(一…

如何让访问者能更快地加载出你的网站?

​  在当今互联网时代,网站已成为人们获取信息、交流互动、进行商业活动等的主要场所之一。然而,由于网络环境的复杂性和不确定性,用户在访问网站时常常会遇到访问缓慢、卡顿等问题,从而影响了用户的使用体验。为了让用户更快地…

【数据结构】常见排序算法——快速排序的三种实现、 hoare版本、挖坑法、前后指针版本

文章目录 1.常见排序2.快速排序2.1hoare版本2.2快速排序优化2.3挖坑法实现2.4前后指针实现 1.常见排序 2.快速排序 快速排序(Quick Sort) 是一种常见的排序算法,也是一种基于分治算法的排序。该算法的基本思想是将一个数据集分成两个子集&…

实验四、shell编程

一、实验目的 1.了解shell的特点和主要种类。 2.掌握 shel1 脚本的建立和执行方式。 3.掌握bash的基本语法。 4.学会编写shell 脚本。 二、实验内容 shell 脚本的建立和执行。历史命令和别名定义。shell变量和位置参数、环境变量。bash的特殊字符。一般控制结构。算术运算及…

Redis事务和管道

一、Redis事务 1、定义 可以一次执行多个命令,本质上是一组命令的集合。一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不能加塞。 2、作用 一个队列中,一次性、顺序性、排他性的执行一系列命令。 …

第Y3周:yolov5s.yaml文件解读

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制 ✅本周任务:将yolov5s网络模型中第4层的C3*2修改为C3*1,第6层的C3*3修改为C3*2。 简单介绍: YOLOv5配置了…

企业Wiki和知识库-SaaS产品运营指南

内部Wiki也叫做企业Wiki,是员工可以存储、共享和协作创作的地方,将企业内部员工知识共享集中到一个地方,并且相关内容与其他团队成员协作完成,它可以包含企业内部的各种知识,从操作指南到培训手册,再到客户…

RabbitMQ - 延迟队列

RabbitMQ - 延迟队列 延迟队列介绍RabbitMQ 中的 TTL整合 springboot队列 TTL延时队列TTL优化Rabbitmq 插件实现延迟队列总结 延迟队列介绍 延迟队列概念: 延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是…

《Lua程序设计》--学习3

输入输出 简单I/O模型 Lua 文件 I/O | 菜鸟教程 (runoob.com) 暂留 补充知识 局部变量和代码块 Lua语言中的变量在默认情况下是全局变量,所有的局部变量在使用前必须声明 在交互模式中,每一行代码就是一个代码段(除非不是一条完整的命…

spark的高阶用法

广播变量broadcast 使用场景:本地集合变量和分布式变量(rdd)进行关联的时候使用 优点:1.可以节省io操作.2.减少executor的内存占用 #定义 map_list {(1,dawang,22),(2,xiaogou,333).....} broadcast sc..broadcast(map_list) #使用 for i in broadcast.value:print(i)累加器a…

【TA100 】 LDR与HDR

一、LDR和HDR的基本概念 1.HDR 、LDR、动态范围 ● Dynamic Range(动态范围)最高亮度/最低亮度 ● HDR High Dynamic Range ● LDR Low Dynamic Range ● ToneMapping:将超高的动态范围(HDR)转换到我们日常显示的屏…

指定英国名校|社会科学老师喜赴曼彻斯特大学访学研究

社会科学较理工科专业申请访问学者的难度更大,何况M老师还有学校、专业、时间等要求。最终我们为其落实了世界50强名校—曼彻斯特大学全球发展研究所的职位,专业方向高度契合。在对方行政办理流程时遇到一些阻力,好在有惊无险地完成了全部流程…