• 零基础教程:Yolov5模型改进-添加13种注意力机制


    1.准备工作

    先给出13种注意力机制的下载地址:

    https://github.com/z1069614715/objectdetection_script

    2.加入注意力机制

    1.以添加SimAM注意力机制为例(不需要接收通道数的注意力机制)

    1.在models文件下新建py文件,取名叫SimAM.py

    将以下代码复制到SimAM.py文件种

    1. import torch
    2. import torch.nn as nn
    3. class SimAM(torch.nn.Module):
    4. # 不需要接收通道数输入
    5. def __init__(self, e_lambda=1e-4):
    6. super(SimAM, self).__init__()
    7. self.activaton = nn.Sigmoid()
    8. self.e_lambda = e_lambda
    9. def __repr__(self):
    10. s = self.__class__.__name__ + '('
    11. s += ('lambda=%f)' % self.e_lambda)
    12. return s
    13. @staticmethod
    14. def get_module_name():
    15. return "simam"
    16. def forward(self, x):
    17. b, c, h, w = x.size()
    18. n = w * h - 1
    19. x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2)
    20. y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5
    21. return x * self.activaton(y)

    2.在yolo.py头部导入SimAM这个类

    3.然后复制yolov5s.yaml到同级目录,取名为yolov5s-SimAM.yaml

    在某一层添加注意力机制

    [from,number,module,args]

    注意:!!!!!!!!!!!!!!!!!!!

    添加完一层注意力机制之后,会对后面层数造成影响,记得在检测头那里要改层数

    2.添加SE注意力机制(需要接收通道数的注意力机制)

    1.新建SE.py

    1. import numpy as np
    2. import torch
    3. from torch import nn
    4. from torch.nn import init
    5. class SEAttention(nn.Module):
    6. def __init__(self, channel=512,reduction=16):
    7. super().__init__()
    8. self.avg_pool = nn.AdaptiveAvgPool2d(1)
    9. self.fc = nn.Sequential(
    10. nn.Linear(channel, channel // reduction, bias=False),
    11. nn.ReLU(inplace=True),
    12. nn.Linear(channel // reduction, channel, bias=False),
    13. nn.Sigmoid()
    14. )
    15. def init_weights(self):
    16. for m in self.modules():
    17. if isinstance(m, nn.Conv2d):
    18. init.kaiming_normal_(m.weight, mode='fan_out')
    19. if m.bias is not None:
    20. init.constant_(m.bias, 0)
    21. elif isinstance(m, nn.BatchNorm2d):
    22. init.constant_(m.weight, 1)
    23. init.constant_(m.bias, 0)
    24. elif isinstance(m, nn.Linear):
    25. init.normal_(m.weight, std=0.001)
    26. if m.bias is not None:
    27. init.constant_(m.bias, 0)
    28. def forward(self, x):
    29. b, c, _, _ = x.size()
    30. y = self.avg_pool(x).view(b, c)
    31. y = self.fc(y).view(b, c, 1, 1)
    32. return x * y.expand_as(x)

    2.修改yolo.py

    添加这两行代码

    1. elif m is SEAttention:
    2. args = [ch[f]]

    3.models下新建yolov5s-SE.yaml

    1. # YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
    2. # Parameters
    3. nc: 80 # number of classes coco数据集的种类
    4. depth_multiple: 0.33 # model depth multiple 用来控制模型的大小 与每一层的number相乘再取整
    5. width_multiple: 0.50 # layer channel multiple 与每一层的channel相乘 例如64*0.5、128*0.5
    6. # anchors指的是我们使用的anchor的大小,anchor分为3组,每组3个
    7. anchors:
    8. - [10,13, 16,30, 33,23] # P3/8 第一组anchor作用在feature,feature大小是原图的1/8的stride大小。anchor比较小。因为是浅层的特征,感受野比较小。
    9. - [30,61, 62,45, 59,119] # P4/16
    10. - [116,90, 156,198, 373,326] # P5/32
    11. # YOLOv5 v6.0 backbone
    12. backbone:
    13. # [from, number, module, args] args:参数 arg是argument(参数)的缩写,是每一层输出的一个参数
    14. [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 arguments 输出通道数为64(也是卷积核的个数),Conv卷积核的大小为6*6 stride=2 padding=2 此时特征图大小为原图的1/2
    15. [-1, 1, Conv, [128, 3, 2]], # 1-P2/4
    16. [-1, 3, C3, [128]],
    17. [-1, 1, Conv, [256, 3, 2]], # 3-P3/8
    18. [-1, 6, C3, [256]],
    19. [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
    20. [-1, 9, C3, [512]],
    21. [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
    22. [-1, 3, C3, [1024]],
    23. [-1, 1, SPPF, [1024, 5]], # 9 对于SPP(不同尺度特征层的融合)的改进-SPPF
    24. ]
    25. # YOLOv5 v6.0 head bottleneck(除了检测以外的部分)+detect 瓶颈+检测
    26. head:
    27. [[-1, 1, Conv, [512, 1, 1]],
    28. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    29. [[-1, 6], 1, Concat, [1]], # cat backbone P4
    30. [-1, 1,SEAttention, [16]], # ----------这一层添加了SEAttention注意力机制,此注意力的通道数512也不用写在这里,[]里面写除了通道数以外的其他参数:reduction=16
    31. [-1, 3, C3, [512, False]], # 14 -------从原来的13层改成14层
    32. [-1, 1, Conv, [256, 1, 1]],
    33. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    34. [[-1, 4], 1, Concat, [1]], # cat backbone P3
    35. [-1, 3, C3, [256, False]], # 17 (P3/8-small)
    36. [-1, 1, Conv, [256, 3, 2]],
    37. [[-1, 15], 1, Concat, [1]], # cat head P4 ------这里从原来的14改成15
    38. [-1, 3, C3, [512, False]], # 20 (P4/16-medium)
    39. [-1, 1, Conv, [512, 3, 2]],
    40. [[-1, 10], 1, Concat, [1]], # cat head P5 ------注意力机制加在10层之后,所以不会对第10层有影响
    41. [-1, 3, C3, [1024, False]], # 23 (P5/32-large)
    42. [[18, 21, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) ----从原来的17,20,23改成18,21,24
    43. ]

    注意:添加了SEAttention注意力机制,此注意力的通道数512也不用写在这里,[]里面写除了通道数以外的其他参数:reduction=16

  • 相关阅读:
    姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。
    主动发现系统稳定性缺陷:混沌工程 | 京东云技术团队
    运营商大数据精准营销获客?
    在Winform界面中使用自定义控件,丰富界面的效果处理
    使用ffmpeg解码音频sdl(push)播放
    深入探索JVM高效并发 — Java内存模型(三) 原子性、可见性与有序性
    Linux操作系统——硬盘的挂载和卸载
    【嵌入式模块】再探ESP8266,保姆级教程
    springboot+mybatis-plus实现多数据源(从数据库加载多数据源)
    深度观察2024中国系统架构师大会(SACC)
  • 原文地址:https://blog.csdn.net/pyscl01/article/details/133268815