YOLOv9改进策略:注意力机制 | 极化自注意力Polarized Self-Attention,效果秒杀CBAM、SE

    💡💡💡本文改进内容:本文针对Pixel-wise regression的任务,提出了一种更加精细的双重注意力机制——极化自注意力(Polarized Self-Attention),效果优于CBAM、SE等经典注意力。

yolov9-c-CoordAtt summary: 972 layers, 51024476 parameters, 51024444 gradients, 238.9 GFLOPs

 改进结构图如下:

YOLOv9魔术师专栏

☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️

包含注意力机制魔改、卷积魔改、检测头创新、损失&IOU优化、block优化&多层特征融合、 轻量级网络设计、24年最新顶会改进思路、原创自研paper级创新等

☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️

✨✨✨ 新开专栏暂定免费限时开放,后续每月调价一次✨✨✨

🚀🚀🚀 本项目持续更新 | 更新完结保底≥50+ ,冲刺100+🚀🚀🚀

🍉🍉🍉 联系WX: AI_CV_0624 欢迎交流!🍉🍉🍉

YOLOv9魔改:注意力机制、检测头、blcok魔改、自研原创等

 YOLOv9魔术师

💡💡💡全网独家首发创新(原创),适合paper !!!

💡💡💡 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你上手魔改网络 !!!

💡💡💡重点:通过本专栏的阅读,后续你也可以设计魔改网络,在网络不同位置(Backbone、head、detect、loss等)进行魔改,实现创新!!!

 1.YOLOv9原理介绍

论文: 2402.13616.pdf (arxiv.org)

代码:GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information摘要: 如今的深度学习方法重点关注如何设计最合适的目标函数,从而使得模型的预测结果能够最接近真实情况。同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。然而,现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。因此,YOLOv9 深入研究了数据通过深度网络传输时数据丢失的重要问题,即信息瓶颈和可逆函数。作者提出了可编程梯度信息(programmable gradient information,PGI)的概念,来应对深度网络实现多个目标所需要的各种变化。PGI 可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。此外,研究者基于梯度路径规划设计了一种新的轻量级网络架构,即通用高效层聚合网络(Generalized Efficient Layer Aggregation Network,GELAN)。该架构证实了 PGI 可以在轻量级模型上取得优异的结果。研究者在基于 MS COCO 数据集的目标检测任务上验证所提出的 GELAN 和 PGI。结果表明,与其他 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。对于 PGI 而言,它的适用性很强,可用于从轻型到大型的各种模型。我们可以用它来获取完整的信息,从而使从头开始训练的模型能够比使用大型数据集预训练的 SOTA 模型获得更好的结果。对比结果如图1所示。

 YOLOv9框架图

1.1 YOLOv9框架介绍

YOLOv9各个模型介绍

  2. Polarized Self-Attention

 论文:https://export.arxiv.org/pdf/2107.00782.pdf

        Polarized self-attention是一种改进的自注意力机制,旨在提高自注意力模型的效率和准确性。传统的自注意力机制通常需要计算所有位置对所有位置的注意力,这会导致计算复杂度的增加和模型的训练时间的延长。Polarized self-attention通过引入极化因子来减少需要计算的位置对之间的注意力,从而提高自注意力模型的效率。极化因子是一个向量,可以将其与每个位置的向量点积,以确定哪些位置需要进行注意力计算。这种方法可以通过在保持准确度的同时减少计算量来提高自注意力模型的效率。 

        基于双重注意力机制,本文针对Pixel-wise regression的任务,提出了一种更加精细的双重注意力机制——极化自注意力(Polarized Self-Attention)。作为一个即插即用的模块,在人体姿态估计和语义分割任务上,作者将它用在了以前的SOTA模型上,并达到了新的SOTA性能,霸榜COCO人体姿态估计和Cityscapes语义分割。

        注意力机制是一个被广泛应用在各种CV任务中的方法。注意力机制根据施加的维度大致可以分为两类:通道注意力和空间注意力。对于通道注意力机制,代表性的工作有SENet、ECANet;对于空间注意力机制,代表性的工作有Self-Attention。随着空间和通道注意力机制的提出,很自然的,结合空间和通道两个维度的双重注意力机制也被提出,代表工作有CBAM,DANet。      

          作者提出了一个即插即用的模块——极化自注意力机制( Polarized Self-Attention(PSA)),用于解决像素级的回归任务,相比于其他注意力机制,极化自注意力机制主要有两个设计上的亮点:

1)极化滤波( Polarized filtering):在通道和空间维度保持比较高的resolution(在通道上保持C/2的维度,在空间上保持[H,W]的维度 ),这一步能够减少降维度造成的信息损失;

2)增强(Enhancement):组合非线性直接拟合典型细粒度回归的输出分布。

        

3.Polarized Self-Attention加入到YOLOv9

3.1新建py文件,路径为models/attention/attention.py


