当前位置: 首页 > news >正文

可变形注意力(Deformable Attention)及其拓展

文章目录

  • 一、补充知识
    • (一)可变形卷积(Deformable Convolution)
    • (二)多头注意力机制
  • 二、可变形注意力模块
  • 三、可变形自注意力模块
    • (一)偏移模块:
    • (二)注意力模块
  • 三、多尺度可变形注意力:
  • 四、常规注意力模块与可变形注意力模块的不同


一、补充知识

(一)可变形卷积(Deformable Convolution)

可变形卷积将固定形状的卷积过程改造成了能适应物体形状的可变的卷积过程,从而使结构适应物体形变的能力更强。

实现方式: 对感受野上的每一个点加一个偏移量 ,偏移的大小是通过学习得到的 ,偏移后感受野不再是个正方形,而是和物体的实际形状相匹配。这么做的好处就是无论物体怎么形变,卷积的区域始终覆盖在物体形状的周围。如下图所示:

  • a 为原始感受野范围
  • b ~ d 是对感受野上的添加偏移量后的感受野范围,可以看到叠加偏移量的过程可以模拟出目标移动、尺寸缩放、旋转等各种形变

实验效果 : 左侧的传统卷积单个目标共覆盖了5 x 5=25个采样点,感受野始终是固定不变的方形;右侧的可变形卷积因为感受野的每一个点都有偏移量,造成卷积核在图片上滑动时对应的感受野的点不会重复选择,这意味着会采样9 x 9=81个采样点,比传统卷积更多。

传统卷积核在卷积过程中由于会存在重叠,最终输出后的感受野范围小,而可变性卷积中因为有偏移,不会有重叠,从而感受野范围更大

(二)多头注意力机制

多头注意力机制的基本步骤:

  • 线性变换:对输入序列 X X X进行多次线性变换,得到多组查询 Q i Q_i Qi、键 K i K_i Ki和值 V i V_i Vi
  • 注意力计算:对每组查询、键和值分别进行注意力计算,得到多组注意力加权的输出表示;
  • 将多组注意力加权的输出拼接在一起, 并通过另一个可以学习的线性投影进行变换,得到最终输出。

公式表示如下。其中, m m m代表多头注意力机制中的第m个注意力头, x x x为Key和Value输入特征, z z z为Query输入特征, W m ′ W'_m Wm是输入特征到Value的转移矩阵,用于将 x k x_k xk变换成value, W m W_m Wm是对注意力施加在value后的结果进行线性变换从而得到不同头部的输出结果,标量 A m q k A_{mqk} Amqk是注意力权重。

二、可变形注意力模块

可变形注意力(Deformable Attention)是一种用于神经网络中的注意力机制。在传统的注意力机制中,权重是通过对位置固定的注意力模型进行计算得到的。而在可变形注意力中,可以动态地调整注意力模型的形状和大小,以更好地适应不同任务和输入数据的特点。

大体流程如下:

  1. 给定特征图 x ∈ R H × W × C x\in \mathbb{R}^{H\times W\times C} xRH×W×C,生成一个点 p ∈ R H G × W G × 2 p\in \mathbb{R}^{H_G \times W_G \times 2} pRHG×WG×2的统一网格作为参考;
  2. 将特征映射线性投影到query token q = x W q q=xW_q q=xWq,然后输入一个轻量子网络 θ o f f s e t \theta_{offset} θoffset,生成偏移量 Δ θ o f f s e t ( q ) \Delta \theta_{offset(q)} Δθoffset(q)
  3. 在变形点的位置采样,作为key和value,与query一同传入多头注意力机制中;
  4. 每个头部的特征连接在一起,通过 W 0 W_0 W0投影得到最终输出 z z z
    在这里插入图片描述

单尺度可变形注意力用公式表达如下。其中, A m q k A_{mqk} Amqk不是由Query和Key矩阵做内积得到,而是由输入特征 z q z_q zq直接通过全连接层得到的; p q p_q pq代表 z q z_q zq的位置(理解成坐标即可),是2D向量,作者称其为参考点; Δ p m q k \Delta p_{mqk} Δpmqk表示第m个注意力头第k个采样点相对于参考点的位置偏移; K K K是采样的key总数。

可以看到,每个query在每个头部中采样K个位置,只需和这些位置的特征交互( x ( p q + Δ q m q k ) x(p_q+\Delta q_{mqk}) x(pq+Δqmqk))。

在这里插入图片描述

三、可变形自注意力模块

在groundingdino的模型框架中,对于图像特征的增强就采用了Deformable Self-Attention模块,具体可以参考Grounding DINO:开放集目标检测,将基于Transformer的检测器DINO与真值预训练相结合。

