YOLOv5、YOLOv8改进:S2注意力机制

目录

1.简介

2.YOLOv5改进

2.1增加以下S2-MLPv2.yaml文件

2.2common.py配置

2.3yolo.py配置


1.简介

 S2-MLPv2注意力机制

请添加图片描述

 

最近,出现了基于 MLP 的视觉主干。与 CNN 和视觉Transformer相比,基于 MLP 的视觉架构具有较少的归纳偏差,在图像识别方面实现了有竞争力的性能。其中,spatial-shift MLP (S2-MLP),采用直接的空间位移操作,取得了比包括 MLP-mixer 和 ResMLP 在内的开创性工作更好的性能。使用具有金字塔结构的较小补丁,视觉置换器 (ViP) 和Global Filter Network (GFNet) 实现了比 S2-MLP 更好的性能。

在本文中,我们改进了 S2-MLP 视觉主干。我们沿通道维度扩展特征图,并将扩展后的特征图分成几个部分。我们对分割部分进行不同的空间移位操作。

本文对空间移位MLP (S2-MLP)模型进行了改进,提出了S2-MLPv2模型。将feature map进行扩展,并将扩展后的feature map分为三部分。它将每个部分单独移动,然后通过split-attention融合分开的特征图。同时,我们利用层次金字塔来提高其建模细粒度细节的能力,以获得更高的识别精度。在没有外部训练数据集的情况下,采用224×224的images,我们的s2-mlv2-medium模型在ImageNet1K数据集上取得了83.6%的top-1准确率,这是目前基于MLP的方法中最先进的性能。同时,与基于transformer的方法相比,我们的S2-MLPv2模型在不需要自我注意的情况下,参数更少,达到了相当的精度。

        与基于MLP的先驱作品如MLP-Mixer、ResMLP以及最近类似MLP的模型如Vision Permutator和GFNet相比,空间移位MLP的另一个重要优势是,空间移位MLP的形状对图像的输入尺度是不变的。因此,经过特定尺度图像预训练的空间移位MLP模型可以很好地应用于具有不同尺寸输入图像的下游任务。未来的工作将致力于不断提高空间移位MLP体系结构的图像识别精度。一个有希望且直接的方向是尝试更小尺寸的patch和更高级的四层金字塔,如CycleMLP和AS-MLP,以进一步减少FLOPs和缩短基于transformer模型之间的识别差距。
 

 S2注意力机制(S2 Attention Mechanism)是一种用于序列建模和注意力机制改进的方法,特别在自然语言处理(NLP)领域中得到广泛应用。它是对传统的自注意力机制(self-attention)进行改进,旨在提高序列中不同位置之间的关联性建模能力。

  1. 自注意力机制回顾: 自注意力机制是一种用于处理序列数据的方法,最早在Transformer模型中提出并广泛用于NLP任务中。在自注意力机制中,序列中的每个位置都可以与其他所有位置进行交互,以便捕获位置之间的关系。然而,这种全局的交互可能会导致计算复杂度的增加,并且可能过于强调距离较近的位置。

  2. S2注意力机制的改进: S2注意力机制引入了一种分段结构,将序列分为不同的段(segments)。每个段内的位置之间可以进行交互,但不同段之间的交互被限制。这种分段结构在捕获长距离依赖关系时更加高效,因为不同段之间的关联性通常较弱。

  3. 注意力计算: 在S2注意力中,注意力权重的计算仍然涉及对查询(query)、键(key)和值(value)的操作。不同之处在于,每个段的注意力计算是独立的,而不同段之间的注意力权重设为固定值(通常为0)。

  4. 优势与应用: S2注意力机制的主要优势是在捕获序列中的长距离依赖关系时表现更加高效。这在处理长文本或长序列时特别有用,可以减少计算成本,同时提高建模性能。S2注意力机制在机器翻译、文本生成、命名实体识别等NLP任务中都有应用,以更好地处理长文本的关系建模。

2.YOLOv5改进

2.1增加以下S2-MLPv2.yaml文件

# parameters
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # 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, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 23 (P5/32-large)[-1, 1, S2Attention, [1024]], #修改[[17, 20, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

2.2common.py配置

./models/common.py文件增加以下模块

