YOLOv8改进 | 注意力机制 | 结合静态和动态上下文信息的注意力机制

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


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


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


上下文Transformer(CoT)块是一种新颖的Transformer风格模块,用于视觉识别。它充分利用输入键之间的上下文信息来指导动态注意力矩阵的学习,从而加强了视觉表示的能力。CoT块首先通过3×3卷积对输入键进行上下文化编码,得到输入的静态上下文表示。然后,将编码后的键与输入查询连接起来,通过两个连续的1×1卷积来学习动态的多头注意力矩阵。最后,将静态和动态上下文表示的融合作为输出。CoT块可以轻松替换ResNet架构中的每个3×3卷积,产生一个名为上下文Transformer网络(CoTNet)的Transformer风格的主干网络。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改并将修改后的完整代码放在文章的最后方便大家一键运行小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

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

目录

1.原理

2. 将CoTAttention添加到YOLOv8中

2.1 CoTAttention代码实现

2.2 更改init.py文件

2.3 添加yaml文件

2.4 在task.py中进行注册

2.5 执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6.总结


1.原理

论文地址:Contextual Transformer Networks for Visual Recognition——点击即可跳转

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

上下文 Transformer (CoT) 注意力是一种新颖的 Transformer 式模块,旨在增强视觉识别任务。以下是根据提供的文档对其主要原理的解释:

CoT 注意力的主要原理

1. 键的上下文编码

  • CoT 首先使用 3×3 卷积对输入键进行上下文编码。此步骤捕获输入特征图中本地邻居之间的静态上下文,从而产生静态上下文表示。

2. 动态注意力矩阵

  • 然后将上下文化的键与输入查询连接起来。此组合表示通过两个连续的 1×1 卷积来学习动态多头注意力矩阵。此步骤结合了查询-键关系和静态上下文以进行自注意力学习。

3. 动态上下文表示

  • 学习到的注意力矩阵用于加权输入值,从而产生动态上下文表示,从输入中捕获动态上下文。

4. 静态和动态上下文融合

  • 静态和动态上下文表示融合在一起,形成 CoT 块的最终输出。这种组合利用了通过自注意力学习到的局部邻域信息和更广泛的上下文。

优势和实现

  • 与 ResNet 集成

  • CoT 块可以替代 ResNet 架构中的 3×3 卷积,而无需增加参数数量或计算开销,从而创建了一个名为上下文 Transformer 网络 (CoTNet) 的新主干。

  • 性能提升

  • 与传统卷积网络和其他基于 Transformer 的架构相比,CoTNet 在各种任务(包括图像识别、对象检测和实例分割)中表现出色。

与传统自注意力的比较

  • 传统自注意力

  • 根据每个空间位置上的孤立查询键对来测量注意力,通常忽略相邻键之间的丰富上下文。

  • CoT Attention

  • 通过 3×3 卷积整合相邻键的静态上下文,并通过 1×1 卷积考虑组合查询和上下文化键来增强动态上下文学习。

视觉表示

  • 传统自注意力模块

  • 通常涉及使用查询和键之间的成对交互来计算注意力矩阵,而不考虑键之间的空间上下文。

  • CoT 模块

  • 涉及额外的 3×3 卷积步骤以进行键之间的上下文挖掘,然后进行动态注意力矩阵学习和上下文融合。

通过利用静态和动态上下文信息,CoT Attention 可以更全面地理解输入特征图,从而提高视觉识别能力。

2. 将CoTAttention添加到YOLOv8中

2.1 CoTAttention代码实现

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

