首页 > 其他分享 >【YOLOv11改进 - 注意力机制】LSKA(Large Separable Kernel Attention):大核分离卷积注意力模块

【YOLOv11改进 - 注意力机制】LSKA(Large Separable Kernel Attention):大核分离卷积注意力模块

时间:2024-11-01 09:21:18浏览次数:1  
标签:Separable Kernel nn dim 卷积 self 注意力 Conv2d size

YOLOv11目标检测创新改进与实战案例专栏

点击查看文章目录: YOLOv11创新改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

点击查看专栏链接: YOLOv11目标检测创新改进与实战案例

在这里插入图片描述
@

目录

介绍

image-20240527212823405

摘要

带有大卷积核注意力(LKA)模块的视觉注意网络(VAN)在一系列基于视觉的任务上表现出色,超越了视觉Transformer(ViTs)。然而,这些LKA模块中的深度卷积层随着卷积核尺寸的增加,会导致计算和内存占用的二次增长。为了解决这些问题并使在VAN的注意力模块中使用超大卷积核成为可能,我们提出了一种大可分卷积核注意力模块家族,称为LSKA。LSKA将深度卷积层的二维卷积核分解为串联的水平和垂直一维卷积核。与标准LKA设计不同,这种分解方法使得可以直接在注意力模块中使用带有大卷积核的深度卷积层,而不需要额外的模块。我们证明了在VAN中使用的LSKA模块可以在计算复杂度和内存占用更低的情况下,达到与标准LKA模块相当的性能。我们还发现,随着卷积核尺寸的增加,提出的LSKA设计使VAN更倾向于关注物体的形状而不是纹理。此外,我们还在五种受损版本的ImageNet数据集上,对VAN、ViTs以及最新的ConvNeXt中的LKA和LSKA模块进行了稳健性基准测试,这些数据集在以往的工作中很少被探索。我们广泛的实验结果表明,随着卷积核尺寸的增加,提出的VAN中的LSKA模块显著减少了计算复杂度和内存占用,同时在对象识别、对象检测、语义分割和稳健性测试上表现优于ViTs、ConvNeXt,并与VAN中的LKA模块性能相当。代码可在 https://github.com/StevenLauHKHK/Large-Separable-Kernel-Attention 获得。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

Large Separable Kernel Attention (LSKA)是一种新颖的注意力模块设计,旨在解决Visual Attention Networks (VAN)中使用大内核卷积时所面临的计算效率问题。LSKA通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,从而实现了对大内核的直接使用,无需额外的模块。

概述

  1. 基本设计

    • LSKA将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核。
    • 这种分解设计使得LSKA可以直接使用深度卷积层的大内核,无需额外的模块或计算。
  2. 计算效率

    • LSKA的设计降低了参数数量的增长,从而降低了计算复杂度和内存占用。
    • 通过级联1-D卷积核的方式,LSKA在处理大内核时能够保持高效性能。
  3. 形状和纹理偏好

    • LSKA设计使得模块更加偏向于对象的形状而非纹理。
    • 这种偏好有助于提高模型对对象形状的学习能力,从而提高模型的鲁棒性和泛化能力。

总的来说,LSKA通过巧妙的卷积核分解设计,实现了对大内核的高效利用,同时保持了模型的性能和鲁棒性。其技术原理使得LSKA成为一种有潜力的注意力模块设计,可以在VAN等视觉任务中发挥重要作用。

与LKA-trivial、LSKA-trivial和LKA的比较:

image-20240527213758579

  • LKA-trivial是一种简单的注意力模块设计,使用深度卷积和大内核,但会导致参数数量的二次增长。
  • LSKA-trivial是对LKA-trivial的改进,通过可分离卷积核的级联降低了参数数量的增长,提高了计算效率。
  • LKA是原始的Large Kernel Attention设计,包括标准深度卷积、扩张深度卷积和1x1卷积,但在处理大内核时会带来计算和内存开销。
  • LSKA通过级联1D卷积核的设计,有效地解决了LKA中大内核带来的问题,在保持性能的同时降低了计算复杂度和内存占用。

核心代码


