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

news2024/11/25 16:40:29

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


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


专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转


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

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转

目录

1.原理

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

2.1 PSA代码实现

2.2 更改init.py文件

2.3 添加yaml文件

2.4 在task.py中进行注册

2.5 执行程序

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. 将极化自注意力添加到YOLOv8中

2.1 PSA代码实现

关键步骤一: 将下面代码粘贴到在/ultralytics/ultralytics/nn/modules/block.py中,并在该文件的__all__中添加“PSA”

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 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数

然后在下面的__all__中声明函数

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_PSA.yaml文件,粘贴下面的内容

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [ 0.33, 0.25, 1024 ]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs

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

# YOLOv8.0n head
head:
  - [ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ]
  - [ [ -1, 6 ], 1, Concat, [ 1 ] ]  # cat backbone P4
  - [ -1, 3, C2f, [ 512 ] ]  # 12

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

  - [ -1, 1, Conv, [ 256, 3, 2 ] ]
  - [ [ -1, 12 ], 1, Concat, [ 1 ] ]  # cat head P4
  - [ -1, 3, C2f, [ 512 ] ]  # 18 (P4/16-medium)
  - [ -1, 1, PSA, [ 512 ] ]

  - [ -1, 1, Conv, [ 512, 3, 2 ] ]
  - [ [ -1, 9 ], 1, Concat, [ 1 ] ]  # cat head P5
  - [ -1, 3, C2f, [ 1024 ] ]  # 21 (P5/32-large)
  - [ -1, 1, PSA, [ 1024 ] ]

  - [ [ 15, 19, 23 ], 1, Detect, [ nc ] ]  # Detect(P3, P4, P5)

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


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
 
# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
 
# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
 
# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
 
# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.4 在task.py中进行注册

关键步骤四:在parse_model函数中进行注册,

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(min(c2, max_channels) * width, 8)
            args = [c1, *args[1:]]

2.5 执行程序

关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_PSA.yaml的路径即可

from ultralytics import YOLO
 
# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
 
model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_PSA.yaml')  # build from YAML and transfer weights
 
# Train the model
model.train(device = [3], batch=16)

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

3. 完整代码分享

https://pan.baidu.com/s/1bNQG8yuv5vVIbvJAMTWZ7g?pwd=n8qy

提取码: n8qy 

4. GFLOPs

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

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

可以结合损失函数或者注意力机制进行多重改进

6. 总结

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

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

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

相关文章

STM32F407之SPI(软件)

