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

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


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


专栏目录: 《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-Attentionchannel_wv = self.ch_wv(x)  # bs,c//2,h,wchannel_wq = self.ch_wq(x)  # bs,1,h,wchannel_wv = channel_wv.reshape(b, c // 2, -1)  # bs,c//2,h*wchannel_wq = channel_wq.reshape(b, -1, 1)  # bs,h*w,1channel_wq = self.softmax_channel(channel_wq)channel_wz = torch.matmul(channel_wv, channel_wq).unsqueeze(-1)  # bs,c//2,1,1channel_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,1channel_out = channel_weight * x
​# Spatial-only Self-Attentionspatial_wv = self.sp_wv(channel_out)  # bs,c//2,h,wspatial_wq = self.sp_wq(channel_out)  # bs,c//2,h,wspatial_wq = self.agp(spatial_wq)  # bs,c//2,1,1spatial_wv = spatial_wv.reshape(b, c // 2, -1)  # bs,c//2,h*wspatial_wq = spatial_wq.permute(0, 2, 3, 1).reshape(b, 1, c // 2)  # bs,1,c//2spatial_wq = self.softmax_spatial(spatial_wq)spatial_wz = torch.matmul(spatial_wq, spatial_wv)  # bs,1,h*wspatial_weight = self.sigmoid(spatial_wz.reshape(b, 1, h, w))  # bs,1,h,wspatial_out = spatial_weight * channel_outreturn 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.mzph.cn/pingmian/37675.shtml

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

相关文章

高精密机械设备中滚珠导轨的表面处理工艺有哪些?

滚珠导轨是机床传动和定位的传动元件,其表面处理方式对机床性能和使用寿命起着决定性的作用,不同的表面处理方法可以提高导轨的耐磨性、抗腐蚀性和整体性能。那么,滚珠导轨的表面处理方式有哪几种呢? 1、磨削法:磨削技…

AFLNet入门教学——安装(Ubuntu22.04.4)

1、AFLNet简介 AFLNet 是一种专门用于测试网络协议实现的模糊测试工具。模糊测试是一种软件测试技术,通过向目标程序提供大量随机或半随机数据来发现潜在的漏洞和错误。AFLNet 的设计目标是增强 AFL (American Fuzzy Lop) 的功能,以更有效地测试网络协议…

input子系统学习(一)

1、输入子系统框架 2、编写一个简单的设备驱动层代码 #include<linux/module.h> #include<linux/init.h> #include<linux/input.h> #include<linux/time.h>struct input_dev *my_input_dev;static void timer_function(struct timer_list *t); DEFINE…

中医背诵笔记(黄帝内经、伤寒论等)

目录 黄帝内经上古天真论今人和古人之差异&#xff08;精神内守&#xff0c;病安从来&#xff1f;&#xff09;男女每个年龄阶段身体状态至人、圣人、贤人 宣明五气篇五脏所藏 与 五脏所主七情与情绪与气的关系 天干地支天干地支与脏腑经络的关系 伤寒论六种伤寒组合及对应的药…

一款轻量级的通信协议---MQTT (内含Linux环境搭建)

目录 MQTT MQTT的关键特点&#xff1a; 应用场景 Linux环境搭建&#xff1a; 1. 安装mosquitto 2. Linux下客户端进行通信 3. PC端和Linux下进行通信 安装MQTT. fx 4. MQTT.fx的使用 1. 点击连接 ​编辑 2. 连接成功 3. 订阅主题或者给别的主题发送消息 遇到的问…

(项目实战)聚合支付系统开发环境搭建-基于VMware17安装Centos7.9

1 开发环境介绍 dtpay聚合支付系统和ecard预付卡系统&#xff0c;服务端部署在Linux环境。后续的开发环境&#xff0c;生产环境都是基于Linux进行搭建&#xff0c;系统使用到的相关中间件(RocketMQ,Redis&#xff0c;Nginx等)&#xff0c;配置中心Nacos&#xff0c;数据库MySQ…

Emp.dll文件丢失?理解Emp.dll重要性与处理常见问题

在繁多的动态链接库&#xff08;DLL&#xff09;文件中&#xff0c;emp.dll 可能不是最广为人知的&#xff0c;但在特定软件或环境中&#xff0c;它扮演着关键角色。本文旨在深入探讨 emp.dll 的功能、重要性以及面对常见问题时的解决策略。 什么是 emp.dll&#xff1f; Emp.d…

