即插即用模块(3) -LSK 特征提取

在这里插入图片描述

paper:LSKNet: A Foundation Lightweight Backbone for Remote Sensing
Code:https://github.com/zcablii/LSKNet

  1. 大型选择性内核块 (LSK Block)

    功能

    通过动态调整感受野,自适应提取遥感图像中目标的上下文信息,增强目标与环境关联的建模能力,适用于外观相似但环境差异显著的场景。

    实现流程

    1. 大型内核卷积分解

      :对输入 ( X X X ) 应用深度可分离卷积,生成多尺度特征图序列 ( U U U )。

    2. 通道混合

      :将 ( U U U ) 拼接,通过 1x1 卷积生成特征图 ( e e e )。

    3. 空间内核选择

      :对 ( e ) 进行平均池化和最大池化,生成描述符 ( A_{avg} ) 和 ( A_{max} )。

      拼接后通过卷积生成空间注意力图 ( SA )。

      应用 sigmoid 生成选择掩码 ( S A i SA_i SAi ),加权融合生成注意力特征 ( S )。

    4. 元素级乘法

      :将 ( X ) 与 ( S ) 相乘,生成输出 ( Y )。

    优势

    • 动态调整感受野,适应不同目标的上下文需求。
    • 深度可分离卷积降低计算复杂度。
    • 增强目标与环境的特征关联,提升识别精度。

Large Selective Kernel Block结构图:

在这里插入图片描述

2、代码实现

import torch
import torch.nn as nn


class LSKblock(nn.Module):
    def __init__(self, dim):
        super().__init__()
        self.conv0 = nn.Conv2d(dim, dim, 5, padding=2, groups=dim)
        self.conv_spatial = nn.Conv2d(dim, dim, 7, stride=1, padding=9, groups=dim, dilation=3)
        self.conv1 = nn.Conv2d(dim, dim // 2, 1)
        self.conv2 = nn.Conv2d(dim, dim // 2, 1)
        self.conv_squeeze = nn.Conv2d(2, 2, 7, padding=3)
        self.conv = nn.Conv2d(dim // 2, dim, 1)

    def forward(self, x):
        attn1 = self.conv0(x)
        attn2 = self.conv_spatial(attn1)

        attn1 = self.conv1(attn1)
        attn2 = self.conv2(attn2)

        attn = torch.cat([attn1, attn2], dim=1)
        avg_attn = torch.mean(attn, dim=1, keepdim=True)
        max_attn, _ = torch.max(attn, dim=1, keepdim=True)
        agg = torch.cat([avg_attn, max_attn], dim=1)
        sig = self.conv_squeeze(agg).sigmoid()
        attn = attn1 * sig[:, 0, :, :].unsqueeze(1) + attn2 * sig[:, 1, :, :].unsqueeze(1)
        attn = self.conv(attn)
        return x * attn


if __name__ == '__main__':
    x = torch.randn(4, 64, 128, 128).cuda()
    model = LSKblock(64).cuda()
    out = model(x)
    print(out.shape)
).cuda()
    model = LSKblock(64).cuda()
    out = model(x)
    print(out.shape)
### LSK 注意力机制的核心概念与实现 #### 1. **LSK Attention 的背景** 传统的大型卷积核注意力(Large Kernel Attention, LKA)模块虽然能有效捕捉全局上下文信息,但在实际应用中面临高计算复杂度和内存消耗的问题[^2]。为了缓解这一问题,《Large Separable Kernel Attention》提出了 LSKAttention,旨在通过分离式的大核结构降低资源开销。 --- #### 2. **LSK Attention 的核心原理** LSKAttention 主要由以下几部分组成: - **大核卷积序列** 使用可分卷积(Depthwise Convolution)替代标准卷积操作,从而减少参数量并保持较大的感受野。这种设计允许模型高效地捕获长距离依赖关系[^1]。 - **空间选择机制** 空间选择机制通过对不同尺度的空间特征进行加权融合,增强重要区域的表达能力。具体来说,该机制会动态调整权重分配,突出显著的目标特征。 - **FFN 结合** 前馈神经网络(Feed Forward Network, FFN)被集成到整体架构中,用于进一步提升非线性建模能力和特征表征效果。 这些组件共同构成了单个 LSKBlock,并可通过堆叠多个这样的 block 形成完整的 LSKNet 架构。 --- #### 3. **代码实现示例** 以下是基于 PyTorch 的简化版 LSK Attention 实现: ```python import torch import torch.nn as nn class DepthWiseConv(nn.Module): """ 可分离卷积层 """ def __init__(self, dim, kernel_size=7): super(DepthWiseConv, self).__init__() padding = kernel_size // 2 self.depth_conv = nn.Conv2d(dim, dim, kernel_size, stride=1, padding=padding, groups=dim) def forward(self, x): return self.depth_conv(x) class SpatialSelectionMechanism(nn.Module): """ 空间选择机制 """ def __init__(self, dim): super(SpatialSelectionMechanism, self).__init__() self.conv = nn.Conv2d(2 * dim, dim, 1) def forward(self, x_local, x_global): concat_features = torch.cat([x_local, x_global], dim=1) out = self.conv(concat_features) return out class LSKAttention(nn.Module): """ LSK 注意力模块 """ def __init__(self, dim): super(LSKAttention, self).__init__() self.local_branch = DepthWiseConv(dim) self.global_branch = nn.Sequential( nn.AdaptiveAvgPool2d(output_size=(1, 1)), nn.Conv2d(in_channels=dim, out_channels=dim, kernel_size=1), nn.GELU(), nn.Conv2d(in_channels=dim, out_channels=dim, kernel_size=1)) self.spatial_selection = SpatialSelectionMechanism(dim) def forward(self, x): local_feature = self.local_branch(x) global_feature = self.global_branch(x).expand_as(local_feature) fused_feature = self.spatial_selection(local_feature, global_feature) return x + fused_feature # 测试代码 if __name__ == "__main__": input_tensor = torch.randn(1, 64, 56, 56) # Batch Size × Channels × Height × Width lsk_attention = LSKAttention(dim=64) output = lsk_attention(input_tensor) print("Output Shape:", output.shape) ``` 上述代码实现了基本的 LSK Attention 模块,其中 `local_branch` 和 `global_branch` 分别负责局部特征提取和全局信息聚合,而 `spatial_selection` 则完成两者的融合过程。 --- #### 4. **与其他技术的关系** - **对比 CNN/RNN 自注意力** 不同于经典的自注意力方法缺乏位置感知的能力[^3],LSKAttention 显著增强了对目标对象的位置敏感特性。 - **在 YOLOv5 中的应用** 在最新的 YOLO 版本中引入了 LSKModule 来强化检测性能。它不仅提升了关键特征的学习效率,还降低了冗余计算带来的负担[^4]。 - **远程传感领域扩展** 针对遥感影像分析任务开发的 LSKNet 已经开源至 GitHub 平台,开发者可以利用 mmrotate 框架快速部署相关项目[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值