YOLOv5算法改进(7)— 添加SimAM注意力机制

前言:Hello大家好,我是小哥谈。SimAM(Similarity-based Attention Mechanism)是一种基于相似度的注意力机制,它的原理是通过计算查询向量与每个键向量之间的相似度,从而确定每个键向量对于查询向量的重要性,然后根据这些重要性给每个值向量分配一个权重,最终得到加权的值向量表示。SimAM相比于其他注意力机制的优点在于,它不需要额外的参数进行学习,而是通过计算相似度得分来确定每个键向量的重要性,从而实现了轻量化和高效的注意力机制。🌈 

 前期回顾:

            YOLOv5算法改进(1)— 如何去改进YOLOv5算法

            YOLOv5算法改进(2)— 添加SE注意力机制

            YOLOv5算法改进(3)— 添加CBAM注意力机制

            YOLOv5算法改进(4)— 添加CA注意力机制 

            YOLOv5算法改进(5)— 添加ECA注意力机制

            YOLOv5算法改进(6)— 添加SOCA注意力机制 

            目录

🚀1.论文

🚀2.SimAM注意力机制方法及优缺点

🚀3.在Backbone末端添加SimAM注意力机制方法

💥💥步骤1:在common.py中添加SimAM模块

​💥💥步骤2:在yolo.py文件中加入类名 

​💥💥步骤3:创建自定义yaml文件

💥💥步骤4:修改yolov5s_SimAM.yaml文件 

​💥💥步骤5:验证是否加入成功 

💥💥步骤6:修改train.py中的'--cfg'默认参数

🚀4.在C3后面添加SimAM注意力机制的方法

💥💥步骤1:修改yaml文件

💥💥步骤2:验证是否加入成功 

🚀1.论文

本文是中山大学在注意力机制方面的尝试,从神经科学理论出发,构建了一种能量函数挖掘神经元重要性,并对此推导出了解析解以加速计算。SimAM(Similarity-based Attention Mechanism)是一种基于相似度的注意力机制,它的原理是通过计算查询向量与每个键向量之间的相似度,从而确定每个键向量对于查询向量的重要性,然后根据这些重要性给每个值向量分配一个权重,最终得到加权的值向量表示。SimAM相比于其他注意力机制的优点在于,它不需要额外的参数进行学习,而是通过计算相似度得分来确定每个键向量的重要性,从而实现了轻量化和高效的注意力机制。值得一提的是,SimAM是一种无参数注意力模块。🌿

本文主要贡献包含以下几点:

  • 受启发于人脑注意力机制,本文提出一种3D注意力模块并设计了一种能量函数用于计算注意力权值;

  • 本文推导出了能量函数的解析解加速了注意力权值的计算并得到了一种轻量型注意力模块;

  • 将所提注意力嵌入到现有ConvNet中在不同任务上进行了灵活性与有效性的验证。

论文题目:《SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks》

论文地址:  SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks

代码实现:  https://github.com/ZjjConan/SimAM


🚀2.SimAM注意力机制方法及优缺点

之前的方法:

现有的注意力模块通常被继承到每个块中,以改进来自先前层的输出。这种细化步骤通常沿着通道维度(a)或空间维度(b)操作,这些方法生成一维或二维权重,并平等对待每个通道或空间位置中的神经元。🌴

  • 通道注意力1D注意力,它对不同通道区别对待,对所有位置同等对待;
  • 空域注意力2D注意力,它对不同位置区别对待,对所有通道同等对待。

这可能会限制他们学习更多辨别线索的能力。因此三维权重(c)优于传统的一维和二维权重注意力。

本文的方法:

权值生成方法。现有注意力往往采用额外的子网络生成注意力权值,比如SE的GAP+FC+ReLU+FC+Sigmoid。更多注意力模块的操作、参数量可参考下表。总而言之,现有注意力的结构设计需要大量的工程性实验。我们认为:注意力机制的实现应当通过神经科学中的某些统一原则引导设计

SimAM注意力机制优缺点

注意力机制是深度学习中常用的一种机制,它允许模型在处理序列数据时,能够对不同位置的信息进行加权处理。下面是注意力机制的优缺点:👇

优点:

(1)提升模型性能:注意力机制可以帮助模型更好地准确捕捉输入序列中重要的信息,提升模型的表现能力。

(2)可解释性强:注意力机制能够计算每个位置的权重,使得模型具有可解释性,可以知道模型在决策时关注了哪些重要的位置或特征。

(3)处理长序列能力强:对于较长的输入序列,注意力机制可以有效地处理,避免信息丢失或冗余。

缺点:

(1)计算复杂度高:注意力机制需要计算每个位置的权重,因此在处理较长的输入序列时,计算量较大,会增加模型的计算复杂度。

(2)学习难度较大:注意力机制需要学习如何计算每个位置的权重,对于一些复杂的任务或数据集,学习过程可能会比较困难。

(3)对齐问题:注意力机制假设输入序列和输出序列之间有对应的对齐关系,但在某些情况下,这种对齐关系可能并不明确或存在困难。

总的来说,注意力机制在深度学习中具有重要的作用,能够提升模型性能和可解释性,但也存在计算复杂度高和学习难度大的问题。在使用注意力机制时需要根据具体任务和数据集的特点进行权衡和选择。💞


🚀3.在Backbone末端添加SimAM注意力机制方法

💥💥步骤1:在common.py中添加SimAM模块

将下面的SimAM模块的代码复制粘贴到common.py文件的末尾。

#SimAM
class SimAM(torch.nn.Module):
    def __init__(self, channels=None, out_channels=None, e_lambda=1e-4):
        super(SimAM, self).__init__()
 
        self.activaton = nn.Sigmoid()
        self.e_lambda = e_lambda
 
    def __repr__(self):
        s = self.__class__.__name__ + '('
        s += ('lambda=%f)' % self.e_lambda)
        return s
 
    @staticmethod
    def get_module_name():
        return "simam"
 
    def forward(self, x):
        b, c, h, w = x.size()
 
        n = w * h - 1
 
        x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2)
        y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5
 
        return x * self.activaton(y)

具体如下图所示:

💥💥步骤2:在yolo.py文件中加入类名 

首先在yolo.py文件中找到parse_model函数,然后将SimAM添加到这个注册表里。

​💥💥步骤3:创建自定义yaml文件

models文件夹中复制yolov5s.yaml,粘贴并命名为yolov5s_SimAM.yaml

💥💥步骤4:修改yolov5s_SimAM.yaml文件 

本步骤是修改yolov5s_SimAM.yaml,将SimAM模块添加到我们想添加的位置。

这里我先介绍第一种,第一种是将SimAM模块放在Backbone部分的最末端,这样可以使注意力机制看到整个Backbone部分的特征图,将具有全局视野,类似一个小transformer结构。

在这里,我将[-1,1,SimAM,[1024]]添加到SPPF的下一层,即下图中所示位置。👇

同样的,下面的head也要修改。原本Detect指定的是[17,20,23]层,所以,我们在添加了SimAM模块之后,也要对这里进行修改,即原来的17层,变成18层,原来的20层,变成21层,原来的23层,变成24层;所以这里需要改为[18,21,24]。同样的,Concat的系数也要修改,这样才能保持原来的网络结构不会发生特别大的改变,这里我们把后面两个Concat的系数分别由[-1,14][-1,10]改为[-1,15][-1,11]。🌻

具体如下图所示:

​💥💥步骤5:验证是否加入成功 

yolo.py文件里,将配置改为我们刚才自定义的yolov5s_SimAM.yaml

 然后运行yolo.py,得到结果。

找到了SimAM模块,说明我们添加成功了。🎉🎉🎉 

💥💥步骤6:修改train.py中的'--cfg'默认参数

train.py文件中找到 parse_opt函数,然后将第二行'--cfg'的default改为 'models/yolov5s_SimAM.yaml',然后就可以开始进行训练了。🎈🎈🎈


🚀4.在C3后面添加SimAM注意力机制的方法

第二种是将SimAM放在Backbone部分每个C3模块的后面,这样可以使注意力机制看到局部的特征,每层进行一次注意力,可以分担学习压力。

步骤和方法1相同,区别在于yaml文件不同,所以只需修改yaml文件即可。

💥💥步骤1:修改yaml文件

将SimAM模块放在每个C3模块的后面,要注意通道的变化。

具体如下图所示:

​同样的,下面的head也要做同样的修改。

💥💥步骤2:验证是否加入成功 

 运行yolo.py,具体结果如下所示:

由上图可知,我们添加成功了!🎉🎉🎉


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出:这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx(源仓库名)来切换不同的源地址 nrm use taobao…

代码随想录算法训练营第四十七天|LeetCode 382,115

目录 LeetCode 392.判断子序列 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 115.不同的子序列 动态规划五步曲: 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 …

在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速

WSL2使用NVIDIA Docker进行全栈开发和深度学习 1. 前置条件 1.1. 安装系统 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 跳过 1.2. 处理好网络环境 安装过程中需要访问国际网络,自行处理好。建议开启 tu…

【附安装】R语言4.3.0安装教程

