YOLOv8涨点技巧,添加SE注意力机制提升目标检测效果

news/2024/7/9 23:50:48 标签: YOLO, 目标检测, 人工智能

目录

论文地址

摘要

SE结构图

代码实现

Squeeze 

 Excitation

SE-Inception and SE-ResNet

yaml文件编写

完整代码分享

总结 


论文地址

http://openaccess.thecvf.com/content_cvpr_2018/papers/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.pdf

摘要

卷积神经网络建立在卷积运算的基础上,它通过在局部感受野内将空间和通道信息融合在一起来提取信息特征。为了提高网络的表示能力,最近的几种方法已经显示了增强空间编码的好处。在这项工作中,我们专注于通道关系,并提出了一种新颖的架构单元,我们将其称为“挤压和激励”(SE)块,它通过显式建模通道之间的相互依赖性来自适应地重新校准通道方面的特征响应。我们证明,通过将这些块堆叠在一起,我们可以构建在具有挑战性的数据集上具有极好的泛化能力的 SENet 架构。至关重要的是,我们发现 SE 模块能够以最小的额外计算成本为现有最先进的深度架构带来显着的性能改进。 SENets 构成了我们 ILSVRC 2017 分类提交的基础,该分类提交赢得了第一名,并将 top-5 错误率显着降低至 2.251%,与 2016 年获胜条目相比相对提高了约 25%。

我们通过引入一个新的架构单元(我们将其称为“挤压和激励”(SE)块)来研究架构设计的另一个方面 - 通道关系。我们的目标是通过显式建模网络卷积特征通道之间的相互依赖性来提高网络的表示能力。为了实现这一目标,我们提出了一种允许网络执行特征重新校准的机制,通过该机制它可以学习使用全局信息来选择性地强调信息丰富的特征并抑制不太有用的特征。

SE结构图
模型结构

SE 构建块的基本结构如图所示。对于任何给定的变换 Ftr : X → U, X ∈ RH′×W ′×C′ , U ∈ RH×W ×C ,,我们可以构建相应的 SE 块来执行特征重新校准。特征 U 首先通过挤压操作,该操作聚合跨空间维度 H × W 的特征图以生成通道描述符。该描述符嵌入了通道特征响应的全局分布,使得来自网络的全局感受野的信息能够被其较低层利用。接下来是激励操作,其中通过基于通道依赖性的自门机制为每个通道学习特定于样本的激活,控制每个通道的激励。然后对特征图 U 进行重新加权以生成 SE 块的输出,然后可以将其直接馈送到后续层中。

代码实现
class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)
class SEConv(nn.Module):
    # channel attentive convolution
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, reduction=16):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        self.se = SELayer(c2, reduction)

    def forward(self, x):
        residual = x
        out = self.bn(self.conv(x))
        out = self.se(out)
        out += residual
        return self.act(out)
