免费阅读篇 | 芒果YOLOv8改进109:注意力机制SimAM:用于卷积神经网络的简单、无参数注意力模块

免费阅读篇|芒果YOLOv8改进109:注意力机制篇SimAM:用于卷积神经网络的简单、无参数注意力模块

💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可

该专栏完整目录链接: 芒果YOLOv8深度改进教程

该篇博客为免费阅读内容,直接改进即可🚀🚀🚀


1. SimAM论文

在这里插入图片描述

在本文中,我们提出了一个概念简单但非常有效的卷积神经网络(ConvNets)注意力模块。与现有的通道和空间注意力模块相比,我们的模块在不向原始网络添加参数的情况下推断图层中特征图的 3D 注意力权重。具体来说,我们基于一些著名的神经科学理论,并提出优化能量函数以找到每个神经元的重要性。我们进一步推导了能量函数的快速闭式解,并证明该解可以在不到十行代码中实现。该模块的另一个优点是,大多数算子都是根据定义的能量函数的解来选择的,避免了过多的结构调整工作。对各种可视化任务的定量评估表明,所提模块在提高许多ConvNets的表示能力方面具有灵活性和有效性。

在这里插入图片描述

具体细节可以去看原论文:http://proceedings.mlr.press/v139/yang21o.html


2. YOLOv8 核心代码改进部分

2.1 核心新增代码

首先在ultralytics/nn/modules文件夹下,创建一个 simam.py文件,新增以下代码

import torch
import torch.nn as nn


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.2 修改部分

在ultralytics/nn/modules/init.py中导入 定义在 simam.py 里面的模块

from .simam import SimAM

'SimAM' 加到 __all__ = [...] 里面

第一步:
ultralytics/nn/tasks.py文件中,新增

from ultralytics.nn.modules import SimAM

然后在 在tasks.py中配置
找到

        elif m is nn.BatchNorm2d:
        args = [ch[f]]

在这句上面加一个

        elif m is SimAM:
            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, c2, *args[1:]]

2.3 YOLOv8-simam网络配置文件

新增YOLOv8-simam.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, 3, SimAM, [1024]]
  - [-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, 13], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 18 (P4/16-medium)

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

  - [[16, 19, 22], 1, Detect, [nc]]  # Detect(P3, P4, P5)

2.4 运行代码

直接替换YOLOv8-simam.yaml 进行训练即可

到这里就完成了这篇的改进。

改进说明

这里改进是放在了主干后面,如果想放在改进其他地方,也是可以的。直接新增,然后调整通道,配齐即可,如果有不懂的,可以添加博主联系方式,如下


🥇🥇🥇
添加博主联系方式:

友好的读者可以添加博主QQ: 2434798737, 有空可以回答一些答疑和问题

🚀🚀🚀


参考

https://github.com/ultralytics/ultralytics

最近更新

  1. TCP协议是安全的吗?

    2024-03-16 07:28:03       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-16 07:28:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-16 07:28:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-16 07:28:03       18 阅读

热门阅读

  1. 【物联网】Modbus 协议简介

    2024-03-16 07:28:03       18 阅读
  2. STM32移植SFUD

    2024-03-16 07:28:03       21 阅读
  3. STM32利用AES加密数据、解密数据

    2024-03-16 07:28:03       18 阅读
  4. 项目中如何排查jvm问题

    2024-03-16 07:28:03       17 阅读
  5. 1688中国站获得联系方式 API 返回值

    2024-03-16 07:28:03       20 阅读
  6. Flask学习(一):flask程序入口(hello world)

    2024-03-16 07:28:03       18 阅读
  7. CSP 202209-2 何以包邮

    2024-03-16 07:28:03       18 阅读
  8. SQL zoo(zh)习题记录Ⅰ

    2024-03-16 07:28:03       20 阅读
  9. 服务器生产环境问题解决思路

    2024-03-16 07:28:03       19 阅读