YOLOv5添加注意力机制

news/2024/7/11 0:01:57 标签: YOLO, 深度学习, 机器学习

添加SE注意力机制

  • 第一步 添加代码-SE类-models/common.py
  • 第二步 添加注意力关键词-models/yolo.py
  • 第三步 创建配置文件-models/yolov5s_SE.yaml
  • 第四步 修改读取配置-train.py

第一步 添加代码-SE类-models/common.py

进入models/common.py文件,这个文件里面包含了各个模块,包含了C3,SPP等,yolov5的训练代码也将会在这个文件里面读取模块的类来构建网络,因此我们选择在这里添加注意力机制的类。
将如下的代码,添加在common.py的最下面:

# SE
class SE(nn.Module):                                   #SE注意力模块(通道注意力机制)
    def __init__(self, c1, c2, ratio=16):
        super(SE, self).__init__()
        #c*1*1
        self.avgpool = nn.AdaptiveAvgPool2d(1)
        self.l1 = nn.Linear(c1, c1 // ratio, bias=False)
        self.relu = nn.ReLU(inplace=True)
        self.l2 = nn.Linear(c1 // ratio, c1, bias=False)
        self.sig = nn.Sigmoid()
    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avgpool(x).view(b, c)
        y = self.l1(y)
        y = self.relu(y)
        y = self.l2(y)
        y = self.sig(y)
        y = y.view(b, c, 1, 1)
        return x * y.expand_as(x)

第二步 添加注意力关键词-models/yolo.py

在这里插入图片描述
在这个位置添加注意力机制的关键词,这个函数的作用是读取yaml文件中的backbone与head关键词中的模块,因为要想我们一会添加在配置文件中的注意力模块能够顺利的加载到模型Model类的实例化对象中,我们需要加入SE关键词(可以自定义想要的名字,这个随意,不一定要是SE,但是要和后面我们加入的类名称一致)。

这里我们也可以用另外一种方式添加,如下所示:
在这里插入图片描述
两者方式二选一,存在一种即可。

第三步 创建配置文件-models/yolov5s_SE.yaml

在models下面创建一个新的配置文件,我这里以yolov5s为例,在里面加入注意力机制,并且我加入的是SE注意力机制,因此我命名为yolov5s_SE.yaml。复制一下路径下的yolov5s的配置文件进去,贴出我加入注意力机制之后的配置文件:

# YOLOv5 🚀 by Ultralytics, GPL-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
  ]

# 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]],  # 13

   [-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]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
   [-1, 1, SE, [1024]],

   [[17, 20, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

可以在backbone中添加注意力机制,也可以在head中添加,这里我将注意力机制加到了第三个检测头的最后一层(我在backbone中添加之后的训练效果并不好):
在这里插入图片描述
这里需要注意的一个细节是,添加了这一层之后,后面的层在调用时需要进行加1的操作,不然就彻底混乱了,因此我们需要将最后的detect中的第三个检测头的层数改一下:
在这里插入图片描述

第四步 修改读取配置-train.py

将这里改成我们刚才创建的模型配置文件的路径:
在这里插入图片描述
然后点击训练即可,在输出日志中可以查看网络的结构,如果看到我们刚才添加的模块,说明添加成功了。
在这里插入图片描述


http://www.niftyadmin.cn/n/5004853.html

相关文章

代码随想录算法训练营day57 | LeetCode 647. 回文子串 516. 最长回文子序列

647. 回文子串(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台) 思路:难处在于定义dp[i][j]的表示,确定了dp[i][j]代表的含义就好办了,dp[i][j]代表以下标i开始、下标j…

golang编译go build -ldflags -s -w的 解释

go build -ldflags "-s -w" 是一个 Go 语言的构建命令,其中使用了 -ldflags 参数来传递一些额外的链接器标志。 这个命令中,-ldflags "-s -w" 传递了两个标志: -s:该标志会禁止生成可执行文件中的符号表信息&…

数据库误修改后的数据恢复

一不小心将数据库数据修改了,而且回滚无效,于是去尝试各种方法恢复数据 查询到修改时间点之前的数据 恢复数据 恢复数据库被修改数据的流程及代码,这里被修改的表是AUTH_USER,实际应用填写对应表名。 -- 通过时间恢复删除且已提交的数据-- 1…

复制粘贴是怎么实现的

在上面的代码中,command 和 select 是自定义的函数。它们的作用如下: 实现复制粘贴的思路: 创建一个 textarea 标签将 textarea 移出可视区域给这个 textarea 赋值将这个 textarea 标签添加到页面中调用 textarea 的 select 方法调用 docum…

【文末送书】全栈开发流程——后端连接数据源(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

肖sir__设计测试用例方法之经验测试方法09_(黑盒测试)

设计测试用例方法之经验测试方法 一、经验的测试技术 (1)基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例 &#xff0…

武汉旅游地

原文链接:https://www.cnblogs.com/MrFlySand/p/17678215.html 发表时间:2023年9月4日21:59:14 更新时间:2023年9月4日21:59:06 东湖飞鸟世界(动物园) 地址:东湖风景区沿湖大道20号时间:9:00-17:00交通:地铁…

编写OpenCL程序的基本步骤

opencl pyopencl OpenCL-Headers OpenCL(全称为Open Computing Langugae,开放运算语言)是第一个面向异构系统(此系统中可由CPU,GPU或其它类型的处理器架构组成)的并行编程的开放式标准。 它是跨平台的。 OpenCL由两部分组成,一是用于编写…