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

news2024/11/16 1:40:09

前言: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,具体结果如下所示:

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


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

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

相关文章

搭建开发环境-Mac

概述 上一篇搭建开发环境-WSLUbuntu 记录了WSL 和Ubuntu 下开发环境的搭建。这一篇就说下Mac开发环境的搭建。 就像很多人误以为Mini 是专为女孩子设计的高颜值车,其实是一辆极其hardcore 的拉力车一样。 很多人都被Mac 那高颜值蒙蔽了,其实这是一台生产…

为DOSBOX增加外部串口功能

如果DOSBOX内部串口与宿主机串口通互通,那DOSBOX中各种语言开发的程序均与外界有了串行通信功能,MODBUS with DOSBOX也就实现了。下面的操作,为DOSBOX打开通往外部的串行通信接口。 1. 在宿主机上创建虚拟串口对。方法是安装 Free 的 com0co…

【NLP的python库(01/4) 】: NLTK

一、说明 NLTK是一个复杂的库。自 2009 年以来不断发展,它支持所有经典的 NLP 任务,从标记化、词干提取、词性标记,包括语义索引和依赖关系解析。它还具有一组丰富的附加功能,例如内置语料库,NLP任务的不同模型以及与S…

【LeetCode75】第三十七题 二叉树中的最长交错路径

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一棵二叉树,问我们在这棵树里能找到的最长交错路径。最长交错路径就是在二叉树里一左一右一左一右这样走,最…

Golang Gorm 高级查询之where + find

插入测试数据 package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm" )type Student struct {ID int64Name string gorm:"size:6"Age intEmail *string }func (*Student) TableName() string {return "student&q…

自动化测试概况和认知

前言 书中说测试架构师掌握自动化测试的目的不是设计自动化架构或是具体来部署自动化,而是用好自动化。其实这一点我觉得对涉及自动化测试的人员都是通用的,只是偏重点不同。 往往自动化测试前期投入成本可能会大一点,比如框架设计、技术选…

神经网络的工作原理

目录 神经网络的介绍 神经网络的组成 神经网络的工作原理 Numpy 实现神经元 Numpy 实现前向传播 Numpy 实现一个可学习的神经网络 神经网络的介绍 神经网络受人类大脑启发的算法。简单来说,当你睁开眼睛时,你看到的物体叫做数据,再由你…

【论文笔记】Planning and Decision-Making for Autonomous Vehicles

文章目录 Summary1. INTRODUCTION2. MOTION PLANNING AND CONTROL2.1. Vehicle Dynamics and Control2.2. Parallel Autonomy2.3. Motion Planning for Autonomous Vehicles 3. INTEGRATED PERCEPTION AND PLANNING3.1. From Classical Perception to Current Challenges in Ne…

一篇读懂辐射检测仪应用解决方案技术(附方案选型及原理分析)

关于常见的辐射检测仪应用方案: 辐射检测仪是用于测量环境中辐射水平的设备,常用于核电站、医疗机构、实验室和核辐射工作场所等地方。以下是一种可能的辐射检测仪应用方案: 实时监测:辐射检测仪可以实时监测环境中的辐射水平&am…

NIST测试包的可能问题

其实,大多数出现的问题,可能或多或少都可能跟数据集的大小相关。 如: Random Excursions Variant,在测试结果中,可能显示为横线,打开原始报告,可以看到: WARNING: TEST NOT APPLICABLE. THERE ARE AN INSUFFICIENT NUMBER INSUFFICIENT NUMBER OF C…

【C++ 学习 ⑰】- 继承(下)

目录 一、派生类的默认成员函数 二、继承与友元 三、继承与静态成员 四、复杂的菱形继承及菱形虚拟继承 五、继承和组合 一、派生类的默认成员函数 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认构造函数,那么必须在派生…

spring框架:简介+依赖注入

目录 一、spring简介 二、创建项目 三、spring创建对象 四、SpringBean管理 1.注入实现-XML 2.注入实现-注解 一、spring简介 spring诞生与2003年,是一个轻量级的、IOC( Inversion Of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)的jav…

linux挂载内网镜像源文件,支持yum安装

cd /etc/yum.repos.d/vim kylin_aarch64.repo 重建yum缓存 yum clean allyum makecacheyum repolist

【vue】实现高性能虚拟滚动的Vue代码解析

在前端开发中,当需要展示大量数据时,如何保持页面的流畅性是一个挑战。传统的滚动方式会将所有数据一次性渲染到页面,这可能导致页面加载缓慢甚至崩溃。而虚拟滚动技术能够解决这个问题,它只渲染可视区域内的数据,从而…

Vue2向Vue3过度Vuex核心概念actions

目录 1 核心概念 - actions1.定义actions2.组件中通过dispatch调用 2 辅助函数 -mapActions 1 核心概念 - actions state是存放数据的,mutations是同步更新数据 (便于监测数据的变化, 更新视图等, 方便于调试工具查看变化), actions则负责进行异步操作 说…

用Python写一个武侠游戏

前言 在本教程中,我们将使用Python写一个武侠类的游戏,大的框架全部搭好了,很多元素都可以自己添加,让游戏更丰富 📝个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列: ☄️爬虫JS逆向系列专栏 -…

PHP自己的框架cookie()使用(完善篇七)

1、PHP自己的框架cookie() 2、cookie类&#xff08;CookieBase.php&#xff09; <?php class CookieBase {/*** 设置cookie*/public static function set($name, $value, $expire 3600, $path , $domain , $secure false, $httponly false) {setcookie($name, $valu…

Verilog 实现超声波测距

Verilog 实现超声波测距 教学视频&#xff1a; https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 超声波测距原理 参考资料&#xff1a;STM32的超声波测距程序_超声波测距stm32程序_VaderZhang的…

cs231n assignment3 q5 Self-Supervised Learning for Image Classification

文章目录 嫌墨迹直接看代码Q5 Self-Supervised Learning for Image Classificationcompute_train_transform CIFAR10Pair.__getitem__()题面解析代码输出 simclr_loss_naive题面解析代码输出 sim_positive_pairs题面解析代码输出 compute_sim_matrix题面解析代码输出 simclr_lo…

37、springboot 为 spring mvc 提供的自动配置及对自动配置的一些自定义定制(大体思路)

springboot 为 spring mvc 提供的自动配置及对自动配置的一些自定义定制&#xff08;大体思路&#xff09; ★ Spring Boot主流支持两个MVC框架&#xff1a; Spring MVC&#xff08;基于Servlet&#xff09; Spring WebFlux&#xff08;基于Reactive&#xff0c;属于响应式AP…