YOLOV8注意力改进方法: CoTAttention(Visual Question Answering,VQA)附改进代码)

news2024/10/6 18:30:27

原论文地址:原论文下载地址

论文相关内容介绍:

 论文摘要翻译: 具有自关注的Transformer导致了自然语言处理领域的革命,并且最近在许多计算机视觉任务中激发了具有竞争性结果的Transformer风格架构设计的出现。然而,大多数现有设计直接使用二维特征图上的自关注来获得基于每个空间位置上的孤立查询和键对的关注矩阵,而没有充分利用相邻键之间的丰富上下文。在这项工作中,我们设计了一个新颖的Transformer风格模块,即上下文Transformer (CoT)块,用于视觉识别。这样的设计充分利用输入键之间的语境信息来引导动态注意矩阵的学习,从而增强视觉表征能力。从技术上讲,CoT块首先通过3×3卷积对输入键进行上下文编码,从而得到输入的静态上下文表示。我们进一步将编码的键与输入查询连接起来,通过两个连续的1 × 1卷积来学习动态多头注意矩阵。将学习到的注意矩阵乘以输入值,实现输入的动态上下文表示。最后将静态和动态上下文表示的融合作为输出。我们的CoT块很吸引人,因为它可以很容易地替换ResNet架构中的每个3x3卷积,从而产生一个名为上下文变压器网络(Contextual Transformer Networks, CoTNet)的Transformer风格主干。通过广泛的应用(例如,图像识别,对象检测和实例分割)的广泛实验,我们验证了CoTNet作为更强大骨干的优势。

作者提出了一种新的Transformer风格的构建块,称为上下文Transformer (CoT),用于图像表示学习。该设计超越了传统的自注意机制,通过额外利用输入键之间的上下文信息来促进自注意学习,最终提高了深度网络的表征特性。在整个深度架构中用CoT块替换3×3卷积后,进一步阐述了分别由ResNet和ResNeX衍生的两种上下文转换网络(Contextual Transformer Networks),即CoTNet和CoTNeXt。

CoTAttention网络中的“CoT”代表“Cross-modal Transformer”,即跨模态Transformer。在该网络中,视觉和语言输入分别被编码为一组特征向量,然后通过一个跨模态的Transformer模块进行交互和整合。在这个跨模态的Transformer模块中,Co-Attention机制被用来计算视觉和语言特征之间的交互注意力,从而实现更好的信息交换和整合。在计算机视觉和自然语言处理紧密结合的VQA任务中,CoTAttention网络取得了很好的效果。

2.yolov8加入 CoTAttention的步骤:

2.1 在/ultralytics/nn/modules/block.py添加代码到末尾