import numpy as np
import torch
from torch import nn
from torch.nn import init# https://arxiv.org/abs/2108.01072
def spatial_shift1(x):b,w,h,c = x.size()x[:,1:,:,:c//4] = x[:,:w-1,:,:c//4]x[:,:w-1,:,c//4:c//2] = x[:,1:,:,c//4:c//2]x[:,:,1:,c//2:c*3//4] = x[:,:,:h-1,c//2:c*3//4]x[:,:,:h-1,3*c//4:] = x[:,:,1:,3*c//4:]return xdef spatial_shift2(x):b,w,h,c = x.size()x[:,:,1:,:c//4] = x[:,:,:h-1,:c//4]x[:,:,:h-1,c//4:c//2] = x[:,:,1:,c//4:c//2]x[:,1:,:,c//2:c*3//4] = x[:,:w-1,:,c//2:c*3//4]x[:,:w-1,:,3*c//4:] = x[:,1:,:,3*c//4:]return xclass SplitAttention(nn.Module):def __init__(self,channel=512,k=3):super().__init__()self.channel=channelself.k=kself.mlp1=nn.Linear(channel,channel,bias=False)self.gelu=nn.GELU()self.mlp2=nn.Linear(channel,channel*k,bias=False)self.softmax=nn.Softmax(1)def forward(self,x_all):b,k,h,w,c=x_all.shapex_all=x_all.reshape(b,k,-1,c) a=torch.sum(torch.sum(x_all,1),1) hat_a=self.mlp2(self.gelu(self.mlp1(a))) hat_a=hat_a.reshape(b,self.k,c) bar_a=self.softmax(hat_a) attention=bar_a.unsqueeze(-2) out=attention*x_all out=torch.sum(out,1).reshape(b,h,w,c)return outclass S2Attention(nn.Module):def __init__(self, channels=512 ):super().__init__()self.mlp1 = nn.Linear(channels,channels*3)self.mlp2 = nn.Linear(channels,channels)self.split_attention = SplitAttention()def forward(self, x):b,c,w,h = x.size()x=x.permute(0,2,3,1)x = self.mlp1(x)x1 = spatial_shift1(x[:,:,:,:c])x2 = spatial_shift2(x[:,:,:,c:c*2])x3 = x[:,:,:,c*2:]x_all=torch.stack([x1,x2,x3],1)a = self.split_attention(x_all)x = self.mlp2(a)x=x.permute(0,3,1,2)return x

2.3yolo.py配置

在 models/yolo.py文件夹下

定位到parse_model函数中,新增以下代码

elif m is S2Attention:c1, c2 = ch[f], args[0]if c2 != no:c2 = make_divisible(c2 * gw, 8)

以上就修改完成了

又遇到的问题欢迎评论区留言讨论

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

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

相关文章

LVS-DR+keepalived实现高可用负载群集

VRRP 通信原理: VRRP就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选的一种协议机制,来将路由交给某台VRRP路由。 VRRP用IP多播的方式(多播地址224.0.0.18)来实现高可用的通信&…

基于STM32+OneNet设计的物联网智慧路灯

一、前言 近年来,构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示,全球已启动或在建的智慧城市有1000多个,中国在建500个,远超排名第二的欧洲(90个)。从在建智慧城市的…

Android oaid

官方GitHub地址 https://github.com/gzu-liyujiang/Android_CN_OAID 生成和用途介绍 https://www.jianshu.com/p/1c7ef27d6db4 图片来源于上述网站 其他关于id的介绍 https://www.cnblogs.com/chenKnowledgeConllection/p/17380960.html https://zhuanlan.zhihu.com/p/55…

微信小程序拉起支付报: 调用支付JSAPI缺少参数: total_fee

1. 调用支付JSAPI缺少参数: total_fee 2. 检查返回给前端调起支付的参数是否正确 一开始是params.put("package", prepay_id); 回来改回params.put("package", "prepay_id"prepay_id);

leetcode 415.字符串相加

⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/add-strings/description/ ps: 从两个字符串的末尾开始遍历,依次相加,若大于等于 10 则使用一个变量记录进位,遍历的时候若两个字符串其中一…

ASR(自动语音识别)任务中的LLM(大语言模型)

一、LLM大语言模型的特点 二、大语言模型在ASR任务中的应用 浅度融合 浅层融合指的是LLM本身并没有和音频信息进行直接计算。其仅对ASR模型输出的文本结果进行重打分或者质量评估。 深度融合 LLM与ASR模型进行深度结合,统一语音和文本的编码空间或者直接利用ASR…

OKCC在系统安全方面做了哪些措施?

语音通信行业,运营者普遍比较关心的问题是,运营风险如何控制?运营安全如何保证?OKCC呼叫中心又有那些风控措施来保证运营安全。 当前阶段,语音通信运营,最主要的风险主要包括以下几个方面: 一、…

无涯教程-Perl - wait函数

描述 该函数等待子进程终止,返回已故进程的进程ID。进程的退出状态包含在$?中。 语法 以下是此函数的简单语法- wait返回值 如果没有子进程,则此函数返回-1,否则将显示已故进程的进程ID Perl 中的 wait函数 - 无涯教程网无涯教程网提供描述该函数等待子进程终止,返回已故…

Three.js 实现模型材质局部辉光效果和解决辉光影响场景背景图显示的问题

1.Three.js 实现模型材质局部辉光效果 2.解决辉光效果影响场景背景图显示的问题 相关API的使用: 1. EffectComposer(渲染后处理的通用框架,用于将多个渲染通道(pass)组合在一起创建特定的视觉效果) 2. …

Java-运算符和控制语句(上)(基于c语言的补充)

算术运算符 关于求余 不管分子,分母是正还是负,对于分母,直接取正;对于分子若有负号,则先提取出来;剩下两个正的分子分母运算;最后,若刚才的分子有负号,对最后的结果添加…

Java版 招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计tbms

​ 项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以…

scala中json4s 使用详解

预备知识 json4s的数据结构AST (Abstract Syntax Tree)。 sealed abstract class JValue case object JNothing extends JValue // zero for JValue case object JNull extends JValue case class JString(s: String) extends JValue case class JDouble(num: Double) extend…

数字化时代,数据仓库和商业智能BI系统演进的五个阶段

数字化在逐渐成熟的同时,社会上也对数字化的性质有了进一步认识。当下,数字化除了前边提到的将复杂的信息、知识转化为可以度量的数字、数据,在将其转化为二进制代码,引入计算机内部,建立数据模型,统一进行…

CAS 一些隐藏的知识,您了解吗

目录 ConcurrentHashMap 一定是线程安全的吗 CAS 机制的注意事项 使用java 并行流 ,您要留意了 ConcurrentHashMap 在JDK1.8中ConcurrentHashMap 内部使用的是数组加链表加红黑树的结构,通过CASvolatile或synchronized的方式来保证线程安全的,这些原理…

TikTok或将于8月底关闭半闭环、速卖通或将推出“半托管”模式

《出海周报》是运营坛为外贸企业主和外贸人独家打造的重要资讯栏目,聚焦企业出海、海外市场动态、海外监管政策等方面,以简捷的方式,提升读者获取资讯的效率。 接下来运营坛为大家带来第15期出海周报,快来看看这周国内外市场发生了…

C++--红黑树

1.什么是红黑树 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因…

【Unity细节】Unity中的层级LayerMask

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页

传统的XML分页以及模糊查询操作 传统的XML方式只能使用limit以及offset进行分页&#xff0c;通过判断name和bindState是否为空&#xff0c;不为空则拼接条件。 List<SanitationCompanyStaff> getSanitationStaffInfo(Param("name") String name,Param("bi…

前端---需要了解浏览器相关知识--浏览器请求服务器资源---缓存

知识点1: 掘金1&#xff1a;浏览器缓存 掘金2 :浏览器缓存 一、浏览器缓存 请求&#xff08;静态资源 &#xff5c; 动态资源&#xff09; 一、缓存是什么&#xff1f; 如果没有缓存的机制 每次都要重新请求静态资源 1.从网络上的下载时间&#xff0c;肯定大于从硬盘里读的…

【S32K 进阶之旅】S32K 芯片的解锁

在使用 S32K1xx MCU 的过程中&#xff0c;因为某些不当操作导致芯片被锁、加密的情况偶有发生&#xff0c;在此总结一篇如何解锁芯片的文档&#xff0c;希望能够帮到有需要的人。 1. S32K 芯片被锁的现象及原因分析1&#xff09;在S32K 系列 MCU 开发和生产过程中&#xff…