YOLOv8改进 | 注意力机制 | 轻量级的空间组增强模块SGE【全网独家】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录:《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进


卷积神经网络(CNN)通过收集复杂对象的分层和不同部分的语义子特征来生成特征表示。这些子特征通常在每个层的特征向量中以分组形式分布,代表各种语义实体。然而,这些子特征的激活往往受到相似模式和噪声背景的空间影响,导致错误的定位和识别。一个空间组增强(SGE)模块可以为每个语义组中每个空间位置生成一个注意力因子,从而调整每个子特征的重要性,以便每个组可以自主地增强其学习的表达并抑制可能的噪声。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转

目录

1. 原理

2. 将SGE添加到YOLOv8中

2.1 代码实现

2.2 更改init.py文件

2.3 新增yaml文件

2.4 注册模块

2.5 执行程序

3. 完整代码分享

4.GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:Spatial Group-wise Enhance: Improving Semantic Feature Learning in Convolutional Networks——点击即可跳转

官方代码:官方代码仓库——点击即可跳转

空间分组增强 (SGE) 模块旨在通过解决特征图中的空间错位和噪声来改进卷积神经网络 (CNN) 中的语义特征学习。以下是 SGE 模块的主要原理和机制:

分组特征

  • 特征沿卷积特征图的通道维度分组。这意味着将特征图分成几个组,每个组包含通道的子集。

注意机制

  • 在每个组中,根据全局特征和局部特征之间的相似性生成注意掩码。全局特征是组内所有特征的平均值,局部特征是该组内特定空间位置的特征。

  • 注意掩码用于缩放每个空间位置的特征向量,增强重要特征并抑制噪声。这有助于确保语义特征在图像的空间维度上分布良好且稳健。

轻量级设计

  • SGE 模块的设计具有计算效率,几乎不需要额外的参数或计算。这是通过使用点积和归一化等简单操作来生成注意掩码来实现的。

归一化和缩放

  • 计算基于相似性的系数(注意分数)后,对其进行归一化,以确保不同样本之间的缩放一致。这涉及减去平均值并除以每个组内系数的标准差。

  • 然后使用可学习的参数对归一化的分数进行缩放和移位,确保网络可以在训练期间灵活调整 SGE 模块的影响。

性能提升

  • 事实证明,SGE 模块可以提高各种 CNN 架构在图像识别任务上的性能。它可以提高 ImageNet 基准测试中的 Top-1 准确率,并提高 COCO 基准测试中物体检测任务的平均准确率 (AP)。

总体而言,SGE 模块增强了每个组内语义特征的空间分布,从而使 CNN 中的特征表示更加准确和稳健。

2. 将SGE添加到YOLOv8中

2.1 代码实现

关键步骤一:将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/block.py中,并在该文件的__all__中添加“SpatialGroupEnhance”

from torch.nn import init

class SpatialGroupEnhance(nn.Module):
    def __init__(self, groups=8):
        super().__init__()
        self.groups = groups
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.weight = nn.Parameter(torch.zeros(1, groups, 1, 1))
        self.bias = nn.Parameter(torch.zeros(1, groups, 1, 1))
        self.sig = nn.Sigmoid()
        self.init_weights()

    def init_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                init.kaiming_normal_(m.weight, mode='fan_out')
                if m.bias is not None:
                    init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                init.constant_(m.weight, 1)
                init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                init.normal_(m.weight, std=0.001)
                if m.bias is not None:
                    init.constant_(m.bias, 0)

    def forward(self, x):
        b, c, h, w = x.shape
        x = x.view(b * self.groups, -1, h, w)  # bs*g,dim//g,h,w
        xn = x * self.avg_pool(x)  # bs*g,dim//g,h,w
        xn = xn.sum(dim=1, keepdim=True)  # bs*g,1,h,w
        t = xn.view(b * self.groups, -1)  # bs*g,h*w

        t = t - t.mean(dim=1, keepdim=True)  # bs*g,h*w
        std = t.std(dim=1, keepdim=True) + 1e-5
        t = t / std  # bs*g,h*w
        t = t.view(b, self.groups, h, w)  # bs,g,h*w

        t = t * self.weight + self.bias  # bs,g,h*w
        t = t.view(b * self.groups, 1, h, w)  # bs*g,1,h*w
        x = x * self.sig(t)
        x = x.view(b, c, h, w)
        return x

