YOLOv8改进 | 2023 | LSKAttention大核注意力机制助力极限涨点

论文地址:官方论文地址

代码地址:官方代码地址

一、本文介绍 

在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv8,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,它主要通过将深度卷积层的2D卷积核分解为水平和垂直1D卷积核,减少了计算复杂性和内存占用。接着,我们介绍将这一机制整合到YOLOv8的方法,以及它如何帮助提高处理大型数据集和复杂视觉任务的效率和准确性。本文还将提供代码实现细节和使用方法,展示这种改进对目标检测、语义分割等方面的积极影响。通过实验YOLOv8在整合LSKAttention机制后,实现了检测精度提升(下面会附上改进LSKAttention机制和基础版本的结果对比图)。

 专栏回顾:YOLOv8改进系列专栏——本专栏持续复习各种顶会内容——科研必备

实验效果图如下所示-> 

本次实验我只用了一百张图片检测的是安全帽训练了一百个epoch,该结果只能展示出该机制有效,但是并不能产生决定性结果,因为具体的效果还要看你的数据集和实验环境所影响。

目录

一、本文介绍 

二、LSKAttention的机制原理 

三、LSKAttention的代码

四、手把手教你将LSKAttention添加到你的网络结构中

4.1 LSKAttention的添加教程

4.2 LSKAttention的yaml文件和训练截图

4.2.1 LSKAttention的yaml文件

4.2.2 LSKAttention的训练过程截图 

五、LSKAttention可添加的位置

5.1 推荐LSKAttention可添加的位置 

5.2图示LSKAttention可添加的位置 

六、本文总结 


二、LSKAttention的机制原理 

《Large Separable Kernel Attention》这篇论文提出的LSKAttention的机制原理是针对传统大核注意力(Large Kernel Attention,LKA)模块在视觉注意网络(Visual Attention Networks,VAN)中的应用问题进行的改进。LKA模块在处理大尺寸卷积核时面临着高计算和内存需求的挑战。LSKAttention通过以下几个关键步骤和原理来解决这些问题:

  1. 核分解:LSKAttention的核心创新是将传统的2D卷积核分解为两个1D卷积核。首先,它将一个大的2D核分解成水平(横向)和垂直(纵向)的两个1D核。这样的分解大幅降低了参数数量和计算复杂度。

  2. 串联卷积操作:在进行卷积操作时,LSKAttention首先使用一个1D核对输入进行水平方向上的卷积,然后使用另一个1D核进行垂直方向上的卷积。这两步卷积操作串联执行,从而实现了与原始大尺寸2D核相似的效果。

  3. 计算效率提升:由于分解后的1D卷积核大大减少了参数的数量,LSKAttention在执行时的计算效率得到显著提升。这种方法特别适用于处理大尺寸的卷积核,能够有效降低内存占用和计算成本。

  4. 保持效果:虽然采用了分解和串联的策略,LSKAttention仍然能够保持类似于原始LKA的性能。这意味着在处理图像的关键特征(如边缘、纹理和形状)时,LSKAttention能够有效地捕捉到重要信息。

  5. 适用于多种任务:LSKAttention不仅在图像分类任务中表现出色,还能够在目标检测、语义分割等多种计算机视觉任务中有效应用,显示出其广泛的适用性。

总结:LSKAttention通过创新的核分解和串联卷积策略,在降低计算和内存成本的同时,保持了高效的图像处理能力,这在处理大尺寸核和复杂图像数据时特别有价值。

上图展示了在不同大核分解方法和核大小下的速度-精度权衡。在这个比较中,使用了不同的标记来代表不同的核大小,并且以VAN-Tiny作为对比的模型。从图中可以看出,LKA的朴素设计(LKA-trivial)以及在VAN中的实际设计,在核大小增加时会导致更高的GFLOPs(十亿浮点运算次数)。相比之下,论文提出的LSKA(Large Separable Kernel Attention)-trivial和VAN中的LSKA在核大小增加时显著降低了GFLOPs,同时没有降低性能 

上图展示了大核注意力模块不同设计的比较,具体包括:

  1. LKA-trivial:朴素的2D大核深度卷积(DW-Conv)与1×1卷积结合(图a)。
  2. LSKA-trivial:串联的水平和垂直1D大核深度卷积与1×1卷积结合(图b)。
  3. 原始LKA设计:在VAN中包括标准深度卷积(DW-Conv)、扩张深度卷积(DW-D-Conv)和1×1卷积(图c)。
  4. 提出的LSKA设计:将LKA的前两层分解为四层,每层由两个1D卷积层组成(图d)。其中,N代表Hadamard乘积,k代表最大感受野,d代表扩张率​​。