变形自注意力模块主要由两个组成部分构成:偏移模块和注意力模块。 大致流程如下图所示:

  1. 将输入向量转换成特征图,然后生成Query向量,同时考虑参考点的坐标;
  2. 将输入特征图在线性变换后与Query向量一同输入到偏移模块中
  3. 将偏移模块产出的结果与Query向量输入到注意力模块中得到最终结果。
    在这里插入图片描述

(一)偏移模块:

偏移模块对Query向量应用线性变换,得到偏移 Δ p q \Delta p_q Δpq;然后根据参考点的偏移确定每个参考点的感兴趣点(采样点),并使用双线性插值实现每个点的输出 o f s e t v a l u e ofset_{value} ofsetvalue

每个Query向量具有H个注意力头,每个注意力头与K个偏移点相关联。

(二)注意力模块

注意力模块的过程:

  1. 开始于对输入Query向量的线性变换,并且使用softmax函数生成每个偏移的权重向量。
  2. 将offset模块中确定的每个偏移的输出与相应的权重向量相乘并汇总,得到 S a m p l e v a l u e Sample_{value} Samplevalue
  3. 之后,再将每个参考点对应的注意力头连接起来,得到最终的向量,称为 S a m p l e o u t p u t Sample_{output} Sampleoutput
  4. 最后,对采用后的输出向量进行线性变换,得到最终的输出值。

三、多尺度可变形注意力:

多尺度可变形注意力与单尺度可变形注意力的计算公式相比,多出了 { x l } l = 1 l \{x^l\}^l_{l=1} {xl}l=1l ϕ l ( ) \phi _l() ϕl() { x l } l = 1 l \{x^l\}^l_{l=1} {xl}l=1l是输入的多尺度特征图集合, p ^ q \hat{p}_q p^q表示归一化, ϕ l ( ) \phi _l() ϕl()用于将归一化的坐标映射到各个特征层去

ϕ l ( ) \phi _l() ϕl()使得每个参考点在所有特征层都会有一个对应的归一化坐标,方便计算在不同特征层进行采样的点的位置

在这里插入图片描述

四、常规注意力模块与可变形注意力模块的不同

  1. 常规注意力模块中, k ∈ Ω k k\in \Omega _k kΩk,即考虑所有的key;而可变形注意力模块中 k ∈ [ 1 , K ] k \in [1,K] k[1,K],即只需要考虑一部分的key。
  2. 常规注意力模块中,分别取 N k N_k Nk x k x_k xk,然后把结果作加权求和;而可变形注意力模块中 x ∈ C × H × W x\in C\times H \times W xC×H×W,设 p q p_q pq是2D空间上任意一点,先与一个2D实数值 Δ p m q k \Delta p_{mqk} Δpmqk相加,然后通过双线性插值得到新的feature map的一点。
  3. Deformable的Attention不是用Query和Key矩阵做内积得到的,而是由输入特征直接通过Lienear Transformation得到的。

参考:
Deformable DETR
CVPR 2022 | 清华开源DAT:具有可变形注意力的视觉Transformer
MFDS-DETR开源 | HS-FPN多级特征融合+Deformable Self-Attention,再续DETR传奇
详解可变形注意力模块(Deformable Attention Module)

相关文章:

  • 【Linux进程】冯·诺依曼体系结构以及操作系统的深入理解
  • this的指向问题总结
  • 【深度学习:计算机视觉】计算机视觉的最佳数据集 [行业细分]
  • 常见锁策略,CAS,synchrodized原理讲解
  • 企业微信机器人的运营策略与实践
  • LeetCode 热题 100 | 二叉树(终)
  • 基于springboot+vue的中小型医院网站(前后端分离)
  • 零基础到高级:Android音视频开发技能路径规划
  • 数智赋能,变革加速:人工智能技术与低代码开发利器
  • 利用Ubuntu22.04启动U盘对电脑磁盘进行格式化
  • 人工智能|机器学习——基于机器学习的舌苔检测
  • Rust 安装
  • mysql在服务器中的主从复制Linux下
  • 基于Redis商品库存扣减方案
  • 第一个 Angular 项目 - 动态页面
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【5+】跨webview多页面 触发事件(二)
  • Bootstrap JS插件Alert源码分析
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java到底能干嘛?
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • mysql_config not found
  • nfs客户端进程变D,延伸linux的lock
  • SOFAMosn配置模型
  • Wamp集成环境 添加PHP的新版本
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 前端_面试
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 微信小程序开发问题汇总
  • 小程序button引导用户授权
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 在Mac OS X上安装 Ruby运行环境
  • Nginx实现动静分离
  • 容器镜像
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • (1)(1.13) SiK无线电高级配置(五)
  • (二)springcloud实战之config配置中心
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (转)平衡树
  • ***通过什么方式***网吧
  • .NET Core中Emit的使用
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net生成的类,跨工程调用显示注释
  • .NET下的多线程编程—1-线程机制概述
  • /etc/sudoer文件配置简析
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [1]-基于图搜索的路径规划基础
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]