python 第6册 辅助excel 002 批量创建非空白的 Excel 文件

---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法&#xff0c;从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码&#xff08;A002.py 文件&#xff0…

【STM32】在标准库中使用定时器

1.TIM简介 STM32F407系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器。通常情况下&#xff0c;先看定时器挂在哪个总线上APB1或者APB2&#xff0c;然后定时器时钟需要在此基础上乘以2。 2.标准库实现定时中断 #ifndef __BSP_TIMER_H #define __BSP_TIMER_H#if…

2.1 大语言模型的训练过程 —— 《带你自学大语言模型》系列

《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a; 带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xff1f;1.2 如何让…

基于MDEV的PCI设备虚拟化DEMO实现

利用周末时间做了一个MDEV虚拟化PCI设备的小试验&#xff0c;简单记录一下&#xff1a; DEMO架构&#xff0c;此图参考了内核文档&#xff1a;Documentation/driver-api/vfio-mediated-device.rst host kernel watchdog pci driver: #include <linux/init.h> #include …

【网络架构】keepalive

目录 一、keepalive基础 1.1 作用 1.2 原理 1.3 功能 二、keepalive安装 2.1 yum安装 2.2 编译安装 三、配置文件 3.1 keepalived相关文件 3.2 主配置的组成 3.2.1 全局配置 3.2.2 配置虚拟路由器 四、实际操作 4.1 lvskeepalived高可用群集 4.2 keepalivedngi…

AI视界引擎 | ​基于 YOLOv8 和计算机视觉 CV 的实时识别系统!

本文来源公众号“AI视界引擎”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;​基于 YOLOv8 和计算机视觉 CV 的实时识别系统&#xff01; 技术进步和创新正在尽可能地推进作者的日常生活&#xff0c;但仍有很大一部分社会群体因为…

自研Eclipse插件的生成及安装和使用

说明&#xff1a; 本处是使用个人自研的Eclipse插件为例&#xff0c;创建了一个菜单式的插件组&#xff0c;插件组下&#xff0c;有一个生成右击Jakarta EE服务端点类后&#xff0c;生成端点对应的Restful客户端。有什么问题&#xff0c;欢迎大家交流&#xff01;&#xff01;…

cython 笔记

数据类型 # bool 类型 // bool_type_ptactice.pyx cdef bint a 123 # 非0 为 真 &#xff0c; 0 为假 cdef bint b -123 cdef bint c 0 py_a a # cdef 定义的内容没法直接在python中直接引用 py_b b py_c c// main.py import pyximport pyximport.install(language_le…

教您设置打开IDM下载浮动条的快捷键 全网最强下载神器idm怎么使用教程 idm浮动条不显示怎么办

很多人都知道Internet Download Manager(以下简称IDM)是一款非常优秀的下载提速软件。它功能强大&#xff0c;几乎能下载网页中的所有数据&#xff08;包括视频、音频、图片等&#xff09;&#xff0c;且适用于现在市面上几乎所有的浏览器&#xff0c;非常受大家欢迎。 在使用I…

面向对象和面向过程编程的区别

引言 小伙伴们&#xff0c;当你们看到这章的时候&#xff0c;显然你们已经跨过了来自指针给你们带来的麻烦&#xff0c;唔~真棒呢&#xff0c;但是我们只学会一些基础的C语法并不能帮我们解决问题&#xff0c;甚至是稍微难一些的题目我们都没办法解决&#xff0c;那怎么办呢&am…

多机调度问题

#include<iostream> #include<string> using namespace std; struct work {int time;int number; }; int setwork0(int m,int n,int a[],struct work w[]) {int maxtime0;for(int i1; i<m; i){cout<<i<<"号设备处理作业"<<w[i].num…

python系列30:各种爬虫技术总结

1. 使用requests获取网页内容 以巴鲁夫产品为例&#xff0c;可以用get请求获取内容&#xff1a; https://www.balluff.com.cn/zh-cn/products/BES02YF 对应的网页为&#xff1a; 使用简单方法进行解析即可 import requests r BES02YF res requests.get("https://www.…

YOLOv8改进 | 卷积模块 | 分布移位卷积DSConv替换Conv

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效…