【YOLOv10改进-注意力机制】Polarized Self-Attention: 极化自注意力,双重注意力机制

简介: YOLOv10引入了极化自注意(PSA)块,结合通道和空间注意力,降低信息损失。PSA通过极化过滤保持高分辨率,并用增强处理非线性分布。在2D姿态估计和分割任务上提升1-2点精度,相比基线提升2-4点。代码示例展示了PSA模块如何集成到模型中。更多配置详情见相关链接。

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

专栏链接: YOLOv10 创新改进有效涨点

摘要

像素级回归可能是细粒度计算机视觉任务中最常见的问题,例如估计关键点热图和分割掩模。这些回归问题非常具有挑战性,特别是因为它们需要在低计算开销下对高分辨率输入/输出建模长距离依赖关系,以估计高度非线性的像素级语义。

尽管深度卷积神经网络(DCNNs)中的注意机制已经流行起来,用于增强长距离依赖关系,但是元素特定的注意力,例如非局部块,学习起来非常复杂且对噪声敏感,而大多数简化的注意力混合体试图在多种任务类型之间达到最佳折衷。

在本文中,我们提出了极化自注意(PSA)块,它融合了两个关键设计,以实现高质量的像素级回归:(1)极化过滤:在保持通道和空间注意力计算中的高内部分辨率的同时,完全折叠输入张量沿其相对应维度。(2)增强:构成非线性,直接适应典型细粒度回归的输出分布,例如2D高斯分布(关键点热图)或2D二项分布(二进制分割掩模)。PSA似乎已经充分利用了其仅通道和仅空间分支的表示能力,因此其顺序和并行布局之间只有边际度量差异。实验结果表明,PSA将标准基线提高了2至4个点,并将2D姿势估计和语义分割基准上的最新技术提高了1至2个点。

创新点

  • 极化滤波(Polarized filteringPolarized):在通道和空间维度保持比较高的分辨率(在通道上保持C/2的维度,在空间上保持[H,W]的维度 ),进一步减少低分辨率、低通道数和上采样造成的信息损失。

  • 增强(Enhancement):采用细粒度回归输出分布的非线性函数。