class SEBottleneck(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = SEConv(c1, c_, 1, 1)
        self.cv2 = SEConv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

以上代码添加在 ultralytics\nn\modules\block.py文件中

Squeeze 

为了解决利用通道依赖性的问题,我们首先考虑输出特征中每个通道的信号。每个学习过滤器都使用局部感受野进行操作,因此变换输出 U 的每个单元都无法利用该区域之外的上下文信息。在感受野尺寸较小的网络较低层中,这个问题变得更加严重。为了缓解这个问题,我们建议将全局空间信息压缩到通道描述符中。这是通过使用全局平均池化生成通道统计数据来实现的。 

 Excitation

为了利用挤压操作中聚合的信息,我们接下来进行第二个操作,旨在完全捕获通道方面的依赖关系。为了实现这一目标,该函数必须满足两个标准:首先,它必须是灵活的(特别是,它必须能够学习通道之间的非线性交互),其次,它必须学习非互斥关系,因为我们将就像确保允许强调多个通道而不是单热激活。

SE-Inception and SE-ResNet

将 SE 块应用于 AlexNet和 VGGNet非常简单。 SE 块的灵活性意味着它可以直接应用于标准卷积之外的变换。为了说明这一点,我们通过将 SE 块集成到具有复杂设计的现代架构中来开发 SENet。对于非残差网络,例如Inception网络,通过将变换Ftr作为整个Inception模块来构造SE块。通过对架构中的每个此类模块进行此更改,我们构建了一个 SE-Inception 网络。此外,SE 块足够灵活,可以在残差网络中使用。图 3 描述了 SEResNet 模块的架构。这里,SE块变换Ftr被视为残差模块的非恒等分支。挤压和激励都在与恒等分支求和之前起作用。可以通过遵循类似的方案来构建与 ResNeXt、Inception-ResNet、MobileNet和 ShuffleNet集成的更多变体。

原始 Inception 模块和 SE-Inception 模块的架构
原始 Residual 模块和 SE-ResNet 模块的架构

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
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 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, C3SE, [256, False]]
  - [-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, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 21 (P5/32-large)

  - [[16, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)
完整代码分享

https://download.csdn.net/download/m0_67647321/88894601

总结 

SE注意力机制,这是一种新颖的架构单元,旨在通过使其能够执行动态通道特征重新校准来提高网络的表示能力。大量的实验证明了 SENet 的有效性,它在多个数据集上实现了最先进的性能。此外,它们还提供了对先前架构在通道特征依赖性建模方面的局限性的一些见解,我们希望这对于需要强区分性特征的其他任务可能有用。最后,SE 块引起的特征重要性可能有助于相关领域,例如用于压缩的网络修剪。


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

相关文章

MySql安全加固:配置不同用户不同账号禁止使用旧密码禁止MySql进程管理员权限

MySql安全加固:配置不同用户不同账号&禁止使用旧密码&禁止MySql进程管理员权限 1.1 检查是否配置不同用户不同账号1.2 检查是否禁止使用旧密码1.3 禁止MySql进程管理员权限 💖The Begin💖点点关注,收藏不迷路&#x1f496…

Node.js基础---Express中间件

1. 概念 1.什么是中间件 中间件(Middleware),特指业务流程的中间处理环节 2. Express 中间件的调用流程 当一个请求到达 Express 的服务器后,可以连续调用多个中间件,从而对这次请求进行预处理 3. Express 中间件格式 Express 的中间件&…

python获取综合信息(地震信息,天气,气象新闻,热点新闻,小时降雨量前30,气象预警)

Python 获取综合信息(地震信息、天气、气象新闻、热点新闻、小时降雨量前30、气象预警)介绍 一、背景介绍 随着互联网技术的发展,大量的数据和信息成为了人们日常生活中不可或缺的一部分。其中,关于地震、天气、气象新闻、热点新…

【GPU驱动开发】-GPU架构简介

前言 不必害怕未知,无需恐惧犯错,做一个Creator! GPU(Graphics Processing Unit,图形处理单元)是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 一、总体流程 应…

【react native】css踩坑记录

1、IOS上面opacity重叠失效 在 iOS 上,当两个具有相同背景色的元素重叠时,不透明度(opacity)较低的元素会显示在较高的元素上方。 所以考虑使用rgba的形式。 // 对于下面这种写法,如果存在container和activeIndicat…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况,并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS,那么 Executor 计算完后&a…

Java中Jenkins的应用简介

目录 Java中Jenkins的应用什么是Jenkins?Jenkins在Java开发中的应用示例代码和解决方案 Java中Jenkins的应用 Jenkins是一个流行的开源自动化服务器,可用于持续集成和持续交付。在Java开发中,Jenkins扮演着重要的角色,可以帮助团…

【Educoder数据挖掘实训】异常值检测-3σ法

【Educoder数据挖掘实训】异常值检测-3σ法 开挖! 这个异常值检测基于的是两点: 数据往往遵循正态分布在正态分布中, [ μ − 3 σ , μ 3 σ ] [\mu - 3\sigma, \mu 3\sigma] [μ−3σ,μ3σ]包含了正态分布中 99.74 % 99.74\% 99.74%的数…