个人总结:提出了一种创新的大型可分离核注意力(LSKA)模块,用于改进卷积神经网络(CNN)。这种模块通过将2D卷积核分解为串联的1D核,有效降低了计算复杂度和内存需求。LSKA模块在保持与标准大核注意力(LKA)模块相当的性能的同时,显示出更高的计算效率和更小的内存占用。

三、LSKAttention的代码

将下面的代码在"ultralytics/nn/modules" 目录下创建一个py文件复制粘贴进去然后按照章节四进行添加即可(需要按照有参数的注意力机制添加)

import torch
import torch.nn as nn


class LSKA(nn.Module):
    def __init__(self, dim, k_size):
        super().__init__()

        self.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)
        return u * attn

四、手把手教你将LSKAttention添加到你的网络结构中

4.1 LSKAttention的添加教程

添加教程这里不再重复介绍、因为专栏内容有许多,添加过程又需要截特别图片会导致文章大家读者也不通顺如果你已经会添加注意力机制了,可以跳过本章节,如果你还不会,大家可以看我下面的文章,里面详细的介绍了拿到一个任意机制(C2f、Conv、Bottleneck、Loss、DetectHead)如何添加到你的网络结构中去。

添加教程->YOLOv8改进 | 如何在网络结构中添加注意力机制、C2f、卷积、Neck、检测头

需要注意的是本文的task.py配置的代码如下(你现在不知道其是干什么用的可以看添加教程)-> 

        elif m in {LSKA}:
            args = [ch[f], *args]

4.2 LSKAttention的yaml文件和训练截图

4.2.1 LSKAttention的yaml文件

参数位置可以填写的有7、11、23、35、41、53(代表卷积核的大小),具体哪个效果好可能要大家自己进行一定的尝试才可以,需要注意的是这里卷积核越大计算量就会变得越大。

4.2.2 LSKAttention的训练过程截图 

下面是我添加了LSKAttention的训练截图。

五、LSKAttention可添加的位置

5.1 推荐LSKAttention可添加的位置 

LSKAttention可以是一种即插即用的注意力机制,其可以添加的位置有很多,添加的位置不同效果也不同,所以我下面推荐几个添加的位,置大家可以进行参考,当然不一定要按照我推荐的地方添加。

  1. 残差连接中:在残差网络的残差连接中加入注意力机制(这个位置我推荐的原因是因为DCN放在残差里面效果挺好的大家可以尝试)

  2. 特征金字塔(SPPF):在特征金字塔网络之前,可以帮助模型更好地融合不同尺度的特征。

  3. Neck部分:YOLOv8的Neck部分负责特征融合,这里添加注意力机制可以帮助模型更有效地融合不同层次的特征。

  4. 输出层前:在最终的输出层前加入注意力机制可以使模型在做出最终预测之前,更加集中注意力于最关键的特征。

大家可能看我描述不太懂,大家可以看下面的网络结构图中我进行了标注。

5.2图示LSKAttention可添加的位置 

六、本文总结 

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv8改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,目前本专栏免费阅读(暂时,大家尽早关注不迷路~)如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

 专栏回顾:YOLOv8改进系列专栏——本专栏持续复习各种顶会内容——科研必备

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/186977.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬盘上不小心删除了重要文档?试试这6个成功率高的数据恢复工具!

您是否不小心重新格式化了存储卡或删除了想要保留的照片?最好的照片恢复软件可以提供帮助!如果您使用数码相机拍摄的时间足够长,那么当您错误地删除了想要保留的图像、重新格式化了错误的 SD 卡,或者发现您的珍贵照片由于某种莫名…

NB-IoT BC260Y Open CPU平台篇②AEP物联网平台天翼物联CWing

NB-IoT BC260Y Open CPU平台篇②AEP物联网平台天翼物联CWing 1、注册账号2、创建属于自己项目的产品3、协议解析:4、添加设备5、设备模拟测试:6、设备调试:最近做了几个项目,都是将终端产品连接到天翼物联Cwing平台和Onenet平台,个人感觉这2个平台功能还是挺全的比较好用。…

[SWPUCTF 2021 新生赛]PseudoProtocols

题目很明确了就是伪协议 php://filter/convert.base64-encode/resourcehint.php 提交的伪协议的内容需要是 I want flag,就会echo flag 方法1:adata://text/plain,I want flag 方法2:adata://text/plain;base64,SSB3YW50IGZsYWc

