YOLOv5改进 | 注意力机制 | 迈向高质量像素级回归的极化自注意力【全网独家】

news2024/10/6 6:27:37

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转   


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录: 《YOLOv5入门 + 改进涨点》专栏介绍 & 专栏目录 |目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进


虽然深度卷积神经网络中的注意力机制已经变得流行,用于增强长距离依赖,但元素特定的注意力,如Nonlocal块,学习起来非常复杂且对噪声敏感,而且大多数简化的注意力混合方法试图在多种类型的任务之间达到最佳的折衷。为此研究人员提出了极化自注意力(PSA)块,它结合了两个关键设计,以实现高质量的像素级回归。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改并将修改后的完整代码放在文章的最后方便大家一键运行小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv5改进+入门——持续更新各种有效涨点方法——点击即可跳转

目录

1.原理

2. 将极化自注意力添加到YOLOv5中

2.1 PSA代码实现

2.2 新增yaml文件

2.3 注册模块

2.4 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1.原理

论文地址:Polarized Self-Attention: Towards High-quality Pixel-wise Regression——点击即可跳转

官方代码:官方代码仓库——点击即可跳转

极化自注意力(Polarized Self-Attention,PSA)是一种针对像素级回归任务设计的注意力机制,旨在提高模型在关键点估计和语义分割等任务上的性能。其主要原理可以概括为以下几点: 1. 极化过滤

  • PSA 将注意力机制应用于输入特征图,将其分为两个分支:通道分支和空间分支。

  • 在通道分支中,PSA 沿着通道维度保持高分辨率,同时将特征图在空间维度上完全折叠,从而减少了计算量和内存占用。

  • 在空间分支中,PSA 沿着空间维度保持高分辨率,同时将特征图在通道维度上完全折叠。

  • 这种“极化”的设计方式有效地保留了高分辨率信息,避免了传统自注意力机制中由于池化或下采样造成的分辨率损失。 2. 非线性增强

  • PSA 在通道分支和空间分支中分别使用了 Softmax 和 Sigmoid 函数的组合来增强非线性。

  • Softmax 函数用于将通道分支中的特征图转化为概率分布,使其更适合表示高斯分布(例如关键点热图)。

  • Sigmoid 函数用于将空间分支中的特征图转化为二值分布,使其更适合表示二项分布(例如分割掩码)。

  • 这种非线性组合的设计能够更好地拟合像素级回归任务的输出分布,从而提高模型的预测精度。

3. 布局灵活

  • PSA 支持两种布局方式:并行和串行。

  • 在并行布局中,通道分支和空间分支的结果直接相加。

  • 在串行布局中,通道分支的结果首先通过空间分支,然后两者相加。

  • 实验表明,两种布局方式在性能上没有显著差异,这表明 PSA 的设计已经充分挖掘了通道和空间维度上的信息。

4. 优势

  • PSA 在不显著增加计算量和内存占用的情况下,能够显著提高像素级回归任务的性能。

  • PSA 的设计能够更好地拟合像素级回归任务的输出分布,从而提高模型的预测精度。

  • PSA 的布局方式灵活,可以根据具体任务进行调整。

总结

PSA 通过“极化”的设计方式,有效地保留了高分辨率信息,并通过非线性增强来拟合像素级回归任务的输出分布,从而显著提高了模型的性能。

2. 将极化自注意力添加到YOLOv5中

2.1 PSA代码实现

关键步骤一:将下面代码粘贴到/yolov5-6.1/models/common.py文件中