import torch
import torch.nn as nn

# 定义一个名为LSKA的神经网络模块类,继承自nn.Module
class LSKA(nn.Module):
    def __init__(self, dim, k_size):
        # 初始化LSKA类,dim为通道数,k_size为卷积核大小
        super().__init__()

        self.k_size = k_size  # 保存卷积核大小

        # 根据k_size的不同值,初始化不同的卷积层
        if k_size == 7:
            # 水平和垂直方向上的第一层卷积
            self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 3), stride=(1,1), padding=(0,(3-1)//2), groups=dim)
            self.conv0v = nn.Conv2d(dim, dim, kernel_size=(3, 1), stride=(1,1), padding=((3-1)//2,0), groups=dim)
            # 空间卷积层,带有膨胀参数
            self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 3), stride=(1,1), padding=(0,2), groups=dim, dilation=2)
            self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(3, 1), stride=(1,1), padding=(2,0), groups=dim, dilation=2)
        elif k_size == 11:
            self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 3), stride=(1,1), padding=(0,(3-1)//2), groups=dim)
            self.conv0v = nn.Conv2d(dim, dim, kernel_size=(3, 1), stride=(1,1), padding=((3-1)//2,0), groups=dim)
            self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,4), groups=dim, dilation=2)
            self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=(4,0), groups=dim, dilation=2)
        elif k_size == 23:
            self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
            self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
            self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 7), stride=(1,1), padding=(0,9), groups=dim, dilation=3)
            self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(7, 1), stride=(1,1), padding=(9,0), groups=dim, dilation=3)
        elif k_size == 35:
            self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
            self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
            self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 11), stride=(1,1), padding=(0,15), groups=dim, dilation=3)
            self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(11, 1), stride=(1,1), padding=(15,0), groups=dim, dilation=3)
        elif k_size == 41:
            self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
            self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
            self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 13), stride=(1,1), padding=(0,18), groups=dim, dilation=3)
            self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(13, 1), stride=(1,1), padding=(18,0), groups=dim, dilation=3)
        elif k_size == 53:
            self.conv0h = nn.Conv2d(dim, dim, kernel_size=(1, 5), stride=(1,1), padding=(0,(5-1)//2), groups=dim)
            self.conv0v = nn.Conv2d(dim, dim, kernel_size=(5, 1), stride=(1,1), padding=((5-1)//2,0), groups=dim)
            self.conv_spatial_h = nn.Conv2d(dim, dim, kernel_size=(1, 17), stride=(1,1), padding=(0,24), groups=dim, dilation=3)
            self.conv_spatial_v = nn.Conv2d(dim, dim, kernel_size=(17, 1), stride=(1,1), padding=(24,0), groups=dim, dilation=3)

        # 通道间卷积,用于融合信息
        self.conv1 = nn.Conv2d(dim, dim, 1)

    # 定义前向传播函数
    def forward(self, x):
        u = x.clone()  # 克隆输入张量
        attn = self.conv0h(x)  # 通过第一个水平卷积层
        attn = self.conv0v(attn)  # 通过第一个垂直卷积层
        attn = self.conv_spatial_h(attn)  # 通过第二个水平卷积层
        attn = self.conv_spatial_v(attn)  # 通过第二个垂直卷积层
        attn = self.conv1(attn)  # 通过1x1卷积层融合信息
        return u * attn  # 输入与注意力权重相乘后返回

YOLOv11引入代码

在根目录下的ultralytics/nn/目录,新建一个attention目录,然后新建一个以 LSKAttention为文件名的py文件, 把代码拷贝进去。

yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/143037077

标签:Separable,Kernel,nn,dim,卷积,self,注意力,Conv2d,size
From: https://www.cnblogs.com/banxia-frontend/p/18519336

相关文章

  • Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络加注意力机制回归
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后关注获取。1.项目背景随着大数据时代的到来,对复杂数据结构的理解和预测成为许多领域的重要课题。在这些领域中,无论是视频分析、语音识别还是自然语言处理,都面临着需......
  • Python深度学习进阶与前沿应用(注意力机制详解、生成式模型详解、自监督学习模型详解、
    近年来,伴随着以卷积神经网络(CNN)为代表的深度学习的快速发展,人工智能迈入了第三次发展浪潮,AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型(BERT、GPT-1/2/3/3.5/4、DETR、ViT、SwinTransformer等)、生成式模型(变分自编码器VAE、生成式对抗网络GAN、扩散模型Di......
  • YOLOv8改进 - 注意力篇 - 引入GAM注意力机制
    #YOLO##目标检测##计算机视觉#一、本文介绍作为入门性篇章,这里介绍了GAM注意力在YOLOv8中的使用。包含GAM原理分析,GAM的代码、GAM的使用方法、以及添加以后的yaml文件及运行记录。二、GAM原理分析GAM官方论文地址:文章GAM官方代码地址:​GAM注意力机制:GAM采用了顺序的通......
  • 【semantic Kernel】对接 Ollama
    在chatGPT的推动下。LLM简直火出天际,各行各业都在蹭。听说最近meta开源的llama3模型可以轻松在普通PC上运行,这让我也忍不住来蹭一层。以下是使用ollama试玩llama3的一些记录。什么是llamaLLaMA(LargeLanguageModelMetaAI)是Meta开发的大规模预训练语言模型,基于T......
  • 无问芯穹DiTFastAttn 中稿NeurIPS,减少76%注意力计算量,加速比最高可达180%
    《DiTFastAttn:AttentionCompressionforDiffusionTransformerModels》一文由清华大学、无问芯穹和上海交通大学的研究团队联合发表,成功入选NeurIPS会议。该研究针对图像生成模型中的计算效率问题,提出了一种新的后训练压缩方法DiTFastAttn。这种方法最多可减少76%的......
  • 【semantic Kernel】接入其他平台AI(智普)
    SemantieKernel中对话请求默认是发送到OpenAI去的其他与OpenAI对话请求接口兼容的模型平台,一般只需要修改host即可,path不需要修改,可以通过HttpClientHandler修改接入智普AI但是智谱AI的对话接口地址是api/paas/v4/chat/completions,和OpenAI不同,所以需要修改host和path智普......
  • 【论文分享】HashGAT-VCA:一种结合哈希函数和图注意力网络的矢量元胞自动机模型,用于城
    本文考虑地块内部异质性,提出一个结合哈希函数和图注意力网络(GAT)的矢量元胞自动机(VCA)方法,用于研究城市土地利用变化;并将该模型应用于模拟深圳市2009年至2012年的城市土地利用变化,结果表明,HashGAT-VCA模型的模拟准确性显著优于其他VCA模型。【论文题目】HashGAT-VCA:Avecto......
  • linux 内核 LINUX_VERSION_CODE 和 KERNEL_VERSION 宏定义 版本信息
    由于Linux版本的在不断更新,当设备驱动去兼容不同版本的内核时,需要知道当前使用的内核源码版本,以此来调用对应版本的内核API,这两个宏定义在文件/usr/include/linux/version.h#defineLINUX_VERSION_CODE263213#defineKERNEL_VERSION(a,b,c)(((a)<<16)+((b)<<8)+(c))我安......
  • 点跟踪论文—CoTracker: It is Better to Track Together使用Transform的时间与空间注
    CoTracker:ItisBettertoTrackTogether使用Transform的时间与空间注意力机制的密集点联合追踪算法详细解析文章概括总结:在之前学习的TrackingEverythingEverywhereAllatOnce(2023ICCV最佳学生论文)与RAFT:RecurrentAll-PairsFieldTransformsforOpticalF......
  • 直观解释注意力机制,Transformer的核心 | Chapter 6 | Deep Learning | 3Blue1Brown
    目录前言1.前情提要:词嵌入2.注意力是什么?Mole是什么?Tower又是什么?3.注意力模式:“一个毛茸茸的蓝色生物漫步于葱郁的森林”,名词与形容词,查询与键4.掩码:看前不看后5.上下文窗口大小6.值矩阵7.参数有多少8.交叉注意力9.多头注意力10.输出矩阵11.加深网络12.结语......