note3:YOLOV8添加SimAM注意力机制

以yolov8添加SimAM注意力机制为例

代码如下

  1. 导入(首先在nn.modules.conv.py端导入这部分代码)
import torch
import torch.nn as nn
import torch.nn.functional as F

class SimAM(nn.Module):
    def __init__(self, e_lambda=1e-4):
        super(SimAM, self).__init__()
        self.e_lambda = e_lambda

    def forward(self, x):
        # Input x shape: (batch_size, channels, height, width)
        b, c, h, w = x.size()

        # Calculate the mean of the input
        x_mean = x.mean(dim=(2, 3), keepdim=True)

        # Calculate the spatial energy
        energy = (x - x_mean).pow(2).sum(dim=(2, 3), keepdim=True)

        # Calculate the attention weights
        attention = (x - x_mean) / (energy + self.e_lambda)

        return x * attention

如下图导入代码

2、定义(也称register)

①在nn.modules.init.py文件里进行注册

②在nn.tasks.py文件里进入一个注册(修改三个部分)

elif m in {SimAM}:

    c2 = ch[f[1]]

    args = [c2, *args]

3、接下来就是修改yaml配置文件了(自己根据需求来调整SimAM的位置)

# 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

  - [-1, 1, SimAM, [1024]] # 10



# YOLOv8.0n head

head:

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]

  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4

  - [-1, 3, C2f, [512]]  # 13



  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]

  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3

  - [-1, 3, C2f, [256]]  # 16 (P3/8-small)



  - [-1, 1, Conv, [256, 3, 2]]

  - [[-1, 13], 1, Concat, [1]]  # cat head P4

  - [-1, 3, C2f, [512]]  # 19 (P4/16-medium)



  - [-1, 1, Conv, [512, 3, 2]]

  - [[-1, 10], 1, Concat, [1]]  # cat head P5

  - [-1, 3, C2f, [1024]]  # 22 (P5/32-large)



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

4、最后把yaml文件放到train.Py文件里就可以运行了

成功结果如下(可以看到SimAM已经成功导入进去啦!!!!完结撒花)

于是乎SimAM注意力机制就成功导入啦!其他即插即用的注意力机制也可以按照这个方法哦。

如果出现显示未定义等报错,大家一定要看看自己注册那几个步骤有没有遗漏。

祝各位视觉小伙伴们研学之路顺顺利利。

### SimAM注意力机制概述 SimAM是一种轻量级的注意力机制,在深度学习领域被广泛应用于图像分类、目标检测以及语义分割等任务中。它通过简单而高效的计算方式,增强了模型对重要特征的关注能力,同时减少了额外参数的数量和计算开销。 SimAM的核心思想在于利用局部区域内的相似性来衡量像素的重要性。具体而言,对于输入特征图中的每一个位置 \(i\),其对应的响应值可以通过比较该位置与其他所有位置之间的差异得到。这种设计使得SimAM能够捕捉到全局上下文信息并增强显著特征的表现力[^1]。 以下是SimAM的具体实现方法: ### 实现细节 #### 数学表达 给定一个大小为\(H \times W \times C\) 的特征图 \(X\) ,SimAM定义如下公式用于计算每个通道上的权重矩阵: \[ E_{ij} = 1 - \exp(-\lVert X_i - M_j\rVert_2^2), \] 其中, - \(M_j=\frac{1}{N}\sum_k^{N}(X_k)\),表示第j个窗口内所有元素均值; - \(E_{ij}\in[0,1]\), 表达的是当前点相对于邻域平均值偏离程度;当某一点越接近于周围邻居,则它的能量值会更趋近于零,反之则越大。 最终输出可以写成: \[ Y=X\times (1-E). \] #### PyTorch代码示例 下面提供了一个基于PyTorch框架下的SimAM模块实现版本: ```python import torch import torch.nn as nn class SimAM(nn.Module): def __init__(self, lambda_param=0.01): super(SimAM, self).__init__() self.lambda_param = lambda_param def forward(self, x): b, c, h, w = x.size() n = w * h - 1 # 计算空间维度上每一点与其余点的距离平方和 distance = (x.view(b,c,-1).unsqueeze(3) - x.view(b,c,-1).unsqueeze(2)).pow(2) # 排除自身距离项 mask = (torch.ones((h*w,h*w)) - torch.eye(h*w)).cuda().bool() distance = distance[:,:,:,mask].view(b,c,n) exp_distance = (-distance / (n ** .5 + 1e-8)).exp() norm_exp_dis = exp_distance.sum(dim=-1).clamp(min=self.lambda_param)**-.5 output = x * norm_exp_dis.unsqueeze(-1).unsqueeze(-1) return output ``` 此段代码实现了上述提到的能量函数及其后续操作过程,并将其封装成了可调用形式以便集成至其他神经网络结构当中去使用。 ### 性能优势 相比传统复杂的SENet或者CBAM等多分支架构的设计方案来说,SimAM仅需极少新增运算成本即可达到相近甚至超越的效果表现。因此非常适合资源受限环境下的移动端部署场景应用需求.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值