class CoTAttention(nn.Module):
 
    def __init__(self, dim=512, kernel_size=3):
        super().__init__()
        self.dim = dim
        self.kernel_size = kernel_size
 
        self.key_embed = nn.Sequential(
            nn.Conv2d(dim, dim, kernel_size=kernel_size, padding=kernel_size // 2, groups=4, bias=False),
            nn.BatchNorm2d(dim),
            nn.ReLU()
        )
        self.value_embed = nn.Sequential(
            nn.Conv2d(dim, dim, 1, bias=False),
            nn.BatchNorm2d(dim)
        )
 
        factor = 4
        self.attention_embed = nn.Sequential(
            nn.Conv2d(2 * dim, 2 * dim // factor, 1, bias=False),
            nn.BatchNorm2d(2 * dim // factor),
            nn.ReLU(),
            nn.Conv2d(2 * dim // factor, kernel_size * kernel_size * dim, 1)
        )
 
    def forward(self, x):
        bs, c, h, w = x.shape
        k1 = self.key_embed(x)  # bs,c,h,w
        v = self.value_embed(x).view(bs, c, -1)  # bs,c,h,w
 
        y = torch.cat([k1, x], dim=1)  # bs,2c,h,w
        att = self.attention_embed(y)  # bs,c*k*k,h,w
        att = 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*w
        k2 = F.softmax(att, dim=-1) * v
        k2 = k2.view(bs, c, h, w)
 
        return k1 + k2
2.2 在/ultralytics/nn/modules/block.py的头部all里面将”CoTAttention"加入到末尾
__all__ = (
    "DFL",
    "HGBlock",
    "HGStem",
    "SPP",
    "SPPF",
    "C1",
    "C2",
    "C3",
    "C2f",
    "C2fAttn",
    "ImagePoolingAttn",
    "ContrastiveHead",
    "BNContrastiveHead",
    "C3x",
    "C3TR",
    "C3Ghost",
    "GhostBottleneck",
    "Bottleneck",
    "BottleneckCSP",
    "Proto",
    "RepC3",
    "ResNetLayer",
    "RepNCSPELAN4",
    "ADown",
    "SPPELAN",
    "CBFuse",
    "CBLinear",
    "Silence",
    "CoTAttention",)
2.3在/ultralytics/nn/modules/__init__.py的头部
from .block import (

里面将”CoTAttention"加入到末尾

from .block import (
    C1,
    C2,
    C3,
    C3TR,
    DFL,
    SPP,
    SPPF,
    Bottleneck,
    BottleneckCSP,
    C2f,
    C2fAttn,
    ImagePoolingAttn,
    C3Ghost,
    C3x,
    GhostBottleneck,
    HGBlock,
    HGStem,
    Proto,
    RepC3,
    ResNetLayer,
    ContrastiveHead,
    BNContrastiveHead,
    RepNCSPELAN4,
    ADown,
    SPPELAN,
    CBFuse,
    CBLinear,
    Silence,
   CoTAttention,
)
 2.4 在/ultralytics/nn/tasks.py
from ultralytics.nn.modules import (C1, C2, C3, C3TR, SPP, SPPF, 
Bottleneck, BottleneckCSP, C2f, C3Ghost, C3x, Classify,Concat, Conv,
 ConvTranspose, Detect, DWConv, DWConvTranspose2d, Ensemble, 
Focus,GhostBottleneck, GhostConv, Segment, CoTAttention)

def parse_model(d, ch, verbose=True):  加入以下代码:

 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 yolov8_CoTAttention.yaml
# Ultralytics YOLO 🚀, GPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
 
# Parameters
nc: 4  # 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
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 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, 3, CoTAttention, [256]]   # 16
 
  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 19 (P4/16-medium)
  - [-1, 3, CoTAttention, [512]]  
 
  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 23 (P5/32-large)
  - [-1, 3, CoTAttention, [1024]]  
 
  - [[16, 20, 24], 1, Detect, [nc]]  # Detect(P3, P4, P5)

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

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

相关文章

day02php环境和编译器—我耀学IT

一、环境介绍 1、web 环境 使用 PHP 需要先安装环境,安装环境比较麻烦,需要安装Web服务、PHP应用服务器、MySQL管理系统。 Web服务:apache 和 nginx PHP:多版本 MySQL:多版本 2、环境集成包 因为多环境、多版本、多系…

查看Linux系统相关信息

注: 本文只是博主学习记录分享,仅供参考。如有错误肯定是博主理解有问题,谢谢! 一、查看当前操作系统的内核信息 命令:uname -a 二、查看当前操作系统版本信息 命令:cat /proc/version 这条命令可以查看到…

什么是电子邮件加密?电子邮件加密有几种类型?

在当今数字时代,电子邮件已经成为人们日常生活中不可或缺的沟通工具,据相关数据统计,全球每天发送的电子邮件数以亿计,而这些邮件里面通常包含了姓名、地址、个人身份信息 (PII)、登录凭证、财务信息、法律合同、知识产权等有价值…

Python学习从0到1 day22 第二阶段 面向对象 ⑤ 多态

诋毁本身就是一种仰望 —— 24.4.8 学习目标 1.理解多态的概念 2.理解抽象类(接口的编程思想) 多态 多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态 多态常用在继承关系上 比如&am…

从事「音视频领域」开发工作有前途吗?

据我所知,做音视频的也分算法和工程,这两者都比普通开发高出不少,音视频工程开发的薪资大概比普通web开发高出30%。在开始前我有一些资料,是我根据网友给的问题精心整理了一份「音视频开发的资料从专业入门到高级教程」&#xff0…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求,那么这个网站(autoregex.xyz)一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则,不用选择。 输入框中输入描述,点击 ”GO“ 按钮。 等待一会儿,即可生…

计算 Hermitian 矩阵的特征值和特征向量 cusolver 示例 DnCheevj

1,原理 计算Hermitian 矩阵的特征值,使用Jacobi 旋转法,每次调整两个对称元素为0,通过迭代,使得非对角线上的值总体越来越趋近于0. 示例扩展了 nv 的 cusolverDsyevj 的示例 由于特征向量是正交的,故V*V…

预训练任务

预训练任务 - Mask Language Model jieba预分词长度小于4的词直接mask&#xff08;mask_ids就是input_ids&#xff09; if rands > self.mask_rate and len(word) < 4:word word_list[i]word_encode tokenizer.encode(word, add_special_tokensFalse)for token in wo…

Leetcode面试经典150_Q122买卖股票的最佳时机II

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

快速为App打造Android端聊天室,节省80%开发成本(一)

前言 环信 ChatroomUIKit 提供 UIKit 的各种组件&#xff0c;能帮助开发者根据实际业务需求快速搭建聊天室应用&#xff0c;有效节约开发成本&#xff01;通过该 UIKit&#xff0c;聊天室中的用户可实时交互&#xff0c;发送普通弹幕消息、打赏消息和全局广播等功能。 本文详…

紫叶写作能用吗 #微信#知识分享

紫叶写作是一款非常好用、靠谱的论文写作工具&#xff0c;它旨在帮助用户快速高效地完成论文写作任务&#xff0c;并提供查重降重的功能。它不仅操作简单方便&#xff0c;而且功能强大&#xff0c;能够有效提高论文写作的效率和质量。 首先&#xff0c;紫叶写作提供了丰富的模板…

10款白嫖党必备的ai写作神器,你都知道吗? #媒体#人工智能#其他

从事自媒体运营光靠自己手动操作效率是非常低的&#xff0c;想要提高运营效率就必须要学会合理的使用一些辅助工具。下面小编就跟大家分享一些自媒体常用的辅助工具&#xff0c;觉得有用的朋友可以收藏分享。 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&am…

jmeter压测websocket协议

一、jmeter 安装websocket插件 1、选项--插件管理 2、搜索WebSocket Samplers by Peter Doornbosch插件 进行安装 3、 重启 jmeter 二、jmeter压测websocket协议实战 2.1、以网站为例&#xff1a; websocket在线测试 1、断开连接 2、打开F12&#xff0c;查看WS数据 3、…

基于Socket简单的UDP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 网络编程前言 网络编程是连接数字世界的桥梁&#xff0c;它让计算机之间能够交流信息&#xff0c;为我们的生活和工作带来便利…

电路基础-电容-电感

电路基础 电容 通交流阻直流&#xff0c;滤波&#xff0c;旁路&#xff0c;退耦&#xff0c;作驱动电源&#xff08;洗衣机电机启动时需要一个强电启动&#xff09; 电容选型的工程值&#xff1b;参考以往开发板的选型&#xff1b;抄作业。 电源并连多个电容的作用 保证单…

thinkphp6使用阿里云SDK发送短信

使用composer安装sdk "alibabacloud/dysmsapi-20170525": "2.0.24"封装发送短信类 发送到的短信参数写在env文件里面的 #发送短信配置 [AliyunSms] AccessKeyId "" AccessKeySecret "" signName"" templateCode"&…

泛微OA 自定义多选浏览框

1、建模引擎-》应用建模-》表单 2、建模引擎-》应用建模-》模块 3、建模引擎-》应用建模-》查询 4、把查询页面挂到前端页面。 效果展示&#xff1a; 5、建模引擎-》应用建模-》浏览框 6、流程表单中字段应用

Java环境变量配置说明

1、右键点击“此电脑”&#xff0c;选择“属性”项。 2、点击“高级系统设置”&#xff0c;在弹出的系统属性框中&#xff0c;选择“高级”选项卡&#xff08;默认即显示该选项卡&#xff09;&#xff0c;点击“环境变量”。 3、在弹出的“环境变量”框&#xff0c;中选择下方…

武汉凯迪正大—红外SF6检漏仪

产品概述 KDWG-III高精度SF6气体检漏仪&#xff08;手持式&#xff09;是测量SF6气体泄漏的新产品&#xff0c;采用进口传感器&#xff0c;它具有灵敏度高、稳定性好、响应速度快、操作简便、移动范围大&#xff0c;可迅速、准确的定性和定量检测SF6断路器和GIS的泄漏点及年泄…

如何利用Anaconda管理ArcGISPro相关环境

1.查看 目标下载scikit-learn以及scikit-image&#xff0c;以下是在ArcGISPro中查询库的结果 我们发现原始环境中不存在这两个库 2.修改 向Anaconda的Channels中添加esri的channel&#xff0c;点击add...直接输入esri即可 3.下载 接下来就可以直接下载自己需要的库了