• 【yolov系列:yolov7改进添加SIAM注意力机制】


    yolo系列文章目录



    一、SimAM注意力机制是什么?

    论文题目:SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks
    论文地址:http://proceedings.mlr.press/v139/yang21o/yang21o.pdf
    源代码:https://github.com/ZjjConan/SimAM
    不同于现有的通道/空域注意力模块,该模块无需额外参数为特征图推导出3D注意力权值。具体来说,基于著名的神经科学理论提出优化能量函数以挖掘神经元的重要性。进一步针对该能量函数推导出一种快速解析解并表明:该解析解仅需不超过10行代码即可实现。该模块的另一个优势在于:大部分操作均基于所定义的能量函数选择,避免了过多的结构调整。最后在不同的任务上对所提注意力模块的有效性、灵活性进行验证。
    在这里插入图片描述
    SIAM(Spatial Information Attention Mechanism,空间信息关注机制)是一种强大的注意力机制,已经在计算机视觉领域广泛应用于各种任务,如目标检测、图像分割和图像生成。与传统的注意力机制相比,SIAM具有更强的建模能力,能够更精确地捕捉输入数据中的关键信息。

    SIAM的核心思想在于,它引入了空间信息,使得模型能够在通道之间和空间位置之间建立更加准确的关联。这种机制不仅关注特征图中不同通道的特征之间的关系,还同时关注了它们在空间上的分布。这种全面的关注使得SIAM能够更好地挖掘特征之间的内在联系,从而提高了模型的性能。

    SIAM的关键特点包括:

    1. 多层次建模

    SIAM能够在多个层次上建模特征之间的关系。它可以同时关注低层次的细节特征和高层次的语义特征,使得模型能够更全面地理解输入数据。
    2. 通道间关系

    SIAM不仅关注每个通道的特征,还能够挖掘不同通道之间的关系。这种关注机制使得SIAM能够更好地学习特征之间的语义联系,提高了模型的表示能力。
    3. 空间信息关注

    SIAM引入了空间信息,关注特征在空间上的分布。这种关注机制使得模型能够更精确地定位目标区域,提高了目标检测和分割的准确性。
    4. 自适应性

    SIAM是自适应的,它能够根据输入数据的不同特点自动调整关注的重点。这种自适应性使得SIAM能够适用于各种不同类型的数据,提高了模型的泛化性能。

    SIAM的引入为计算机视觉领域带来了新的发展机遇。在实际应用中,研究人员们通过将SIAM嵌入到各种网络架构中,已经取得了一系列显著的成果。SIAM不仅在目标检测和分割任务中取得了出色的性能,还在其他领域,如自然语言处理和语音识别中得到了广泛应用。随着研究的不断深入,SIAM将为计算机视觉和人工智能领域带来更多创新和突破。它代表了注意力机制领域的新发展方向,为我们更好地理解和处理复杂数据提供了新的思路和方法。

    二、YOLOv7使用SimAM注意力机制

    1.在yolov7的models下面新建SimAM.py文件

    粘贴如下:

    import torch
    import torch.nn as nn
    
    class SimAM(torch.nn.Module):
        def __init__(self, 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.在common里面导入

    from models.SimAM import SimAM
    
    • 1

    然后去修改con_att
    在这里插入图片描述
    修改最后一行:

            self.att =SimAM()
    
    
    • 1
    • 2

    在这里插入图片描述
    SPCC也一样
    在这里插入图片描述
    最后一行换到siam即可。

    self.att =SimAM()
    
    • 1

    然后运行yaml即可。

    在concat部分加注意力机制也一样。
    进入models/common.py里面
    在这里插入图片描述
    复制加上concat_att

    
    class Concat_ATT(nn.Module):
        def __init__(self,channel, dimension=1):
            super(Concat_ATT,self).__init__()
            self.d = dimension
            self.att = SimAM(channel)
    
        def forward(self, x):
            return self.att(torch.cat(x, self.d))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在yolo里面加上

            elif m is Concat_ATT:
                c2 = sum([ch[x] for x in f])
                args = [c2]
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    总结

    siam注意力机制的添加和se注意力机制是一样的添加方法,可以根据自己的实际需求进行添加可以参考如下。
    yolov7改进添加SE注意力机制

  • 相关阅读:
    暑期JAVA学习(31)多线程的创建
    【华秋&Nidec尼得科】滑动开关CL-SB的应用
    Day08--自定义组件的properties属性
    每天一个知识点 - 如何快速熟悉后端项目
    npm 打包报错JavaScript heap out of memory(亲测可行)
    GPTZero:论文打假神器
    Win10下python的命令行启动和调用问题
    服务容错框架Sentinel入门
    R3LIVE源码解析(10) — R3LIVE中r3live_vio.cpp文件
    RStudion | 基础使用教程(初学者详细) | 基本设置 | 快捷操作 | 脚本运行 | 画图
  • 原文地址:https://blog.csdn.net/weixin_47869094/article/details/133640758