SGE 模块的核心思想是在每个特征组内部进行空间增强,以提升特征学习的精度和鲁棒性。 具体步骤如下

  1. 特征分组: 将特征图沿通道维度分成多个组,每个组包含代表特定语义的子特征。

  2. 全局特征提取: 对每个组内的所有特征进行全局平均池化,得到一个全局特征向量,代表该组学习的语义信息。

  3. 注意力权重生成: 计算全局特征向量与组内每个位置的特征向量之间的相似度,生成注意力权重向量。相似度越高,注意力权重越大。

  4. 特征增强: 将注意力权重向量通过 sigmoid 函数进行非线性变换,并与原始特征向量相乘,得到增强后的特征向量。 SGE 模块的优点

  • 轻量级: 仅引入少量参数,几乎没有额外的计算量。

  • 高效: 有效提升特征学习的精度和鲁棒性,尤其是在识别具有高级语义的区域时。

  • 可解释性强: 通过可视化注意力权重,可以直观地理解每个组学习的语义信息。

SGE 模块在图像分类和目标检测任务中都取得了显著的性能提升,证明了其在实践中的有效性

2.2 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数

然后在下面的__all__中声明函数

2.3 新增yaml文件

关键步骤三:在 \ultralytics\ultralytics\cfg\models\v8下新建文件 yolov8_SGE.yaml并将下面代码复制进去

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [ 0.33, 0.25, 1024 ]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [ -1, 1, Conv, [ 64, 3, 2 ] ]  # 0-P1/2
  - [ -1, 1, Conv, [ 128, 3, 2 ] ]  # 1-P2/4
  - [ -1, 3, C2f, [ 128, True ] ]
  - [ -1, 1, Conv, [ 256, 3, 2 ] ]  # 3-P3/8
  - [ -1, 6, C2f, [ 256, True ] ]
  - [ -1, 1, Conv, [ 512, 3, 2 ] ]  # 5-P4/16
  - [ -1, 6, C2f, [ 512, True ] ]
  - [ -1, 1, Conv, [ 1024, 3, 2 ] ]  # 7-P5/32
  - [ -1, 3, C2f, [ 1024, True ] ]
  - [ -1, 1, SPPF, [ 1024, 5 ] ]  # 9

# YOLOv8.0n head
head:
  - [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]
  - [ [ -1, 6 ], 1, Concat, [ 1 ] ]  # cat backbone P4
  - [ -1, 3, C2f, [ 512 ] ]  # 12

  - [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]
  - [ [ -1, 4 ], 1, Concat, [ 1 ] ]  # cat backbone P3
  - [ -1, 3, C2f, [ 256 ] ]  # 15 (P3/8-small)

  - [ -1, 1, Conv, [ 256, 3, 2 ] ]
  - [ [ -1, 12 ], 1, Concat, [ 1 ] ]  # cat head P4
  - [ -1, 3, C2f, [ 512 ] ]  # 18 (P4/16-medium)
  - [ -1, 1, SpatialGroupEnhance, [ 512 ] ]

  - [ -1, 1, Conv, [ 512, 3, 2 ] ]
  - [ [ -1, 9 ], 1, Concat, [ 1 ] ]  # cat head P5
  - [ -1, 3, C2f, [ 1024 ] ]  # 21 (P5/32-large)
  - [ -1, 1, SpatialGroupEnhance, [ 1024 ] ]

  - [ [ 15, 19, 23 ], 1, Detect, [ nc ] ]  # Detect(P3, P4, P5)

温馨提示:因为本文只是对yolov8基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
 
# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
 
# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
 
# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
 
# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.4 注册模块

关键步骤四:在parse_model函数中进行注册,在parse_model函数中添加下面内容

elif m is SpatialGroupEnhance:
            c1, c2 = ch[f], args[0]
            if c2 != nc:  # if c2 not equal to number of classes (i.e. for Classify() output)
                c2 = make_divisible(min(c2, max_channels) * width, 8)
            args = [c1, *args[1:]]

2.5 执行程序

在train.py中,将model的参数路径设置为yolov8_SGE.yaml的路径

建议大家写绝对路径,确保一定能找到

from ultralytics import YOLO
 
# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
 
model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_SGE.yaml')  # build from YAML and transfer weights
 
# Train the model
model.train(device = [3], batch=16)

🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享

