【YOLOv8改进】LSKNet(Large Selective Kernel Network ):空间选择注意力

LSKNet是一种针对遥感目标检测的新型网络结构,通过大核卷积和空间核选择机制动态调整感受野,以适应不同目标的范围上下文。该模型在遥感分类、目标检测和语义分割任务中实现了最先进的性能。LSKNet的核心是LSKblock Attention,它能自适应地确定大型核的权重,优化不同目标的检测效果。
摘要由CSDN通过智能技术生成

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

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240410221310591

摘要

近期在遥感目标检测的研究中,主要集中于提高定向边界框的表示能力,但却忽略了遥感场景中独有的先验知识。这类先验知识是有用的,因为在没有参考足够长范围上下文的情况下,微小的遥感目标可能会被错误地检测到,而不同类型的对象所需的长范围上下文可能会有所不同。在本文中,我们考虑到了这些先验,并提出了大型选择性核网络(LSKNet)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。无需任何额外复杂设计,我们的轻量级LSKNet在标准的遥感分类、目标检测和语义分割基准测试中设立了新的最先进水平。

创新点

  1. LSKblock Attention:LSKNet引入了LSKblock Attention作为一种注意力机制,通过空间选择性机制动态调整感受野,以更有效地处理不同目标类型的广泛上下文。这种机制允许模型根据输入自适应地确定大型核的权重,从而在空间维度上调整每个目标的感受野。
  2. 大型选择性核网络:LSKNet是首个在遥感目标检测领域探索大型和选择性核机制的模型。它通过加权处理大型深度核的特征,并在空间上将它们合并,以适应不同目标类型的不同上下文细微差异。
  3. 适应性感受野调整:LSKNet能够动态调整感受野以更好地模拟远程感知场景中各种对象的范围上下文,从而更有效地处理不同目标类型的广泛上下文。
  4. 性能优越:LSKNet在标准基准数据集上取得了新的最先进成绩,如HRSC2016、DOTA-v1.0和FAIR1M-v1.0,证明了其在遥感目标检测任务中的卓越性能和有效性。

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

LSKNet的结构

LSKNet的结构包括以下几个关键组成部分:

  1. LSK module:LSK module是LSKNet中的一个重要组件,由大核卷积序列和空间选择机制组成。大核卷积序列用于捕获长距离上下文信息,而空间选择机制则根据输入数据动态调整大核的权重,以适应不同目标类型的上下文特征。
  2. LSK Block
好的,以下是Selective Kernel Attention 注意力模块的 Python 代码: ```python import torch import torch.nn as nn class ScaledDotProductAttention(nn.Module): def __init__(self, temperature): super().__init__() self.temperature = temperature def forward(self, q, k, v, mask=None): attn = torch.matmul(q / self.temperature, k.transpose(2, 3)) if mask is not None: attn = attn.masked_fill(mask == 0, -1e9) attn = nn.Softmax(dim=-1)(attn) output = torch.matmul(attn, v) return output, attn class SKAttention(nn.Module): def __init__(self, d_model, d_k, d_v, n_heads, n_sk, dropout): super().__init__() self.n_heads = n_heads self.n_sk = n_sk self.d_k = d_k self.d_v = d_v self.w_qs = nn.Linear(d_model, n_heads * n_sk * d_k, bias=True) self.w_ks = nn.Linear(d_model, n_heads * n_sk * d_k, bias=True) self.w_vs = nn.Linear(d_model, n_heads * n_sk * d_v, bias=True) self.attention = ScaledDotProductAttention(temperature=d_k ** 0.5) self.proj_o = nn.Linear(n_heads * n_sk * d_v, d_model, bias=True) self.dropout = nn.Dropout(dropout) self.layer_norm = nn.LayerNorm(d_model, eps=1e-6) self.fc = nn.Linear(d_model, d_model, bias=True) def forward(self, query, key, value, mask=None): batch_size = query.size(0) residual_xs = query q_s = self.w_qs(query).view(batch_size, -1, self.n_heads, self.n_sk, self.d_k) k_s = self.w_ks(key).view(batch_size, -1, self.n_heads, self.n_sk, self.d_k) v_s = self.w_vs(value).view(batch_size, -1, self.n_heads, self.n_sk, self.d_v) q = q_s.permute(2, 0, 3, 1, 4).contiguous().view(-1, self.n_sk, self.d_k) k = k_s.permute(2, 0, 3, 1, 4).contiguous().view(-1, self.n_sk, self.d_k) v = v_s.permute(2, 0, 3, 1, 4).contiguous().view(-1, self.n_sk, self.d_v) mask = mask.repeat(self.n_heads, self.n_sk, 1, 1) output, attn = self.attention(q, k, v, mask=mask) output = output.view(self.n_heads, batch_size, self.n_sk, self.d_v) output = output.permute(1, 2, 0, 3).contiguous().view(batch_size, -1, self.n_heads * self.n_sk * self.d_v) proj_o = self.proj_o(output) output = self.layer_norm(residual_xs + proj_o) fc_output = self.fc(output) output = self.dropout(fc_output) output = self.layer_norm(output + output) return output, attn ``` 希望能够帮到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YOLO大师

你的打赏,我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值