软件下载 软件:R语言版本:4.3.0语言:简体中文大小:77.74M安装环境:Win7及以上版本,64位操作系统硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:h…

【Jenkins】rpm方式安装Jenkins(2.401,jdk版本17)

目录 【Jenkins】rpm方式安装Jenkins 1、主机初始化 2、软件要求 RPM包安装的内容 配置文件说明 3、web操作 【Jenkins】rpm方式安装Jenkins 1、主机初始化 [rootlocalhost ~]# hostname jenkins[rootlocalhost ~]# bash[rootjenkins ~]# systemctl stop firewalld[roo…

爬虫实战之使用 Python 的 Scrapy 库开发网络爬虫详解

关键词 - Python, Scrapy, 网络爬虫 在信息爆炸时代,我们每天都要面对海量的数据和信息。有时候我们需要从互联网上获取特定的数据来进行分析和应用。今天我将向大家介绍如何使用 Python 的 Scrapy 库进行网络爬虫,获取所需数据。 1. Scrapy 简介 1.1 …

微服务学习资料

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册:Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式?2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

2023.8 - java - 多态

多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作, 多态的优点 1. 可替换性2 可扩充性3. 接口性、灵活性、简化性4. 消除类型之间的耦合关系 多态存在的三个必要条件 继承重写父类引用指向子类…

基于SpringBoot实现MySQL与Redis的数据最终一致性

问题场景 在并发场景下,MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起,导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…

(java) 进程调度

目录 进程 首先我们要了解一下什么是进程? 那如何管理进程? PCB中比较重要的属性 进程调度 为什么要进行进程调度? 状态 优先级 上下文 拓展介绍一下寄存器 记账信息 进程 首先我们要了解一下什么是进程? 简单来说…

ubuntu 22.04 LTS openai triton 安装

第一种方法: pip install triton 第二种方法,安装最新的版本: pip install -U --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ triton-nightly 第三种方法: git c…

优化器调整策略

损失函数的作用是衡量模型输出与真实标签的差异。当我们有了这个loss之后,我们就可以通过反向传播机制得到参数的梯度,那么我们如何利用这个梯度进行更新参数使得模型的loss逐渐的降低呢? 优化器的作用 Pytorch的优化器: 管理并…

echarts实现图表标签(label)可拖拽,以及保存拖拽后的位置

需求背景: 当echarts图表中像素点非常多,或者有像素点重合的时候,标签就会被覆盖或者重叠。为了解决这个问题,让用户体验更加友好,于是就实现了对label进行拖拽。用户可以把label拖拽到任何他想要的位置,并…

pandas由入门到精通-数据透视表

采集的数据存储后通常会分为多个文件或数据库,如何将这些文件按需拼接,或按键进行连接十分重要。这节将介绍数据索引的复杂操作如分层索引,stack,unstack,seet_index,reset_index等帮助重构数据,数据的拼接如merge,join,concat,combine_first等帮助连接数据,以及数据透视表…

【C++初阶】模拟实现list

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

Docker安装Jenkins实操记录

前置条件: 1、安装了docker 2、安装了java(没有安装情况下,可运行:yum install -y java-1.8.0-openjdk-devel.x86_64) 一、拉取镜像 1、docker pull jenkins/jenkins 2、mkdir -p /usr/local/jenkins 3、chmod 777 …

Ubuntu搭建CT_ICP里程计的环境暨CT-ICP部署

CT-ICP部署以及运行复现过程 0.下载资源,并按照github原网址的过程进行。1.查看所需要的各个部分的版本。2.安装clang编译器3.进行超级构建3.1标准进行3.2构建过程中遇到的问题 4.构建并安装CT-ICP库4.1标准进行4.2遇到的问题及解决办法 5.构建 CT-ICP 的 ROS 包装5…

python+mysql+前后端分离国内职位数据分析(源码+文档+指导)

系统阐述的是使用国内python职位数据分析系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 Flask框架和MySql数据库技术搭建系统的整体…

深度学习算法模型转成算能科技平台xx.bmodel模型的方法步骤

目录 1 docker镜像下载 2 SDK下载 3 下载sophon-demo 4 修改docker镜像的脚本 5 创建个文件夹 6.source 7.转模型 1 docker镜像下载 可以在dockerhub看到镜像的相关信息 https://hub.docker.com/r/sophgo/tpuc_dev/tags 用下面的命令下载 docker pull sophgo/tpuc_d…

Vue2向Vue3过度Vuex状态管理工具快速入门

目录 1 Vuex概述1.是什么2.使用场景3.优势4.注意: 2 需求: 多组件共享数据1.创建项目2.创建三个组件, 目录如下3.源代码如下 3 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例…