yolov10 引入


  class PolarizedSelfAttention(nn.Module):
    def __init__(self, channel=512):
        super().__init__()
        # 通道注意力权重计算层
        self.ch_wv = nn.Conv2d(channel, channel // 2, kernel_size=(1, 1))
        self.ch_wq = nn.Conv2d(channel, 1, kernel_size=(1, 1))
        # 通道和空间注意力的softmax
        self.softmax_channel = nn.Softmax(1)
        self.softmax_spatial = nn.Softmax(-1)
        # 通道注意力输出层
        self.ch_wz = nn.Conv2d(channel // 2, channel, kernel_size=(1, 1))
        # 用于通道注意力权重的层归一化和Sigmoid函数
        self.ln = nn.LayerNorm(channel)
        self.sigmoid = nn.Sigmoid()
        # 空间注意力权重计算层
        self.sp_wv = nn.Conv2d(channel, channel // 2, kernel_size=(1, 1))
        self.sp_wq = nn.Conv2d(channel, channel // 2, kernel_size=(1, 1))
        # 平均池化层,用于空间注意力计算
        self.agp = nn.AdaptiveAvgPool2d((1, 1))

    def forward(self, x):
        b, c, h, w = x.size()  # 输入x的尺寸

        # 通道注意力计算过程
        channel_wv = self.ch_wv(x)  # 对输入x进行卷积,得到中间特征
        channel_wq = self.ch_wq(x)  # 对输入x进行卷积,得到查询特征
        # 重塑特征,以便进行矩阵乘法
        channel_wv = channel_wv.reshape(b, c // 2, -1)  # 将特征图重塑为矩阵形式
        channel_wq = channel_wq.reshape(b, -1, 1)  # 将查询特征重塑为矩阵形式
        channel_wq = self.softmax_channel(channel_wq)  # 对查询特征应用softmax
        channel_wz = torch.matmul(channel_wv, channel_wq).unsqueeze(-1)  # 计算权重并增加一个维度
        # 应用层归一化、卷积和Sigmoid函数得到通道注意力权重
        channel_weight = (
            self.sigmoid(
                self.ln(self.ch_wz(channel_wz).reshape(b, c, 1).permute(0, 2, 1))
            )
            .permute(0, 2, 1)
            .reshape(b, c, 1, 1)
        )
        channel_out = channel_weight * x  # 将权重应用到输入x上

        # 空间注意力计算过程
        spatial_wv = self.sp_wv(x)  # 对输入x进行卷积,得到中间特征
        spatial_wq = self.sp_wq(x)  # 对输入x进行卷积,得到查询特征
        spatial_wq = self.agp(spatial_wq)  # 对查询特征进行平均池化
        spatial_wv = spatial_wv.reshape(b, c // 2, -1)  # 重塑特征
        spatial_wq = spatial_wq.permute(0, 2, 3, 1).reshape(b, 1, c // 2)  # 重塑查询特征并转置
        spatial_wq = self.softmax_spatial(spatial_wq)  # 对查询特征应用softmax
        spatial_wz = torch.matmul(spatial_wq, spatial_wv)  # 计算权重
        spatial_weight = self.sigmoid(spatial_wz.reshape(b, 1, h, w))  # 应用Sigmoid函数得到空间注意力权重
        spatial_out = spatial_weight * x  # 将权重应用到输入x上
        out = spatial_out + channel_out  # 合并通道和空间注意力结果
        # 返回最终的输出
        return out

# 主函数,用于测试极化自注意力模块
if __name__ == "__main__":
    x = torch.randn(1, 1024, 224, 224)  # 创建一个随机的输入张量,模拟一个批量大小为1,通道数为1024,尺寸为224x224的图像
    psa = PolarizedSelfAttention(channel=1024)  # 实例化一个极化自注意力模块,输入通道数设为1024
    x = psa(x)  # 通过极化自注意力模块处理输入张量
    print(x.shape)  # 打印处理后的张量的形状,以验证输出的维度是否正确

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/140162764

相关文章
|
7月前
|
机器学习/深度学习 Ruby
YOLOv5改进 | 2023注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制)
YOLOv5改进 | 2023注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制)
389 0
|
7月前
|
机器学习/深度学习 Ruby
YOLOv8改进 | 2023注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制)
YOLOv8改进 | 2023注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制)
739 0
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
134 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
2月前
|
机器学习/深度学习 自然语言处理 并行计算
多头注意力机制介绍
【10月更文挑战第4天】
|
5月前
|
机器学习/深度学习 算法 测试技术
【YOLOv8改进 - 注意力机制】Focused Linear Attention :全新的聚焦线性注意力模块
YOLOv8专栏探讨了该目标检测算法的创新改进,包括使用聚焦线性注意力模块,解决了Transformer在视觉任务中的效率和表达力问题。该模块增强自注意力,提高焦点能力和特征多样性,保持线性复杂度。文章提供了实证证据证明其在多个基准上的性能提升,并在GitHub上发布了代码。论文和更多实战案例链接见文中。
|
7月前
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 2023注意力篇 | EMAttention注意力机制(附多个可添加位置)
YOLOv8改进 | 2023注意力篇 | EMAttention注意力机制(附多个可添加位置)
954 0
|
6月前
|
机器学习/深度学习 自然语言处理 机器人
注意力机制详解(二)
注意力机制(Attention Mechanism)对比分析:无Attention模型中,Encoder-Decoder框架处理文本序列时,输入信息被编码为单一的中间语义表示,导致每个目标单词生成时使用相同编码,忽视了输入序列中各单词的不同影响。引入Attention模型后,每个目标单词根据输入序列动态分配注意力权重,更好地捕捉输入相关性,尤其适用于长序列,避免信息丢失。Self-Attention则进一步在序列内部建立联系,用于理解不同部分间的关系,常见于Transformer和BERT等模型中。
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
注意力机制详解(一)
注意力机制是受人类认知过程启发的一种深度学习技术,它允许模型动态地聚焦于输入的不同部分,根据上下文分配“注意力”。这种机制最早在序列到序列模型中提出,解决了长距离依赖问题,增强了模型理解和处理复杂数据的能力。基本的注意力计算涉及查询(Q)、键(K)和值(V),通过不同方式(如点积、拼接等)计算相关性并应用softmax归一化,得到注意力权重,最后加权组合值向量得到输出。自注意力是注意力机制的一种形式,其中Q、K和V通常是相同的。在自然语言处理(NLP)中,注意力机制广泛应用在Transformer和预训练模型如BERT中,显著提升了模型的表现。
|
6月前
|
机器学习/深度学习 自然语言处理 算法
YOLOv5改进 | 注意力机制 | 添加三重注意力机制 TripletAttention【完整代码】
本文介绍了三重注意力机制在YOLOv5目标检测中的应用,这是一种轻量级方法,通过三分支结构捕获跨维度交互来计算注意力权重,几乎不增加计算开销。文章详细阐述了三重注意力的原理,包括全局、组间和组内三个层次的注意力计算,并提供了将TripletAttention模块添加到YOLOv5网络的教程。作者提供了代码实现和yaml配置文件的修改指导,以及在训练脚本中设置配置文件路径的步骤。完整代码附在文章末尾,适合初学者实践。此外,文章还鼓励读者探索在不同位置添加三重注意力以进一步优化模型性能。
|
7月前
|
机器学习/深度学习 自然语言处理 算法
注意力机制(四)(多头注意力机制)
在上一篇注意力机制(三)(不同注意力机制对比)-CSDN博客,重点讲了针对QKV来源不同制造的注意力机制的一些变体,包括交叉注意力、自注意力等。这里再对注意力机制理解中的核心要点进行归纳整理