基础知识: SPI是一种高速的,全双工,同步的通信总线。使用3 条总线及n个片选线(n取决于从机数量),SPI可以一个主机连接单个或多个从机,每个从机都有唯一片选线。 MOSI(主机输出/从机输…

05 Shell编程之免交互

1、Here Document免交互 1.1 Here Document概述 Here Document是一个特殊用途的代码块,它是标准输入的一种替代品, 可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。 Here Documen…

链在一起怎么联机 链在一起远程同玩联机教程

steam中最近特别热门的多人跑酷冒险的游戏:《链在一起》,英文名称叫做Chained Together,在游戏中我们需要开始自己的旅程,在地狱的深处,与我们的同伴被链在一起。我们的任务是通过尽可能高的攀登逃离地狱。每一次跳跃都…

linux中awk,sed, grep使用(待补充)

《linux私房菜》这本书中将sed和awk一同归为行的修改这一点,虽然对,但不利于实际处理问题时的思考。因为这样的话,当我们实际处理问题时,遇到比如说统计文本打印内容时,我们选择sed还是awk进行处理呢? 也因…

2024年天津市安全员C证证模拟考试题库及天津市安全员C证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年天津市安全员C证证模拟考试题库及天津市安全员C证理论考试试题是由安全生产模拟考试一点通提供,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材,天津市安全员C证大纲整理…

联想至像M3070DNA打印机加粉及清零方法

基本参数: 产品类型:黑白激光多功能商用一体机(打印/复印/扫描) 网络功能:支持有线网络打印 最大处理幅面:A4 双面功能:自动 打印速度:30页/分钟(高速激光打印&…

安卓webview内h5页面调用录音设置

h5页面调用录音接口getUserMeia在webview中有可能不成功,进入错误回调,这个时候webview尽可能设置下面这些权限就会好。

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(1)

Hi~ (o^^o)♪, 各位深海王国的同志们,早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督将为大家带来全新系列——小学生都能玩的语音模块,帮你一周内快速学会语音模块的使用方式,打造一个可用于智能家居、物联网领域的语音…

Zabbix 监控系统部署

Zabbix 监控系统部署 Zabbix是一个企业级开源分布式监控解决方案,可监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的运行状况和完整性。 Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的警报。这允许…

高频科技亮相SEMl-e2024第六届深圳国际半导体展,以超纯工艺推动行业发展

6月26-28日,SEMl-e2024第六届深圳国际半导体展在深圳国际会展中心(宝安新馆)隆重举办。本次展会以【“芯”中有“算”智享未来】为主题,汇聚800多家展商,集中展示了集成电路、电子元器件、第三代半导体及产业链材料和设备为一体的半导体产业链,搭建了供需精准对接、探索行业新发…

8大趋势,重塑金融服务行业

谈论“金融服务行业”就像谈论“亚洲大陆”。这是因为,通用行业概念但它掩盖了许多细分领域的细微差别和多样性,以及人们思考、工作和感受方式的巨大差异。 银行应用程序和一个量化交易公司都是金融服务公司,但它们的运营方式可能天壤之别。…

嵌入式计算器模块实现

嵌入式计算器模块规划 计算器混合算法解析 上面我们的算法理论已经完善, 我们只用给一个混合运算式, 计算器就可以帮助我们计算出结果. 但是存在一个痛点, 每次计算算式,都要重新编译程序, 所以我们想到了, 利用单片机, 读取用户输入的按键, 组成算式, 输入给机器, 这样我们就…

Java web应用性能分析之【自定义prometheus监控指标】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…

服务器出现意外情况。(Exception from HRESULT: 0x80010105(RPC E SERVERFAULT))

这种情况一般出现在excel2007版本,下载了什么阅读器之类的 2007改不了这个加载项,需要重装一个其他版本(2010版本可以) 然后如下操作修改为COM加载项

vue 组件下 img 标签动态传入不展示

效果 解决办法&#xff1a; require() <titleComponent:title"业务工作概览":src"require(/assets/imgs/evaluation/overviewStatistics.png)"></titleComponent> 效果&#xff1a;

CVPR 2024最佳论文分享:文本到图像生成的丰富人类反馈

CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;是计算机视觉领域最有影响力的会议之一&#xff0c;主要方向包括图像和视频处理、目标检测与识别、三维视觉等。近期&#xff0c;CVPR 2024公布了最佳论文。共有10篇论文获奖&#xff0c;其…

金融行业专题|某头部期货基于 K8s 原生存储构建自服务数据库云平台

为了进一步提升资源交付效率&#xff0c;不少用户都将数据库应用从物理环境迁移到容器环境。而对于 Kubernetes 部署环境&#xff0c;用户不仅需要考虑数据库在性能方面的需求&#xff0c;还要为数据存储提供更安全、可靠的高可用保障。 近期&#xff0c;某头部期货机构基于 S…

隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件&#xff0c;主要通过钓鱼邮件打开突破口&#xff0c;收集各种信息再回传给攻击者。近期&#xff0c;研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件&#xff0c;最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azu…

系统性掌握C++17容器四件套:std::optional, std::any, std::variant, std::tuple

昨天在写《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候&#xff0c;正好遇到动态反射需要的类型擦除技术。所谓的类型擦除&#xff0c;就是在两个模块之间的接口层没有任何类型信息&#xff0c;实现两个模块之间安全的通信。可以理…

QT控制comboBox切换方法

目录 1. 效果2. 操作 1. 效果 如下图&#xff1a; 点击全切换雨天模式按钮 则 comboBox 文本显示为 “雨天模式”点击全切换正常模式按钮 则 comboBox 文本显示为 “雨天模式” 切换到 雨天模式 切换到 正常模式 2. 操作 使用 “setCurrentIndex” 方法&#xff0c;切换 combo…