https://pan.baidu.com/s/1oy-hZrMjOPIScMxpQpCeFg?pwd=yfbe

提取码: yfbe 

4.GFLOPs

关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution

未改进的YOLOv8nGFLOPs

改进后的GFLOPs

5. 进阶

可以与其他的注意力机制或者损失函数等结合,进一步提升检测效果

6. 总结

空间分组增强 (SGE) 模块通过解决特征图中的空间错位和噪声问题,改进了卷积神经网络中的语义特征学习。它沿通道维度对特征进行分组,并在每个组中使用注意机制,根据全局特征和局部特征之间的相似性生成注意掩码。这些掩码增强了重要特征,同时抑制了噪声,确保了语义特征的稳健性和分布性。SGE 模块具有计算效率,只需要极少的附加参数,并使用可学习的参数对注意力分数进行归一化和缩放。这种方法提高了 CNN 在图像识别和物体检测任务上的性能,提高了准确率和精确度。

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

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

相关文章

python项目运营时,出现,redis用户密码未设置问题,排查解决

一、问题描述: 在本地化开发过程中,pythonDjango运行项目,redis为本地windows版本,在设置过密码后,仍然会出现pythonDjango运行项目,终端日志显示如下: INFO info信息 ERROR redis数据库异常[&…

内网安全【4】SSH隧道技术

1.四大隧道协议 (1)SMB协议 判断:445端口是否开放 (2)ICMP协议 判断:ping命令能通说明使用icmp协议 (3)DNS协议 判断:nslookup www.baidu.com 属于UDP iodine工作原理是 ,通过TAP虚拟网卡,在服…

大厂面试经验分享,小白如何在面试中脱颖而出

前言 毕业季,对于每一位即将步入社会的学子来说,都是一个充满挑战和机遇的时刻。作为我的一位好朋友也是好学长,他刚刚在一家顶尖科技公司斩获了他梦寐以求的职位。他深知求职路上的艰辛,因此打算把自己的经验分享给大家&#xf…

一键掌握多渠道推广效果!Xinstall超级渠道功能,让你的App推广更高效

在App运营的大潮中,如何高效、精准地推广App,成为每一位运营者关注的焦点。传统的推广方式,如地推、代理、分销、广告等,虽然能够带来一定的用户增长,但如何衡量推广效果、如何与合作伙伴结算、如何管理下属渠道等问题…

Java程序递归及mybatis递归查询

之前项目组有个需求,定时同步机构的信息。已知三方接口由于返回数据量很大,所以最后需要三方提供一个可根据机构编号获取当前机构及子机构信息的接口。而不是一次性返回全部机构信息! 由于这次需求也用到了递归,所以记录下&#…

2024.6.26 刷题总结

2024.6.26 **每日一题** 526.优美的排列,该题考察的是状压dp的知识,用一个n位的二进制数表示排列中的数被选取的情况,若为1,则表示该位被选取,若为0,则表示该位没有被选取,用一个数组来存储当前…

【Vue】集成富文本编辑器

这文章使用的是wangeditor插件&#xff0c;官网地址&#xff1a;wangEditor&#xff0c;这个比较简单 安装 npm i wangeditor --save 使用 <div id"editor"></div>import E from "wangeditor"const editor new E("#editor") e…

兰州市红古区市场监管管理局调研食家巷品牌,关注细节,推动进步

近日&#xff0c;兰州市红古区市场监管管理局临平凉西北绿源电子商务有限公司进行了深入视察&#xff0c;为企业发展带来了关怀与指导。 食家巷品牌作为平凉地区特色美食的代表之一&#xff0c;一直以来凭借其纯手工工艺和独特的风味&#xff0c;在市场上占据了一席之地。领导…

charls抓包工具 mumu模拟器抓包apk

1.先安装mumu 官网添加链接描述 2.配置 设置&#xff0c;点进互联网&#xff0c;点编辑&#xff0c;选择手动代理 主机名写自己电脑的ip地址&#xff0c;端口随便&#xff0c;只要不被占用&#xff0c;一般参考其他人都是8888 3.下载charls 参考这个添加链接描述 先官网…

一文详解:什么是企业邮箱?最全百科

什么是企业邮箱&#xff1f;企业邮箱即绑定企业自有域名作为邮箱后缀的邮箱&#xff0c;是企业用于内部成员沟通和客户沟通的邮箱系统。 一、企业邮箱概念拆解 1.什么是企业邮箱&#xff1f; 企业邮箱即使用企业域名作为后缀的邮箱系统。它不仅提供专业的电子邮件收发功能&a…

How to persist LangChain conversation memory (save and load)

题意&#xff1a;如何持久化 LangChain 对话记忆&#xff08;保存和加载&#xff09; 问题背景&#xff1a; Im creating a conversation like so: 我正在创建一个对话&#xff0c;如下所示&#xff1a; llm ChatOpenAI(temperature0, openai_api_keyOPENAI_API_KEY,…

大学生毕业季,寄物流快递避雷指南

随着毕业季的来临&#xff0c;大学生们纷纷开始整理自己的行李&#xff0c;准备离开校园&#xff0c;踏入社会。 在这个过程中&#xff0c;寄送快递成为了一个不可或缺的环节。然而&#xff0c;在寄送快递的过程中&#xff0c;如果不注意一些细节&#xff0c;很容易遭遇各种“…

【别再用Excel了!】这款免费可视化工具能帮你轻松提升效率

现代数据分析和展示的需求已经远远超出了传统工具的能力&#xff0c;尤其是在需要快速、直观和高效地处理复杂数据的情况下。山海鲸可视化通过其强大的功能和易用性&#xff0c;成为了设计师以及各类新手用户的理想选择。下面我就以一个可视化设计师的角度&#xff0c;和大家简…

金升阳电源被制裁,广州顶源电源模块可以完美替换

广州顶源电子科技股份有限公司,座落于国家高新技术开发区---广州科学城&#xff0c;是一家集研发、生产、销售及服务于一体的DC-DC&#xff0c;AC-DC电源的生产厂家。 公司通过了IATF16949汽车认证及ISO9001:2015质量管理体系认证。拥有专家级研发团队&#xff0c;产品研发经过…

Python中20个鲜为人知的字符串函数

目录 1. capitalize() 2. casefold() 3. join() 和 split() 4. strip(), lstrip(), rstrip() 5. replace() 6. format() 7. enumerate() 8. isalpha(), isdigit(), isalnum() 9. startswith(), endswith() 10. center() 11. count() 12. find(), index() 13. make…

ATFX汇市:澳大利亚5月CPI大增0.4百分点,降息预期显著降温

ATFX汇市&#xff1a;据澳大利亚统计局数据&#xff0c;澳大利亚5月加权CPI年率为4%&#xff0c;高于前值3.6%&#xff0c;高于预期3.8%&#xff0c;显示出澳大利亚通胀率颇具韧性。5月份数据公布之前&#xff0c;月度CPI年率平均波幅不足0.1个百分点&#xff0c;呈现出横盘震荡…

2024年高级会计职称题库。高效备考!!!

61.下列各项中&#xff0c;属于对会计职业道德进行自律管理与约束的机构是&#xff08;&#xff09;。 A.纪律检查部门 B.财政部门 C.会计行业组织 D.其他组织 答案&#xff1a;C 62.下列各项中&#xff0c;对会计职业行为自我约束和自我控制的部门主要是&#xff08;&am…

光伏储能为什么变得那么受欢迎?

在当今这个追求可持续发展和清洁能源的时代&#xff0c;光伏储能技术逐渐崭露头角&#xff0c;并成为了能源领域的热门话题。其受欢迎程度不断攀升&#xff0c;背后有着多方面的原因。光伏储能技术的优点众多&#xff0c;涵盖了多个方面&#xff0c;以下是关于其安全、寿命等关…

数学学习与研究杂志社《数学学习与研究》杂志社2024年第6期目录

课改前沿 基于核心素养的高中数学课堂教学研究——以“直线与圆、圆与圆的位置关系”为例 张亚红; 2-4 核心素养视角下初中生数学阅读能力的培养策略探究 贾象虎; 5-7 初中数学大单元教学实践策略探索 耿忠义; 8-10《数学学习与研究》投稿&#xff1a;cn7kantougao…

【精品方案】智能制造之路(93页PPT)

引言&#xff1a;智能制造之路&#xff1a;革新制造业的引领之旅 随着科技的迅猛发展&#xff0c;特别是人工智能、物联网、大数据等技术的不断进步&#xff0c;制造业正迎来一场深刻的变革。智能制造&#xff0c;作为这场变革的核心&#xff0c;正逐步成为推动产业升级和转型发…