(内含即插即用代码)选择性注意力LSK 模块,可用于改进YOLO系列的目标检测算法

文章详细讲解了如何利用LSKblock和Attention模块改进遥感目标检测算法,提供Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有感兴趣的小伙伴可以搜一下这个相关的介绍资料,论文地址:https://arxiv.org/pdf/2303.09030.pdf

这一注意力可以有效用于遥感目标检测算法的改进,废话不多说,直接上代码;

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


class Attention(nn.Module):
    def __init__(self, d_model):
        super().__init__()

        self.proj_1 = nn.Conv2d(d_model, d_model, 1)
        self.activation = nn.GELU()
        self.spatial_gating_unit = LSKblock(d_model)
        self.proj_2 = nn.Conv2d(d_model, d_model, 1)

    def forward(self, x):
        shorcut = x.clone()
        x = self.proj_1(x)
        x = self.activation(x)
        x = self.spatial_gating_unit(x)
        x = self.proj_2(x)
        x = x + shorcut
        return x

在这里我们注意到,代码中是有LSKblock这个类和Attention这个类,无论哪一个,它的核心都是LSK的模块,无非是Attention加了一个残差结构。他们都是即插即用的模块,只需要一个形参,也就是输入通道数即可使用。

a = torch.ones(1,10,20,20)#设置输入
b = LSKblock(10)#实例化
c = Attention(10)#实例化
print(b(a).size())
print(c(a).size())

最后的结果如下,输入特征的尺寸并未改变

### 更换YOLOv11骨干网络为SwinTransformer的方法 #### 修改配置文件 为了实现将YOLOv11的骨干网络替换为SwinTransformer,首先需要调整YOLOv11对应的`yaml`配置文件。此过程涉及定义新的backbone结构并确保其能无缝集成到现有的检测框架中[^2]。 对于具体操作,在`yaml`配置文件中的`Backbone`部分指定采用SwinTransformer作为基础特征提取器。需要注意的是,不同版本间的差异可能导致具体的字段名称有所不同,因此建议参照最新版官方文档或源码来确认确切设置项。 ```yaml # 假设路径为configs/yolov11_swin_backbone.yaml Model: Backbone: swin_transformer # 使用swin transformer替代原有backbone ``` #### 调整模型构建逻辑 接下来是对`common.py`以及负责创建整个YOLOv11实例化的脚本(通常是`yolo.py`)做出相应改动。这里的关键在于引入SwinTransformer的相关类定义,并通过继承或其他方式将其融入至YOLOv11的整体架构之中。 在`common.py`内添加如下代码片段用于加载预训练好的SwinTransformer权重: ```python from timm.models import create_model def build_backbone(cfg, pretrained=True): """Builds the backbone network based on configuration.""" model_name = cfg['model']['backbone'] if 'swin' in model_name.lower(): return create_model(model_name, pretrained=pretrained) raise ValueError(f"Unsupported backbone {model_name}") ``` 而在`yolo.py`里,则需保证当选择了特定类型的backbone时能够正确调用上述函数完成初始化工作: ```python class YOLOv11(nn.Module): ... def __init__(self, config_path=None,...): super(YOLOv11,self).__init__() self.backbone = build_backbone(self.cfg) ...其他组件... ``` #### 集成LSK模块提升性能 除了简单的替换外,还可以考虑加入诸如Large Selective Kernel(LSK)这样的改进措施进一步增强模型表现力[^3]。这一步骤并非强制性的,但对于追求更高精度的应用场景来说是非常有价值的尝试。 最后提醒一点,由于YOLO系列算法迭代迅速,实际开发过程中务必关注官方发布的更新说明和技术博客获取最前沿的信息和支持材料[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值