###################### PolarizedSelfAttention     ####     start   by  AI&CV  ###############################
from torch import nn
from torch.nn import initclass PolarizedSelfAttention(nn.Module):def __init__(self,c1, 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(x)  # bs,c//2,h,wspatial_wq = self.sp_wq(x)  # 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 * xout = spatial_out + channel_outreturn out###################### PolarizedSelfAttention    ####     end   by  AI&CV  ###############################

3.2修改yolo.py

1)首先进行引用

from models.attention.attention import *

2)修改def parse_model(d, ch):  # model_dict, input_channels(3)

在源码基础上加入PolarizedSelfAttention

        elif m is nn.BatchNorm2d:args = [ch[f]]###attention #####elif m in {EMA_attention,CoordAtt,PolarizedSelfAttention}:c2 = ch[f]args = [c2, *args]###attention #####

3.3 yolov9-c-PolarizedSelfAttention.yaml

# YOLOv9# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
#activation: nn.LeakyReLU(0.1)
#activation: nn.ReLU()# anchors
anchors: 3# YOLOv9 backbone
backbone:[[-1, 1, Silence, []],  # conv down[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 2-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 3# avg-conv down[-1, 1, ADown, [256]],  # 4-P3/8# elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 5# avg-conv down[-1, 1, ADown, [512]],  # 6-P4/16# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 7# avg-conv down[-1, 1, ADown, [512]],  # 8-P5/32# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 9[-1, 1, PolarizedSelfAttention, [512]],  # 10]# YOLOv9 head
head:[# elan-spp block[-1, 1, SPPELAN, [512, 256]],  # 11# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 7], 1, Concat, [1]],  # cat backbone P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 14# up-concat merge[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 5], 1, Concat, [1]],  # cat backbone P3# elan-2 block[-1, 1, RepNCSPELAN4, [256, 256, 128, 1]],  # 17 (P3/8-small)# avg-conv-down merge[-1, 1, ADown, [256]],[[-1, 14], 1, Concat, [1]],  # cat head P4# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 20 (P4/16-medium)# avg-conv-down merge[-1, 1, ADown, [512]],[[-1, 11], 1, Concat, [1]],  # cat head P5# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 23 (P5/32-large)# multi-level reversible auxiliary branch# routing[5, 1, CBLinear, [[256]]], # 24[7, 1, CBLinear, [[256, 512]]], # 25[9, 1, CBLinear, [[256, 512, 512]]], # 26# conv down[0, 1, Conv, [64, 3, 2]],  # 27-P1/2# conv down[-1, 1, Conv, [128, 3, 2]],  # 28-P2/4# elan-1 block[-1, 1, RepNCSPELAN4, [256, 128, 64, 1]],  # 29# avg-conv down fuse[-1, 1, ADown, [256]],  # 30-P3/8[[24, 25, 26, -1], 1, CBFuse, [[0, 0, 0]]], # 31  # elan-2 block[-1, 1, RepNCSPELAN4, [512, 256, 128, 1]],  # 32# avg-conv down fuse[-1, 1, ADown, [512]],  # 33-P4/16[[25, 26, -1], 1, CBFuse, [[1, 1]]], # 34 # elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 35# avg-conv down fuse[-1, 1, ADown, [512]],  # 36-P5/32[[26, -1], 1, CBFuse, [[2]]], # 37# elan-2 block[-1, 1, RepNCSPELAN4, [512, 512, 256, 1]],  # 38# detection head# detect[[32, 35, 38, 17, 20, 23], 1, DualDDetect, [nc]],  # DualDDetect(A3, A4, A5, P3, P4, P5)]

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

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

相关文章

R语言实现中介分析(1)

中介分析,也称为介导分析,是统计学中的一种方法,它用于评估一个或多个中介变量(也称为中间变量)在自变量和因变量之间关系中所起的作用。换句话说,中介分析用于探索自变量如何通过中介变量影响因变量的机制…

docker login 阿里云失败??

docker login 阿里云失败?? 首先参考 阿里云官方文档《Docker登录、推送和拉取失败常见问题》 看看是否是下面提到的情况: 我遇到的情况是超时: [rootk8snode1 software]# sudo docker login --usernametyleryun registry.cn-hangzhou.ali…

【leetcode热题】比较版本号

难度&#xff1a; 中等通过率&#xff1a; 22.1%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 比较两个版本号 version1 和 version2。 如果 version1 > version2 返回 1&#xff0c;如果 version1 < version2 返回 -1&#xff0c; 除此之外…

StarRocks 易用性全面提升:数据导入可以如此简单

作为新一代分析型数据库&#xff0c;StarRocks 一直因性能卓越、功能全面而深受广大用户喜爱。在追求功能和性能的同时&#xff0c;易用性方面&#xff0c;StarRocks 也在一直围绕一线运维人员的作业细节持续提升&#xff0c;尤其从 V3.0 起&#xff0c;社区投入大量开发资源全…

数据仓库的设计开发应用(三)

目录 五、数据仓库的实施&#xff08;一&#xff09;数据仓库的创建&#xff08;二&#xff09;数据抽取转换加载 六、数据仓库系统的开发&#xff08;一&#xff09;开发任务&#xff08;二&#xff09;开发方法&#xff08;三&#xff09;系统测试 七、数据仓库系统的应用&am…

Jenkins: 配置自动化发布脚本

Jenkins 配置自动化发布脚本 在Jenkins的 一个工程项目任务中, 点击左侧 配置 栏在下面的 Build Steps 中&#xff0c;点击上面的 可用的环境变量列表 找到里面有一个 WORKSPACE 的变量这个变量指向我们的jenkins下工程项目源码的目录需要把这个变量利用起来 在 Build Steps 下…

Spring Web MVC入门(2)

学习Spring MVC Postman介绍 在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题. 那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman. 界面介绍: 传参的介绍 1.普通传参, 也就…

0基础 三个月掌握C语言(11)

字符函数和字符串函数 为了方便操作字符和字符串 C语言标准库中提供了一系列库函数 接下来我们学习一下这些函数 字符分类函数 C语言提供了一系列用于字符分类的函数&#xff0c;这些函数定义在ctype.h头文件中。这些函数通常用于检查字符是否属于特定的类别&#xff0c;例如…

阿里EMO模型:AI生成表情丰富的视频

引言 在数字多媒体的时代&#xff0c;人们对于互动性和个性化视频内容的需求不断增长。阿里巴巴的EMO&#xff08;Emote Portrait Alive&#xff09;模型&#xff0c;作为一项前沿的人工智能技术&#xff0c;正引领着这一领域的革新之路。 EMO模型概述 EMO模型是阿里巴巴智能计…

纽约时报起诉OpenAI和微软将决定未来LLM的发展

《纽约时报》诉OpenAI和微软案对未来LLM发展的重大影响 案件背景 《纽约时报》(NYT)近期对OpenAI和微软提起诉讼&#xff0c;指控OpenAI未经授权使用其受版权保护的内容来训练其AI模型&#xff0c;包括ChatGPT。NYT声称&#xff0c;OpenAI使用了数百万篇其文章&#xff0c;这…

linux下重启ORACLE

切换到oracle用户 su - oracle 登录oracle sqlplus / as sysdba 启动数据库 startup 退出数据库 exit 启动监听 lsnrctl start FINISH

论文阅读——Rein

Stronger, Fewer, & Superior: Harnessing Vision Foundation Models for Domain Generalized Semantic Segmentation 一、引言 是一个对Domain Generalized Semantic Segmentation (DGSS)任务的视觉大模型的微调方法&#xff0c;即Rein。 Rein 专为 DGSS 任务量身定制&a…

matlab 眼球图像处理血管提取

1、内容简介 略 69-可以交流、咨询、答疑 2、内容说明 眼球图像处理血管提取 lab颜色空间提取眼球边缘、形态学操作 八邻域搜索算法 pUnImage&#xff0c;任意一点的坐标记为p(x,y),该点周围八邻域点的坐标记为p0(x,y)&#xff0c;p1(x,y)&#xff0c;p2(x,y)&#xff0c;…

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

【AI】实现在本地Mac,Windows和Mobile上运行Llama2模型

【AI】实现在本地Mac,Windows和Mobile上运行Llama2模型 目录 【AI】实现在本地Mac,Windows和Mobile上运行Llama2模型**Llama 2模型是什么?****技术规格和能力****Llama 2中的专门模型****在人工智能开发中的意义****如何在本地使用Llama 2运行Llama.cpp****Llama.cpp的设置*…

【Redis】基于Redis实现查询缓存

1.缓存更新策略 主动更新用的最多。  主动更新一般是由缓存的调用者&#xff0c;在更新数据库的同时&#xff0c;更新缓存。 操作缓存和数据库时有三个问题需要考虑&#xff1a; 删除缓存还是更新缓存&#xff1f; 更新缓存&#xff1a;每次更新数据库都更新缓存&#xff0…

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

有向图的DFS(c++题解)

题目描述 给定一个有向图(不一定连通)&#xff0c;有N个顶点&#xff0c;M条边&#xff0c;顶点从1..N依次编号&#xff0c;求出字典序最小的深度优先搜索顺序。 输入格式 第1行&#xff1a;2个整数&#xff0c;N&#xff08;1≤N≤200&#xff09;和M&#xff08;2≤M≤500…

2核4g服务器够用吗?

2核4G服务器够用吗&#xff1f;够用。阿腾云以2核4G5M服务器搭建网站为例&#xff0c;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&am…

C#使用Entity Framework Core处理数据库(三)

Entity Framework Core&#xff08;EF Core&#xff09;是一个轻量级、跨平台的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;用于在.NET应用程序中处理数据库操作。它提供了一种将数据库中的数据映射到.NET对象模型的方法&#xff0c;使开发人员可以使用面向对象的…