class CoTAttention(nn.Module):def __init__(self, dim=512, kernel_size=3):super().__init__()self.dim = dimself.kernel_size = kernel_sizeself.key_embed = nn.Sequential(nn.Conv2d(dim, dim, kernel_size=kernel_size, padding=kernel_size // 2, groups=4, bias=False),nn.BatchNorm2d(dim),nn.SiLU())self.value_embed = nn.Sequential(nn.Conv2d(dim, dim, 1, bias=False),nn.BatchNorm2d(dim))factor = 4self.attention_embed = nn.Sequential(nn.Conv2d(2 * dim, 2 * dim // factor, 1, bias=False),nn.BatchNorm2d(2 * dim // factor),nn.SiLU(),nn.Conv2d(2 * dim // factor, kernel_size * kernel_size * dim, 1))def forward(self, x):bs, c, h, w = x.shapek1 = self.key_embed(x)  # bs,c,h,wv = self.value_embed(x).view(bs, c, -1)  # bs,c,h,wy = torch.cat([k1, x], dim=1)  # bs,2c,h,watt = self.attention_embed(y)  # bs,c*k*k,h,watt = att.reshape(bs, c, self.kernel_size * self.kernel_size, h, w)att = att.mean(2, keepdim=False).view(bs, c, -1)  # bs,c,h*wk2 = F.softmax(att, dim=-1) * vk2 = k2.view(bs, c, h, w)return k1 + k2

上下文转换器 (CoT) 注意力机制通过整合输入键之间的上下文信息来增强图像处理。以下是使用 CoT 注意力机制进行图像处理的主要工作流程的详细说明:

使用 CoT 注意力机制进行图像处理的主要工作流程

1. 输入特征图

  • 从大小为 (H \times W \times C) 的输入特征图 (X) 开始,其中 (H) 为高度,(W) 为宽度,(C) 为通道数。

2. 键的上下文编码

  • 对输入键应用 3×3 卷积以捕获本地邻居之间的静态上下文。这会产生一个表示上下文化键的新特征图: K_{contextual} = \text{Conv3x3}(X)

3. 与查询连接

  • 将上下文化键 (K{contextual}) 与输入查询 (Q) 连接起来。这种组合表示结合了原始输入和上下文信息: Q{concat} = \text{Concat}(Q, K_{contextual})

4. 动态注意矩阵学习

  • 将连接表示 (Q{concat}) 传递到两个连续的 1×1 卷积,以学习动态多头注意矩阵: A{dynamic} = \text{Conv1x1}(\text{Conv1x1}(Q_{concat}))

5. 动态上下文表示

  • 使用学习到的注意矩阵 (A{dynamic}) 加权输入值 (V),产生动态上下文表示。此步骤根据查询和键之间的关系捕获动态上下文:V{dynamic} = A_{dynamic} \cdot V

6. 静态和动态上下文融合

  • 将静态上下文表示 (K{contextual}) 与动态上下文表示 (V{dynamic}) 相结合以形成最终输出。此融合利用了局部和更广泛的上下文信息:\text{Output} = \text{Fuse}(K{contextual}, V{dynamic})

详细步骤

3×3 卷积用于上下文编码

  • 3×3 卷积扫描输入特征图以捕获相邻键之间的空间关系,从而创建反映局部依赖关系的静态上下文。

1×1 卷积用于注意力矩阵:

  • 两个连续的 1×1 卷积对连接的查询和上下文化键进行操作,以学习动态注意力矩阵,这有助于根据上下文相关性对输入值进行加权。

注意力机制:

  • CoT 中的注意力机制与传统的自注意力不同,它将静态上下文纳入动态注意力计算中,从而产生更强大、更能感知上下文的注意力矩阵。

融合机制:

  • 最后的融合步骤结合了静态和动态表示,确保模型既能从局部上下文(通过 3×3 卷积)中受益,也能从动态交互(通过学习注意力)中受益。

2.2 更改init.py文件

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

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

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_CoTA.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, CoTAttention, [ 512 ] ]    # CoTAttention https://arxiv.org/abs/2107.12292- [ -1, 1, Conv, [ 512, 3, 2 ] ]- [ [ -1, 9 ], 1, Concat, [ 1 ] ]  # cat head P5- [ -1, 3, C2f, [ 1024 ] ]  # 21 (P5/32-large)- [ -1, 1, CoTAttention, [ 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
max_channels: 1024 # max_channels# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
max_channels: 1024 # max_channels# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
max_channels: 512 # max_channels# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
max_channels: 768 # max_channels# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
max_channels: 512 # max_channels

2.4 在task.py中进行注册

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

elif m is CoTAttention:c1, c2 = ch[f], args[0]if c2 != nc:c2 = make_divisible(min(c2, max_channels) * width, 8)args = [c1, *args[1:]]

2.5 执行程序

关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_CoTA.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_CoTA.yaml')  # build from YAML and transfer weights# Train the model
model.train( batch=16)

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

3. 完整代码分享

https://pan.baidu.com/s/1wyZnAKNVMhMhuaH2lDJ7jA?pwd=yzye 

 提取码:yzye 

4. GFLOPs

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

未改进的YOLOv8nGFLOPs

img

改进后的GFLOPs

5. 进阶

可以结合损失函数或者卷积模块进行多重改进

6.总结

上下文变换注意 (CoTAttention) 是一种新颖的机制,旨在通过整合静态和动态上下文信息来增强视觉识别任务。它首先对输入键应用 3×3 卷积,以捕获本地邻居之间的静态上下文。然后将上下文化的键与输入查询连接起来,并将此组合表示通过两个连续的 1×1 卷积来学习动态多头注意矩阵。此矩阵用于加权输入值,从而产生动态上下文表示。最后,将静态和动态上下文表示融合以形成最终输出。此过程使 CoTAttention 能够利用通过自注意力学习到的局部邻域信息和更广泛的上下文,从而提高图像识别、对象检测和实例分割任务的性能。

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

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

相关文章

力扣双指针算法题目:双数之和,三数之和,四数之和

目录 一:双数之和 1.题目: 2.思路解析 3.代码 二:三数之和 1.题目 2.思路解析 3,代码 三:四数字之和 1.题目 2.思路解析 3.代码 一:双数之和 1.题目: 输入一个递增排序的数组和一…

贵州建筑三类人员安全员2024年考试最新题库练习题

一、单选题 1.建设工程安全管理的方针是()。 A.安全第一,预防为主,综合治理 B.质量第一,兼顾安全 C.安全至上 D.安全责任重于泰山 答案:A 2.安全生产管理的根本目的是()。 A.…

Lunaproxy与711Proxy的对比与优劣分析

今天我们来深入对比两款在市场上备受关注的代理IP服务:Lunaproxy和711Proxy。接下来,我们将从多个角度对这两款服务进行详细分析,帮助大家做出明智的选择。 优势分析 711Proxy的优势 1. 性价比高:711Proxy提供多种灵活的套餐选…

伪元素content追加文字使用小技巧

E::before和E::after本身的作用是追加字&#xff0c;直接在文字后面追加链接 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

AI文本转语音,再也不用担心视频配音了.

文章目录 简介代码实现调用开通百度付费包 简介 背景 我想要将文本,转为语音,然后配上图片,这样就可以很快生成一个视频. 可以说是配音吧,我还是比较喜欢通过代码来自动化.所以今天就来实现一下,同时做一下分享和记录.目标 通过python代码,自动将文本转为配音.平台 我选择了百…

万界星空科技MES系统中的排版排产功能

在当今高度竞争的市场环境中&#xff0c;企业对于生产管理的效率和质量要求日益提高。作为智能制造的重要组成部分&#xff0c;制造执行系统&#xff08;MES&#xff09;以其强大的功能&#xff0c;在提升企业生产能力方面发挥着不可替代的作用。万界星空科技作为行业领先的智能…

MongoDB集群搭建-最简单

目录 前言 一、分片概念 二、搭建集群的步骤 总结 前言 MongoDB分片&#xff08;Sharding&#xff09;是一种水平扩展数据库的方法&#xff0c;它允许将数据分散存储在多个服务器上&#xff0c;从而提高数据库的存储容量和处理能力。分片是MongoDB为了应对大数据量和高吞吐量需…

Science期刊政策反转:允许生成式AI用于论文写作,意味着什么?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 关于各大top期刊和出版社对于生成式AI用于论文写作中的规定&#xff0c;娜姐之前写过一篇文章&#xff1a; 如何合理使用AI写论文&#xff1f;来看Top 100学术期刊和出版社的…

深度解析 Raft 分布式一致性协议

本文参考转载至&#xff1a;浅谈 Raft 分布式一致性协议&#xff5c;图解 Raft - 白泽来了 - 博客园 (cnblogs.com) 深度解析 Raft 分布式一致性协议 - 掘金 (juejin.cn) raft-zh_cn/raft-zh_cn.md at master maemual/raft-zh_cn (github.com) 本篇文章将模拟一个KV数据读写服…

【漏洞复现】禅道——未授权登入(QVD-2024-15263)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 禅道&#xff08;Zentao&#xff09;是一款开源的项目管理和协作…

死锁-活锁与活锁的预防、死锁与死锁的预防和检测(处理死锁的方式:事务等待图)

一、引言 1、死锁是因采用封锁技术实现并发控制而产生的一种运行事务被阻塞或等待的现象 2、如果利用严格两阶段封锁协议来解决我们前面提到的“更新丢失”这种数据不一致问题&#xff0c;非串行调度中的事务T1首先获得数据对象X上的读锁并开始执行&#xff0c;随后事务T2也获…

数值分析笔记(五)线性方程组解法

三角分解法 A的杜利特分解公式如下&#xff1a; u 1 j a 1 j ( j 1 , 2 , ⋯ , n ) , l i 1 a i 1 / u 11 ( i 2 , 3 , ⋯ , n ) , u k j a k j − ∑ m 1 k − 1 l b m u m j ⇒ a k j ( j k , k 1 , ⋯ , n ) , l i k ( a i k − ∑ m 1 k − 1 l i n u m k ) /…

uniapp 在手机上导出excel

1.创建excelDev.js文件 export default {exportExcel(fileData, documentName excel) {plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {let rootObj fs.rootlet fullPath rootObj.fullPathconsole.log("开始导出数据")// 创建文件夹rootObj…

破解宇宙终极奥秘,战胜昊天无上束缚

在幽邃的暗夜下&#xff0c;细品着夫子与昊天跨越千年的智勇交锋&#xff0c;我的思绪不禁飘向了更加深远的宇宙边际&#xff0c;回响起那些关于人类如何挑战天命、战胜上天的过往。 宇宙奥秘 在浩瀚无垠的宇宙深渊中&#xff0c;隐藏着一段超越凡尘的规则。昊天&#xff0c;…

2025湖北武汉智慧教育装备信息化展/智慧校园展/湖北高博会

2025武汉教育装备展,2025武汉智慧教育展,2025武汉智慧校园展,2025武汉教育信息化展,2025武汉智慧教室展,湖北智慧校园展,湖北智慧教室展,武汉教学设备展,湖北高教会,湖北高博会 2025湖北武汉智慧教育装备信息化展/智慧校园展/湖北高博会 2025第10届武汉国际教育装备及智慧校园…

计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)

在许多情况下&#xff0c;我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展&#xff0c;然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。 在物理层扩展以太网 现在&#xff0c;扩展主机和集线器之间的距离的一种简单方法就是…

jmeter-beanshell学习3-beanshell获取请求报文和响应报文

前后两个报文&#xff0c;后面报文要用前面报文的响应结果&#xff0c;这个简单&#xff0c;正则表达式或者json提取器&#xff0c;都能实现。但是如果后面报文要用前面请求报文的内容&#xff0c;感觉有点难。最早时候把随机数写在自定义变量&#xff0c;前后两个接口都用这个…

小暑节气,选对劳保鞋,让安全与清凉同行

在七月炽热的阳光下&#xff0c;我们迎来了二十四节气中的小暑&#xff0c;标志着盛夏时节的正式开始。随着气温的节节攀升&#xff0c;不仅大自然万物进入了生长的旺季&#xff0c;我们的工作与日常生活也面临着新的挑战——如何在高温环境下保障自身安全&#xff0c;成为了不…

实例演示kafka stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

vue3【实战】来回拖拽放置图片

效果预览 技术要点 img 标签默认就是可拖拽的&#xff08;a 标签也是&#xff09;事件 e 内的 dataTransfer 对象可用于临时存储事件过程中的数据拖拽事件的默认行为是用浏览器新开页签打开被拖拽对象&#xff0c;所以通常需要禁用默认的浏览器行为被拖拽元素必须设置 id&#…