当前位置: 首页 > news >正文

YOLOv5改进——添加SimAM注意力机制

目录

一、SimAM注意力机制核心代码

二、修改common.py

三、修改yolo.py

​三、建立yaml文件 

四、验证


一、SimAM注意力机制核心代码

在models文件夹下新建modules文件夹,在modules文件夹下新建一个py文件。这里为simam.py。复制以下代码到文件里面。

import torch
import torch.nn as nnclass SimAM(torch.nn.Module):def __init__(self, channels = None, e_lambda = 1e-4):super(SimAM, self).__init__()self.activaton = nn.Sigmoid()self.e_lambda = e_lambdadef __repr__(self):s = self.__class__.__name__ + '('s += ('lambda=%f)' % self.e_lambda)return s@staticmethoddef get_module_name():return "simam"def forward(self, x):b, c, h, w = x.size()n = w * h - 1x_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.5return x * self.activaton(y)

注意:很多改进教程都是将代码直接复制到common.py文件,如果改进机制多了容易造成混乱。建议创建一个modules文件夹,将改进机制放里面方便管理。

二、修改common.py

在common.py文件中,在前面的部分添加以下代码,导入GhostV2.py的内容:

from models.modules.simam import *

三、修改yolo.py

在yolo.py文件中,在导入common模块的上面一行添加以下代码,导入GhostV2.py的内容:

from models.modules.simam import *

注意:这里位置不要搞错,不然可能会找不到导入的模块。

如下图所示: 

找到parse_model函数,将SimAM模块加入,如下图所示:

​三、建立yaml文件 

在models文件夹下,复制yolov5s.yaml文件,粘贴并重命名为yolov5s-simam.yaml。

这里将SimAM注意力机制加在backbone最末端。这样可以使注意力机制看到整个backbone部分的特征图,将具有全局视野,类似于一个小的transformer结构。

如图所示,将SimAM注意力机制加在SPPF的下一层:

 加了层数后,后面的head部分也得修改,如下图所示:

修改前:

修改后: 

加一层就在参数上加一,若加多个机制,依此类推。

yolov5s-simam.yaml完整代码如下:

# Ultralytics YOLOv5 , AGPL-3.0 license# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:- [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 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-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, SPPF, [1024, 5]], # 9[-1, 3, SimAM, [1024]], # 10]# YOLOv5 v6.0 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, Conv, [256, 3, 2]],[[-1, 15], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 21 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 11], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 24 (P5/32-large)[[18, 21, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]

至此更改完成。

四、验证

在yolo.py 文件里面的配置文件改为刚才自定义的yolov5s-simam.yaml

ctrl+shift+p 在弹出框窗口搜索Python:选择解释器,选择自己创建的Python虚拟环境,这里是yolo。

运行yolo.py,出现刚刚加入的SimAM注意力机制,说明加入成功。

http://www.lryc.cn/news/456773.html

相关文章:

  • SQL 自学:表别名的运用与对被联结表使用聚集函数
  • jmeter学习(2)变量
  • 【C#生态园】C#文件压缩库全面比较:选择最适合你的库
  • 【测试】接口测试与接口自动化
  • Android设置边框圆角
  • SpringBoot项目打成jar包,在其他项目中引用
  • 【音频可视化】通过canvas绘制音频波形图
  • 解决github每次pull push输入密码问题
  • Java重修笔记 第六十四天 坦克大战(十四)IO 流 - 标准输入输出流、InputStreamReader 和 OutputStreamWriter
  • prctl的函数和pthread_self函数
  • Vim 命令行模式下的常用命令
  • 【动态规划-最长递增子序列(LIS)】力扣2826. 将三个组排序
  • Elastic Stack--16--ES三种分页策略
  • [LeetCode] 315. 计算右侧小于当前元素的个数
  • 【hot100-java】二叉树展开为链表
  • 如何在在 YOLOv3模型中添加Attention机制
  • 单点登录Apereo CAS 7.1安装配置教程
  • windows C++-移除界面工作线程(一)
  • Qt小bug — LINK : fatal error LNK1158: 无法运行“rc.exe“
  • c++小游戏
  • k8s为什么用Calico
  • HashMap 和 Hashtable 有什么区别?
  • 【机器学习】深度学习、强化学习和深度强化学习?
  • fastadmin 多商户模式下侧边栏跳转路径BUG
  • java内置的四种函数式接口
  • 如何获取 uni-app 应用发布所需的证书、私钥与配置文件
  • TCP网络通信——多线程
  • 【exp报错注入】
  • 基于SpringBoot问卷调查系统小程序【附源码】
  • LLM - 配置 GraphRAG + Ollama 服务 构建 中文知识图谱