class PSA(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))
        self.softmax_channel = nn.Softmax(1)
        self.softmax_spatial = nn.Softmax(-1)
        self.ch_wz = nn.Conv2d(channel // 2, channel, kernel_size=(1, 1))
        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()
​
        # Channel-only Self-Attention
        channel_wv = self.ch_wv(x)  # bs,c//2,h,w
        channel_wq = self.ch_wq(x)  # bs,1,h,w
        channel_wv = channel_wv.reshape(b, c // 2, -1)  # bs,c//2,h*w
        channel_wq = channel_wq.reshape(b, -1, 1)  # bs,h*w,1
        channel_wq = self.softmax_channel(channel_wq)
        channel_wz = torch.matmul(channel_wv, channel_wq).unsqueeze(-1)  # bs,c//2,1,1
        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)  # bs,c,1,1
        channel_out = channel_weight * x
​
        # Spatial-only Self-Attention
        spatial_wv = self.sp_wv(channel_out)  # bs,c//2,h,w
        spatial_wq = self.sp_wq(channel_out)  # bs,c//2,h,w
        spatial_wq = self.agp(spatial_wq)  # bs,c//2,1,1
        spatial_wv = spatial_wv.reshape(b, c // 2, -1)  # bs,c//2,h*w
        spatial_wq = spatial_wq.permute(0, 2, 3, 1).reshape(b, 1, c // 2)  # bs,1,c//2
        spatial_wq = self.softmax_spatial(spatial_wq)
        spatial_wz = torch.matmul(spatial_wq, spatial_wv)  # bs,1,h*w
        spatial_weight = self.sigmoid(spatial_wz.reshape(b, 1, h, w))  # bs,1,h,w
        spatial_out = spatial_weight * channel_out
        return spatial_out

PSA (Polarized Self-Attention) 是一种针对像素级回归任务设计的注意力机制,其主要流程可以分为以下几个步骤:

1. 特征提取

  • 首先,使用卷积神经网络(CNN)对输入图片进行特征提取,得到特征图。特征图包含了图片中每个像素点的特征信息。

2. 极化自注意力

  • 将特征图输入到 PSA 模块进行特征增强。

  • PSA 模块包含两个分支:通道分支和空间分支。

    • 通道分支:沿着通道维度保持高分辨率,同时将特征图在空间维度上完全折叠。

    • 空间分支:沿着空间维度保持高分辨率,同时将特征图在通道维度上完全折叠。

  • 在通道分支和空间分支中,分别使用 Softmax 和 Sigmoid 函数的组合来增强非线性,从而更好地拟合像素级回归任务的输出分布。

3. 输出

  • 将 PSA 模块处理后的特征图输入到解码器中,进行进一步的预测。

  • 解码器会根据具体的任务类型(例如关键点估计或语义分割)生成相应的输出,例如关键点热图或分割掩码。

4. 优化

  • 使用损失函数来评估模型预测结果与真实标签之间的差距。

  • 通过反向传播算法来更新模型参数,从而优化模型的性能。

总结: PSA 的主要流程可以概括为:特征提取 -> 极化自注意力 -> 输出 -> 优化。通过引入 PSA 模块,可以有效地提高模型在像素级回归任务上的性能。

2.2 新增yaml文件

关键步骤二在下/yolov5-6.1/models下新建文件 yolov5_PSA.yaml并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)
   [-1, 1, PSA, [ 512 ]],

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
   [-1, 1, PSA, [ 1024 ]],

   [[17, 21, 25], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

温馨提示:本文只是对yolov5l基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
 
# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
 
# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
 
# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
 
# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

关键步骤三在yolo.py中注册 注册”PSA",

elif m is PSA :
            c1, c2 = ch[f], args[0]
            if c2 != nc:  # if c2 not equal to number of classes (i.e. for Classify() output)
                c2 = make_divisible(c2 * gw, 8)
            args = [c1, *args[1:]]

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_PSA.yaml的路径

建议大家写绝对路径,确保一定能找到

🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享

https://pan.baidu.com/s/1evAM-6V-IPEyOOglheWNMw?pwd=we72

提取码: we72 

4. GFLOPs

关于GFLOPs的计算方式可以查看:百面算法工程师 | 卷积基础知识——Convolution

未改进的GFLOPs

img

改进后的GFLOPs

5. 进阶

和损失函数可能有意外的收获,这非常有趣,快去试试吧

损失函数相关改进:YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocusIoU等多种损失函数——点击即可跳转

6. 总结

PSA 是一种针对像素级回归任务设计的注意力机制,其核心思想是通过“极化”的方式,在保持高分辨率信息的同时,有效地增强特征表示,从而提高模型的预测精度。具体而言,PSA 将注意力机制应用于输入特征图,将其分为通道分支和空间分支。在通道分支中,PSA 沿着通道维度保持高分辨率,同时将特征图在空间维度上完全折叠;在空间分支中,PSA 沿着空间维度保持高分辨率,同时将特征图在通道维度上完全折叠。这种“极化”的设计方式有效地保留了高分辨率信息,避免了传统自注意力机制中由于池化或下采样造成的分辨率损失。此外,PSA 在通道分支和空间分支中分别使用了 Softmax 和 Sigmoid 函数的组合来增强非线性,从而更好地拟合像素级回归任务的输出分布。这种非线性组合的设计能够更好地拟合像素级回归任务的输出分布,例如高斯分布(例如关键点热图)或二项分布(例如分割掩码),从而提高模型的预测精度。最后,PSA 支持两种布局方式:并行和串行,两种布局方式在性能上没有显著差异,这表明 PSA 的设计已经充分挖掘了通道和空间维度上的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rocketmq简易版搭建

今天真是搭了本人六七个钟,太难了 首先是魔法大战镜像,这波大败而归,连上了,可惜没氪金,永远是没拉完就超时,魔法质量不行,等上班赚点米再改良一下魔法类别,那还得继续linux搭建 1…

电脑录屏有水印怎么办 电脑录屏出来为什么画质模糊 camtasia属于什么软件

Camtasia(又叫喀秋莎),作为专业录屏软件,拥有3000多万专业人士在全球范围内使用,多种使用场景,支持更多文件格式,多功能特效剪辑,为您带来独一无二的录屏新体验! 大家在平…

LLaMA-Factory安装

安装代码 https://github.com/echonoshy/cgft-llm/blob/master/llama-factory/README.md https://github.com/hiyouga/LLaMA-Factory/tree/mainLLaMA-Factoryhttps://github.com/hiyouga/LLaMA-Factory/tree/main 【大模型微调】- 使用Llama Factory实现中文llama3微调_哔哩…

uniapp部署服务器,uniapp打包H5部署服务器,uniapp将config.js抽离

目录 步骤一.在static文件夹下新建config.js文件 config.js文件说明 在config.js中放入使用的请求的接口地址,资源路径等 congfig.js中的变量在页面中如何使用 步骤二.manifest.json配置 1.在项目根目录(与app.vue同级)创建template.h5.html文件 2.在manifest.json配置刚刚创…

Unity扩展编辑器功能的特性

1.添加分组标题 用于在Unity的Inspector视图中为属性或变量组创建一个自定义的标题或头部,有助于在Inspector中组织和分类不同的属性,使其更易于阅读和管理。 [Header("Common Properties")] public float MouseSensitivity 5; public float…

Leetcode3192. 使二进制数组全部等于 1 的最少操作次数 II

Every day a Leetcode 题目来源:3192. 使二进制数组全部等于 1 的最少操作次数 II 解法1:遍历 由于 nums[i] 会被其左侧元素的操作影响,所以我们先从最左边的 nums[0] 开始思考。 分类讨论: 如果 nums[0]1,无需反…

CSS Flex弹性布局

一、传统布局与flex布局 1、传统布局 2、flex布局 二、flex布局原理 1、布局原理 2、flex布局体验 三、flex布局父项常见属性 1、常见的父项属性 2、flex-direction设置主轴的方向 3、justify-content 设置主轴上的子元素排列方式 4、flex-wrap 设置子元素是否换行 …

cv实战(一)

目录 前言一、加密解密图像1.常用的算法1.1 空间域加密技术:1.2 基于频域的水印技术:1.3 Arnold变换:1.4 DES与AES算法: 2.实验代码结果 二、数字汉字识别代码结果: 三 物体识别代码结果 四,物块追踪代码结…

【高性能服务器】服务器概述

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 服务器概述 服…

C++ | Leetcode C++题解之第206题反转链表

题目: 题解: class Solution { public:ListNode* reverseList(ListNode* head) {if (!head || !head->next) {return head;}ListNode* newHead reverseList(head->next);head->next->next head;head->next nullptr;return newHead;} …

PD芯片OTG功能的应用 LDR6500

随着科技的飞速发展,智能手机、平板电脑等电子设备已经成为我们日常生活和工作中不可或缺的工具。这些设备的功能日益强大,应用场景也愈发广泛,但随之而来的是对充电和数据传输效率的高要求。在这一背景下,PD(Power De…

DM 的断点续传测试

作者: 大鱼海棠 原文来源: https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三种数据迁移同步方式(task-mode),在all同步模式下,因一些特殊情况,需要变更上游MySQL的数…

OFDM的基本原理

OFDM技术使用相互正交的子载波组成多载波传输数据,此时不存在子载波间干扰和符号间干扰。设采样间隔为 ,正交子载波可以表示为 基带信号a(n)采用矩形脉冲,则OFDM信号用公式可以表示 OFDM信号的N个采样点数据 可以用IFFT简化上述计算&#xf…

(已解决)Adobe Flash Player已不再受支持

文章目录 前言解决方案 前言 一般来说,很少遇到官方网站使用Adobe Flash Player来进行录用名单公示了。但是,今天就偏偏遇到一次, 用谷歌浏览器打不开, 点了没有反应,用其他的浏览器,例如windows自带的那…

英飞凌TC3xx之DMA工作原理及应用实例

英飞凌TC3xx之DMA工作原理及应用实例 1 DMA的架构2 必要的术语解释3 DMA请求3.1 DMA软件请求3.2 DMA硬件请求3.3 DMA 菊花链请求3.4 DMA自动启动请求3.5 总结4 小结DMA是直接存储访问Direct Memory Access的简称。它的唯一职能就是在不需要CPU参与的情况下,将数据从源地址搬运…

正版软件 | R-Drive Image:数据安全守护者,您的智能备份专家

在数字化时代,数据安全的重要性不言而喻。R-Drive Image 是一款功能强大的备份和恢复软件,为您提供了全面的解决方案,确保您的数据安全无忧。 精确备份,全面保护 R-Drive Image 能够创建硬盘驱动器的逐字节副本,无论是…

KBL410-ASEMI智能AI专用整流桥KBL410

编辑:ll KBL410-ASEMI智能AI专用整流桥KBL410 型号:KBL410 品牌:ASEMI 封装:KBL-4 正向电流(Id):4A 反向耐压(VRRM):1000V 正向浪涌电流:2…

2024百度之星第一场-110串

补题链接: 码蹄集 三个状态转移的计数dp 先确定状态 n个数至多修改k次,保证不出现字串“110” 常规想法先把状态确定为dp[n][k][0/1],前n个数,修改k次后,末尾数为0/1,不能转移再换思路。 初始状态设定如…

PySide(PyQt)在图像上画线

1、按鼠标左键任意画线 import sys from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen from PySide6.QtCore import Qt, QPointclass PaintLabel(QLabel):def __init__(self…

python–基础篇–正则表达式–是什么

文章目录 定义一:正则表达式就是记录文本规则的代码定义一:正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。初识 Python 正则表达式 定义一&a…