YOLOV8的改进——使用LSKA注意力机制改进SPPF

 一、LSKA相关代码

1、LSKA.py

代码链接:https://gitcode.com/StevenLauHKHK/Large-Separable-Kernel-Attention/overview

相关代码在Large-Separable-Kernel-Attention/blob/main/models/van.py中。

论文链接:https://arxiv.org/pdf/2309.01439.pdf

import torch
import torch.nn as nn
import torch.nn.functional as F
from functools import partial

from timm.models.layers import DropPath, to_2tuple, trunc_normal_
from timm.models.registry import register_model
from timm.models.vision_transformer import _cfg
import math

class Mlp(nn.Module):
    def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):
        super().__init__()
        out_features = out_features or in_features
        hidden_features = hidden_features or in_features
        self.fc1 = nn.Conv2d(in_features, hidden_features, 1)
        self.dwconv = DWConv(hidden_features)
        self.act = act_layer()
        self.fc2 = nn.Conv2d(hidden_features, out_features, 1)
        self.drop = nn.Dropout(drop)
        self.apply(self._init_weights)

    def _init_weights(self, m):
        if isinstance(m, nn.Linear):
            trunc_normal_(m.weight, std=.02)
            if isinstance(m, nn.Linear) and m.bias is not None:
                nn.init.constant_(m.bias, 0)
        elif isinstance(m, nn.LayerNorm):
            nn.init.constant_(m.bias, 0)
            nn.init.constant_(m.weight, 1.0)
        elif isinstance(m, nn.Conv2d):
            fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
            fan_out //= m.groups
            m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))
            if m.bias is not None:
                m.bias.data.zero_()

    def forward(self, x):
        x = self.fc1(x)
        x = self.dwconv(x)
        x = self.act(x)
        x = self.drop(x)
        x = self.fc2(x)
        x = self.drop(x)
        return x




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_si
### LSKA注意力机制概述 LSKA(Large Separable Kernel Attention)是一种用于深度学习模型的大核分离卷积注意力模块。该模块通过引入可分离的大尺寸卷积核来有效捕获长距离依赖关系,同时保持较低的计算复杂度和内存消耗[^1]。这使其成为一种高效的注意力机制,在多种计算机视觉任务中表现优异。 #### 关键特性 LSKA的主要特点包括以下几个方面: - **高效捕获长距离依赖性**:通过大尺寸卷积核的设计,能够更好地捕捉全局特征信息。 - **低计算与内存需求**:尽管采用了较大的卷积核,但由于采用分离策略,整体计算量得以控制在合理范围内[^3]。 - **灵活性**:支持对空间维度和通道维度进行自适应调整,从而适配不同的网络架构和应用场景。 #### 实现方法 为了将LSKA集成到YOLO系列或其他深度学习框架中,可以按照以下方式完成其实现: ##### 文件结构调整 需创建一个新的目录`ultralytics/nn/attention`并在此路径下新增名为`LSKAttention.py`的Python脚本文件[^2]。此文件应包含完整的LSKA类定义及其初始化逻辑。 ##### Python代码示例 以下是基于PyTorch的一个简单版本的LSKA实现片段: ```python import torch import torch.nn as nn class LSKAttention(nn.Module): def __init__(self, channels, kernel_size=7): super(LSKAttention, self).__init__() self.conv = nn.Conv2d(channels, channels, kernel_size, padding=(kernel_size//2), groups=channels) def forward(self, x): u = x.clone() attn = torch.sigmoid(self.conv(x)) output = u * attn return output ``` 上述代码展示了如何利用分组卷积技术构建一个基础形式的LSKA层[^4]。其中,`torch.nn.Conv2d`函数被用来设置特定参数以满足大核分离的需求;而激活函数Sigmoid则负责生成权重图谱以便后续加权融合操作。 --- ### 应用场景分析 由于其卓越性能以及资源利用率优势,LSKA广泛应用于各类视觉处理领域之中,具体表现为但不限于以下几个方向: - 图像分类:提升模型对于细微差异类别间区分能力; - 目标检测:增强边界框预测精度及背景抑制效果; - 语义分割:改善像素级标注准确性及时效平衡问题解决思路。 这些应用均得益于LSKA所具备的强大表达能力和优化后的运行效率组合而成的独特价值主张。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值