YOLO算法改进Backbone系列之DaViT

news/2024/7/10 2:40:22 标签: YOLO, 算法, 目标检测, 深度学习, pytorch

摘要:在这项工作中,我们介绍了双注意视觉变换器(DaViT),这是一个简单而有效的视觉变换器架构,能够在保持计算效率的同时捕捉全局环境。我们建议从一个正交的角度来处理这个问题:利用 "空间标记 "和 "通道标记 "的自我注意机制。对于空间标记,空间维度定义了标记的范围,而通道维度定义了标记的特征维度。对于通道标记,我们有相反的情况:通道维度定义了标记的范围,而空间维度定义了标记的特征维度。我们进一步沿序列方向对空间和通道令牌进行分组,以保持整个模型的线性复杂性。我们表明,这两个self-attention是相互补充的。(i)由于每个通道标记包含整个图特征,通道注意力通过在计算通道之间的注意力分数时考虑到所有的空间位置,自然地捕捉到全局的联系和特征;(ii)空间注意力通过进行跨空间位置的细粒度的联系来完善局部特征,这反过来有助于通道注意力的全局信息建模。大量的实验表明,我们的DaViT在四个不同的任务上以高效的计算实现了最先进的性能。在没有额外数据的情况下,DaViT-Tiny、DaViT-Small和DaViT-Base在ImageNet-1K上分别以2830万、4970万和8790万的参数达到了82.8%、84.2%和84.6%的最高精度。当我们用15亿个弱监督图像和文本对进一步扩大DaViT的规模时,DaViT-Gaint在ImageNet-1K上达到了90.4%的最高精度。

双attention机制从两个正交的角度来进行self-attention:
(1)对spatial tokens进行self-attention,此时空间维度(HW)定义了tokens的数量,而channel维度(C)定义了tokens的特征大小,这其实也是ViT最常采用的方式
(2)对channel tokens进行self-attention,这和前面的处理完全相反,此时channel维度(C)定义了tokens的数量,而空间维度(HW)定义了tokens的特征大小
可以看出两种self-attention完全是相反的思路。为了减少计算量,两种self-attention均采用分组的attention:对于spatial token而言,就是在空间维度上划分成不同的windows,这就是Swin中所提出的window attention,论文称之为spatial window attention;而对于channel tokens,同样地可以在channel维度上划分成不同的groups,论文称之为channel group attention。这两种attention如下图所示:
在这里插入图片描述

DaViT的双注意力机制包括以下两种self-attention方式:
空间self-attention:对于空间维度上的tokens,DaViT将其划分为不同的窗口,这类似于Swin中的窗口注意力(spatial window attention)。通过在空间维度上进行self-attention,DaViT能够捕捉到不同位置之间的关系
通道self-attention:对于通道维度上的tokens,DaViT将其划分为不同的组(channel group attention)。通过在通道维度上进行self-attention,DaViT能够捕捉到不同特征之间的关系

Dual attention block:它包含两个transformer block:空间窗口self-attention block和通道组self-attention block。通过交替使用这两种类型的attention机制,Davit模型能实现局部细粒度和全局图像级交互。

DaViT采用金字塔结构,共包含4个stages,每个stage的开始时都插入一个 patch embedding 层。作者在每个stage叠加dual attention block,这个block就是将两种attention(还包含FFN)交替地堆叠在一起,其分辨率和特征维度保持不变。采用stride=4的7x7 conv,然后是4个stage,各stage通过stride=2的2x2 conv来进行降采样。
在这里插入图片描述

DaViT-Tiny,DaViT-Small和DaViT-Base三个模型的配置如下所示:
在这里插入图片描述
YOLOv5项目中添加模型作为Backbone使用的教程:
(1)将YOLOv5项目的models/yolo.py修改parse_model函数以及BaseModel的_forward_once函数
在这里插入图片描述
在这里插入图片描述

(2)在models/backbone(新建)文件下新建Davit.py,添加如下的代码:
在这里插入图片描述

(3)在models/yolo.py导入模型并在parse_model函数中修改如下(先导入文件):
在这里插入图片描述

(4)在model下面新建配置文件:yolov5_davit.yaml
在这里插入图片描述

(5)运行验证:在models/yolo.py文件指定–cfg参数为新建的yolov5_davit.yaml
在这里插入图片描述


http://www.niftyadmin.cn/n/5476650.html

相关文章

ADB 操作命令及其详细用法

adb devices 用途&#xff1a;列出连接到计算机的所有 Android 设备。详解&#xff1a;执行该命令后&#xff0c;ADB 将扫描连接到计算机的所有 Android 设备&#xff0c;并列出它们的序列号。 adb connect <device> 用途&#xff1a;连接到指定 IP 地址的 Android 设备。…

将没有父对象的组件加入布局,将布局设置给一个窗口,窗口析构时,组件自动释放

创建按钮&#xff0c;和布局管理器&#xff0c;把按钮加入到布局管理器&#xff0c;窗口中使用布局管理器。 MyButton *button2 new MyButton; MyButton *button3 new MyButton; QHBoxLayout *layout new QHBoxLayout; layout ->addWidget(button2); layout ->addWid…

DolphinScheduler 答案整理,最新面试题

DolphinScheduler的架构设计是怎样的&#xff1f; DolphinScheduler的架构设计主要分为四个层次&#xff1a;前端界面层、API服务层、调度层和执行层。 1、前端界面层&#xff1a; 提供任务的定义、流程的设计、监控等功能&#xff0c;用户通过前端界面操作整个系统。 2、AP…

Vue 最新面试题

$nextTick 原理 概括 vue 实现响应式并不是数据发生变化后 DOM 立即变化。vue 在修改数据后&#xff0c;要等到同一事件循环机制内所有数据变化完成后&#xff0c;再统一进行 DOM 更新 nextTick 可以让我们在下次 DOM 更新循环结束后执行延迟回调&#xff0c;用于获取更新后…

fakebook-攻防世界

题目 先目录扫描一下 dirseach 打开flag.php是空白的 访问robots.txt,访问user.php.bak <?php class UserInfo { public $name ""; public $age 0; public $blog ""; public function __construct($name, $age, $blog) { …

靶机渗透之DC-6

一、信息收集 nmap扫描一下网段&#xff0c;靶机ip为192.168.234。 nmap -sP 192.168.145.* 再扫一下端口&#xff0c;依旧是老样子22、80端口。 nmap -sT -T4 -p1-65535 192.168.145.234顺便再扫下网站目录&#xff0c;有个后台登录的网址/wp-login.php。 dirsearch -u h…

【话题分享】0基础如何进入Linux开发行业

0基础如何进入Linux开发行业&#xff1f; 我在刚进入职场的时候岗位是硬件开发的&#xff0c;后面才转的Linux驱动开发。在做Linux驱动开发时也有不少没有技术背景的来做这方面的工作&#xff0c;比如项目经理&#xff0c;刚进入职场的小菜鸟等。我想分享下个人的一点见解&…

三星:HBM4的16层堆叠技术验证成功

随着人工智能、大数据分析、云计算及高端图形处理等领域对高速、高带宽存储需求的激增&#xff0c;下一代高带宽内存&#xff08;High Bandwidth Memory, HBM&#xff09;——HBM4已成为全球存储芯片巨头三星、SK海力士和美光竞相追逐的技术高地。 随着AI、机器学习以及高性能…