文献速递:人工智能(AI)用于神经学家:数字神经元会梦见电子羊吗?

这篇文章详细讨论了人工智能(AI)在神经学领域的应用及其对医疗保健行业的深远影响。主要内容可以分为以下几个部分: **1.AI和机器学习的基础知识:**文章首先解释了AI的基本概念,回顾了从最初的基于规则的方法到当前的…

Python潮流周刊:Twitter 的强敌 Threads 是用 Python 开发的!

🦄文章&教程 1、聊一聊 Python 和 Golang 的垃圾回收 常见的垃圾回收算法有哪些,它们的优缺点是什么?Python 的垃圾回收机制由什么组成,如何解决内存泄漏问题?Golang 的垃圾回收机制又是怎样的,如何解…

模块的学习

模块合包的基本概念: 模块(module):在python中,xx.py文件,就可以被看作模块 包(package): 用来管理和存放模块的文件夹,就被称为包&…

CleanMyMacX4.14.5macOS电脑系统免费清理工具

CleanMyMac X是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件,修复系统漏洞,一键扫描和优化Mac系统,…

安卓开发——Android Studio常见报错与解决方法

1. No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-android 这个错误是由于较新版本的NDK的./toolchains目录中没有arm-linux-androideabi文件,解决办法是从旧的NDK版本里面把相关的lib复制到要使用的NDK的版本里面&#xff0c…

ubuntu环境删除qtcreator方法

文章目录 方法1方法2方法3参考不同的安装方法,对应不同的删除方法 方法1 apt-get或者dpkg 方法2 QtCreatorUninstaller 方法3 MaintenanceTool

Clion在Windows下build时出现undefined reference,即使cmake已经正确链接第三方库(如protobuf)?

你是否正在使用clion自带的vcpkg来安装了protobuf? 或者你是否自己使用visual studio自己编译了libprotobuf.lib? 你是否已经正确在CmakeLists.txt中添加了以下命令: find_package(Protobuf CONFIG REQUIRED) include_directories(${Protobu…

中文地址命名实体识别训练和预测

效果 github项目地址 https://github.com/taishan1994/pytorch_bert_bilstm_crf_ner 下载项目 放在这个位置“F:\Python\github\ultralytics-main\submain\pytorch_bert_bilstm_crf_ner-main” 训练和预测步骤 1、下载数据集 从github项目可以找到数据集下载地址 https:…

个人硬件测试用例入门设计

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 🌤️功能测试 进行新增、…

yolov5从英伟达平台移植到华为昇腾开发板上的思路

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近需要将yolov5代码从英伟达平台移植到华为昇腾开发板上。搜了一些代码和资料,大致明白了二者的差别。 1.二者使用的模型文件不一样 yolov…

葡萄酒如何按颜色进行分类?

在世界众多的葡萄酒中,葡萄酒的颜色受品种、产区和酿造方法影响,可谓多种多样,用万紫千红形容也不为过。为了更好辨识,一般葡萄酒根据不同颜色,分为三个大类即:红葡萄酒、白葡萄酒、桃红葡萄酒。 红葡萄酒…

表单考勤签到作业周期打卡打分评价评分小程序开源版开发

表单考勤签到作业周期打卡打分评价评分小程序开源版开发 表单打卡评分 表单签到功能:学生可以通过扫描二维码或输入签到码进行签到,方便教师进行考勤管理。 考勤功能:可以记录学生的出勤情况,并自动生成出勤率和缺勤次数等统计数…

五种多目标优化算法(NSDBO、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(MATLAB代码)

一、多目标优化算法简介 (1)非支配排序的蜣螂优化算法NSDBO 多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)-CSDN博客 (2)NSGA3 NSGA-III求解微电网多目标…

两年功能五年自动化测试面试经验分享

最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变。初次的面试就碰到个工作年限比我长的,也没有时…

Java核心知识点整理大全13-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…

哪些域名后缀在国内可以进行备案?

简介 现在有很多不同组合的域名后缀,但是,并非所有后缀都允许进行备案。以下是整理的可备案域名后缀列表,希望能对大家有所帮助! 可备案的域名后缀包括: 中文顶级域名 .政务.公益.公司.网络.网址.商城.网店.中信.商…

3ds Max 电脑配置建议 | 建模+渲染选专业显卡or游戏显卡?

使用3ds Max进行建模和渲染时,选择合适的电脑配置非常重要。比如在硬件选择上,究竟选购游戏显卡还是专业显卡呢?本文将为你详细介绍游戏显卡和专业显卡的区别,并提供配置建议,助你作出明智的决策。 &#…