ViT自适应patch划分 ACM MM 2021

news2024/11/27 17:50:54

Transformer在计算机视觉方面取得了巨大的成功,而如何分割图像中的patch仍然是一个问题。现有的方法通常使用固定大小的patch embedding,这可能会破坏对象的语义。为了解决这一问题,作者提出了一种新的Deformable Patch模块(DPT),该模块以数据驱动的方式将图像自适应地分割成不同位置和大小的patch,而不是使用固定patch。该方法可以很好地保留patch中的语义。DPT是可插拔的模块,可以很容易集成到不同的Transformer中,从而实现端到端的训练。结果表明,DPT在ImageNet分类上可以达到81.9%的Top-1准确率,在MSCOCO目标检测上,结合RetinaNet可以达到43.7%的box mAP,结合Mask R-CNN可以达到44.3%。

文章来源:DPT: Deformable Patch-based Transformer for Visual Recognition (ACM MM2021)

目录

  • 引言
  • 方法
    • 前言:Vision Transformer
    • DePatch模块
    • 整体架构
  • 实验

引言

fig1

  • 图1:vanilla的patch分割实例。a为原始patch embedding,这是一种对张量的固定分割,可能会破坏语义。b为DPT的patch embedding,DPT使用可学习的位置和尺度对张量进行动态分割。

transformer在NLP兴起,逐渐成为离散序列建模的主流方法,后来被应用于视觉研究。transformer通常将输入图像分成固定大小的patch序列(patch大小16×16),利用多头注意力对patch序列建模上下文关系。目前,ViT依然存在改进挑战,目前的工作都基于固定的patch,这种hard patch会带来两个问题:

  • 图像中局部结构崩溃,如图1a所示,hard patch难以捕捉到完整的与对象相关的局部结构,因为对象在不同的图像中具有不同的比例。
  • 图像之间的语义不一致,不同图像中的同一对象可能具有不同的几何变换(缩放,旋转),固定的patch分割会捕获不同图像中同一个对象的不一致信息。

因此,固定的patch分割会破坏语义信息,导致性能下降。

为了解决上述问题,作者提出了一个名为DePatch的新模块,它以可变形的方式分割图像为patch。通过这种方式,我们可以在一个patch中更好地保留语义,减少固定patch分割造成的语义破坏。为了实现这一点,DPT学习了feature map空间中每个patch的偏移和比例。偏移量和比例是基于输入feature map学习的,并为每个patch生成,如图1b所示。

所提出的模块是轻量级的,并且引入了非常少量的参数和计算。更重要的是,它可以作为一个即插即用模块(plug-and-play)工作,可以很容易地集成到其他Transformer架构中。带有DePatch模块的Transformer被命名为基于可变形patch的Transformer DPT。在这项工作中,作者将DePatch模块集成到Pyramid Vision Transformer(PVT)中,以验证其有效性,因为PVT在像素级预测任务(如目标检测和语义分割)中实现了最先进的性能。通过可变形patch调整,DPT基于局部上下文结构为每个patch生成完整、鲁棒和有判别性的特征。因此,它不仅可以在分类任务上实现高性能,而且在高度依赖于局部特征的任务(例如目标检测,语义分割)上也优于其他方法。与PVT Tiny相比,DPT在ImageNet分类上实现了2.3%的改进,在用于MSCOCO对象检测的RetinaNet和Mask R-CNN框架下,box mAP分别提高了2.8%和3.5%。

方法

前言:Vision Transformer

ViT由三个部分组成,一个patch embedding模块,多头注意力模块,前馈多层感知机MLP。网络从patch embedding模块开始,该模块将输入张量转换为token序列,然后输入多头自注意力模块和MLP以获得最终表示。下面主要阐述patch embedding模块,并回顾多头自注意力模块。

patch embedding模块将图像分割成具有固定大小和位置的patch,并用线性层embedding每个patch。假设输入张量为 A ∈ R H × W × C A\in R^{H\times W\times C} ARH×W×C,为了化简,假设 H = W H=W H=W。过去的工作将 A A A分割为具有 N N N个patch的序列,patch的大小为 s × s s\times s s×s,其中 s = [ H / N ] s=[H/\sqrt{N}] s=[H/N ]。这个序列被表示为 { z ( i ) } 1 ≤ i ≤ N \left\{z^{(i)}\right\}_{1\leq i\leq N} {z(i)}1iN

为了更好解释patch分割过程,作者重新定义patch embedding模块。每个patch z ( i ) z^{(i)} z(i)可以被看作输入图像中一个矩形区域的表示。我们记其中心坐标为 ( x c t ( i ) , y c t ( i ) ) (x_{ct}^{(i)},y_{ct}^{(i)}) (xct(i),yct(i))。由于patch的大小固定,左上角坐标和右下角坐标可以直接得到: ( x c t ( i ) − s / 2 , y c t ( i ) − s / 2 ) , ( x c t ( i ) + s / 2 , y c t ( i ) + s / 2 ) (x_{ct}^{(i)}-s/2,y_{ct}^{(i)}-s/2),(x_{ct}^{(i)}+s/2,y_{ct}^{(i)}+s/2) (xct(i)s/2,yct(i)s/2),(xct(i)+s/2,yct(i)+s/2)在当前patch i i i 中,有 s × s s\times s s×s个像素,它们的坐标被表示为 p ⃗ ( i , j ) = ( p x ( i , j ) , p y ( i , j ) ) \vec{p}^{(i,j)}=(p_{x}^{(i,j)},p_{y}^{(i,j)}) p (i,j)=(px(i,j),py(i,j))。所有的坐标 p ⃗ ( i , j ) \vec{p}^{(i,j)} p (i,j)都是整数。每个像素对应的特征被记为 { a ~ ( i , j ) } 1 ≤ j ≤ s × s \left\{\widetilde{a}^{(i,j)}\right\}_{1\leq j \leq s\times s} {a (i,j)}1js×s。这些特征被flatten并被线性处理得到patch i i i 的新表示: z ( i ) = W p a t c h ⋅ c o n c a t { a ~ ( i , 1 ) , . . . , a ~ ( i , s × s ) } + b p a t c h z^{(i)}=W_{patch}\cdot concat\left\{\widetilde{a}^{(i,1)},...,\widetilde{a}^{(i,s\times s)}\right\}+b_{patch} z(i)=Wpatchconcat{a (i,1),...,a (i,s×s)}+bpatch多头自注意力模块聚合整个输入序列上的相关信息,为每个token提供全局视图。该模块学习每个注意力头的三组代表性特征:query Q h ∈ R N × d Q_{h}\in R^{N\times d} QhRN×d,key K h ∈ R N × d K_{h}\in R^{N\times d} KhRN×d,value V h ∈ R N × d V_{h}\in R^{N\times d} VhRN×d Q h Q_{h} Qh K h K_{h} Kh相乘得到attention map A t t n h Attn_{h} Attnh,其反应了不同patch之间的相似性。attention map再作为权重改变 V h V_{h} Vh。计算不同头部的独立结果,以获得不同的特征,然后将所有头部的结果连接并转换为新表示 Z ′ Z' Z A t t n h = S o f t m a x ( Q h K h T / d ) Attn_{h}=Softmax(Q_{h}K_{h}^{T}/\sqrt{d}) Attnh=Softmax(QhKhT/d ) Z ′ = c o n c a t { A t t n 1 V 1 , . . . , A t t n H V H } W p r o j + b p r o j Z'=concat\left\{Attn_{1}V_{1},...,Attn_{H}V_{H}\right\}W_{proj}+b_{proj} Z=concat{Attn1V1,...,AttnHVH}Wproj+bproj

DePatch模块

对于固定patch分割的方式,patch的位置 ( x c t ( i ) , y c t ( i ) ) (x_{ct}^{(i)},y_{ct}^{(i)}) (xct(i),yct(i))和大小 s s s是固定的,因此矩形区域对于每个patch是不变的。每个patch的特征直接用其内部像素表示。为了更好地定位重要区域并适应对象的形变,作者开发了DePatch。
fig2

  • 图2:DePatch模块说明。利用局部特征预测偏移量和尺度,通过双线性插值得到新的embedding。

首先,将每个patch的位置和size转化为基于输入内容的预测参数。对于位置,预测原始patch中心的偏移量 ( δ x , δ y ) (\delta_{x},\delta_{y}) (δx,δy)。对于size,预测 s h s_{h} sh s w s_{w} sw替换 s s s。这样,得到了一个新的矩形区域,并记其左上角和右下角坐标为 ( x 1 , y 1 ) (x_{1},y_{1}) (x1,y1) ( x 2 , y 2 ) (x_{2},y_{2}) (x2,y2)。为了清楚,先省略上标 ( i ) (i) (i),因此注意, ( δ x , δ y , s w , s h ) (\delta_{x},\delta_{y},s_{w},s_{h}) (δx,δy,sw,sh)对于每个patch都是不同的。 x 1 = x c t + δ x − s w 2 , y 1 = y c t + δ y − s h 2 x_{1}=x_{ct}+\delta_{x}-\frac{s_{w}}{2},y_{1}=y_{ct}+\delta_{y}-\frac{s_{h}}{2} x1=xct+δx2sw,y1=yct+δy2sh x 2 = x c t + δ x + s w 2 , y 2 = y c t + δ y + s h 2 x_{2}=x_{ct}+\delta_{x}+\frac{s_{w}}{2},y_{2}=y_{ct}+\delta_{y}+\frac{s_{h}}{2} x2=xct+δx+2sw,y2=yct+δy+2sh如图2所示,作者添加了新的分支来预测这些参数。基于输入特征图,为每个patch预测 ( δ x , δ y , s w , s h ) (\delta_{x},\delta_{y},s_{w},s_{h}) (δx,δy,sw,sh),然后再embedding。

偏移量和尺度的预测如下: δ x , δ y = T a n h ( W o f f s e t ⋅ f p ( A ) ) \delta_{x},\delta_{y}=Tanh(W_{offset}\cdot f_{p}(A)) δx,δy=Tanh(Woffsetfp(A)) s w , s h = R e L U ( T a n h ( W s c a l e ⋅ f p ( A ) + b s c a l e ) ) s_{w},s_{h}=ReLU(Tanh(W_{scale}\cdot f_{p}(A)+b_{scale})) sw,sh=ReLU(Tanh(Wscalefp(A)+bscale))其中, f p f_{p} fp可以是任何特征提取器,作者使用的是单个线性层。在训练初始阶段, W o f f s e t W_{offset} Woffset W s c a l e W_{scale} Wscale b s c a l e b_{scale} bscale被初始化为0。

确定矩形区域后,提取每个patch的特征。主要问题是区域大小不同,预测的坐标通常是float数。因此用抽样-插值的方法(sampling-and-interpolation)来解决这个问题。给定矩形坐标 ( x 1 , y 1 ) (x_{1},y_{1}) (x1,y1) ( x 2 , y 2 ) (x_{2},y_{2}) (x2,y2),在区域内均匀抽样 k × k k\times k k×k个points, k k k是一个超参数。每个抽样的位置为 p ⃗ ( j ) = ( p x ( j ) , p y ( j ) ) \vec{p}^{(j)}=(p_{x}^{(j)},p_{y}^{(j)}) p (j)=(px(j),py(j)) 1 ≤ j ≤ k × k 1\leq j\leq k\times k 1jk×k。这些抽样点对应的特征为 { a ~ ( j ) } 1 ≤ j ≤ k × k \left\{\widetilde{a}^{(j)}\right\}_{1\leq j\leq k\times k} {a (j)}1jk×k被输入线性层得到patch embedding: z ( i ) = W ⋅ c o n c a t { a ~ ( 1 ) , . . . , a ~ ( k × k ) } + b z^{(i)}=W\cdot concat\left\{\widetilde{a}^{(1)},...,\widetilde{a}^{(k\times k)}\right\}+b z(i)=Wconcat{a (1),...,a (k×k)}+b注意,抽样点的index是float数,为了得到该index的特征,需要bilinear interpolation,假设要获取任意一个float index ( p x , p y ) (p_{x},p_{y}) (px,py) 的特征,则有: A ( p x , p y ) = ∑ q x , q y G ( p x , p y ; q x , q y ) ⋅ A ( q x , q y ) A(p_{x},p_{y})=\sum_{q_{x},q_{y}}G(p_{x},p_{y};q_{x},q_{y})\cdot A(q_{x},q_{y}) A(px,py)=qx,qyG(px,py;qx,qy)A(qx,qy) G ( p x , p y ; q x , q y ) = m a x ( 0 , 1 − ∣ p x − q x ∣ ) ⋅ m a x ( 0 , 1 − ∣ p y − q y ∣ ) G(p_{x},p_{y};q_{x},q_{y})=max(0,1-|p_{x}-q_{x}|)\cdot max(0,1-|p_{y}-q_{y}|) G(px,py;qx,qy)=max(0,1pxqx)max(0,1pyqy)其中, G G G是双线性插值kernel,它只在靠近 ( p x , p y ) (p_{x},p_{y}) (px,py)的四个整型index上取特征。这可以被快速计算。

整体架构

DePatch是一个自适应模块,可以改变patch的位置和尺寸。由于DePatch的可插拔性,作者将其集成到各种ViT中。在文中,作者将其集成到PVT中,PVT分为4个stage,它利用spatial-reduction注意力来降低处理高分辨率特征图的成本。DePatch+PVT成为DPT,通过将stage 2,3,4中的patch embedding换成DPT而构建。整体架构见图3。
fig3

  • 图3:左边是PVT,右边是DPT。

实验

实验包括图像分类和目标检测。
fig4

  • 表1:ImageNet上的分类结果。

fig5

  • 表2:MSCOCO目标检测结果(DePatch+RetinaNeT)。

fig6

  • 图4:对于DPT-Small的stage 4,可视化学习的patch以及偏移量。可以看出,DPT能够根据内容自适应调整每个patch的位置和比例。

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

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

相关文章

CPP2022-30-期末模拟测试03

6-1 引用作函数形参交换两个整数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 设计一个void类型的函数Swap&#xff0c;该函数有两个引用类型的参数&#xff0c;函数功能为实现两个整数交换的操作。 裁判测试程序样例&#xff1a; #include <…

Linux网络:聚合链路技术

目录 一、聚合链路技术 1、bonding作用 2、Bonding聚合链路工作模式 3、Bonding实现 一、聚合链路技术 1、bonding作用 将多块网卡绑定同一IP地址对外提供服务&#xff0c;可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding&#xff0c…

微信小程序DAY2

文章目录DAY2一、学习目标二、数据绑定2-1、插值表达式![请添加图片描述](https://img-blog.csdnimg.cn/f433301ae5de4094bc397a8c5ea216d7.png)2-2、Mustache语法的应用场景2-2-1、绑定属性2-2-2、三元运算三、事件绑定3-1、事件对象的属性列表3-2、target 和 currentTarget 的…

Win12呼之欲出

Win10系统的电子授权将要停止&#xff0c;20H2、21H2两个版本未来也没有非安全更新了&#xff0c;只剩下Win10 22H2最新版还会继续更新功能&#xff1b;考虑到Win10庞大的基数&#xff0c;至少10亿台电脑的装机量依然是不可忽视的&#xff0c;所以Win10马上被淘汰是不可能的&am…

Linux内核转储---Kdump,Crash使用介绍

文章目录Kdump简介Crash简介Ubuntu下安装使用方法Crash相关命令crash基本用法crash的基本命令help&#xff1a;crash所提供的调试命令log&#xff1a;查看日志信息&#xff0c;类似dmesg输出bt&#xff1a;查看异常时候的堆栈信息dev: 查看设备的情况dis&#xff1a;反汇编代码…

三维形体的表面积

三维形体的表面积 在 N * N 的网格上&#xff0c;我们放置一些 1 * 1 * 1 的立方体。 每个值 v grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。 请你返回最终形体的表面积。 例子&#xff1a; 输入&#xff1a;[[2,1],[1,0]]输出&#xff1a;18 解题思路&#xff1…

G-GhostNet(IJCV 2022)原理与代码解析

paper&#xff1a;GhostNets on Heterogeneous Devices via Cheap Operationscode&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路&#xff0c;用于CPU端的C-GhostNet和用于GPU端…

你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧

你是真的“C”——Visual Studio 2022&#xff08;VS2022&#xff09;编译器 -—实用调试技巧&#x1f60e;前言&#x1f64c;1. 什么是bug&#xff1f;&#x1f64c;2. 调试是什么&#xff1f;有多重要&#xff1f;&#x1f64c;2.1 调试是什么&#xff1f;2.2 调试的基本步骤…

hgame202301 week1 web writeup

目录前言一、Classic Childhood Game二、Become A Member三、Show Me Your Beauty四、Guess Who I Am后记前言 记录2023年1月的hgame比赛week1的web题 第一周还是比较简单的&#xff0c;除了那个涉及到网页爬虫的题一度不会写&#xff08;本「待入门」选手还是太菜了 一、Cla…

网络安全-字典生成-crunch

网络安全-字典生成-crunch crunch工具&#xff0c;在kali已经集成好了 2是代表最小字符长度 4是最大字符长度 生成了一个2M的文件 还有我们来查看这个密码本 从abcd26个英文字母的2位到4位的组合&#xff0c;他全部排列了一次 还可以自定义数字&#xff0c;特殊字符&#xf…

feign进行文件上传报错解决方案及有多个入参时的注意事项

一、情景回顾1、简单的文件上传的接口/*** 文件上传MultipartFile格式** param multipartFile 源文件* param filename 自定义文件名称&#xff0c;允许为空&#xff0c;为空时直接从源文件中拿* return*/RequestMapping("/uploadFileForMultipartFile")LogModuleAnn…

ActiveReports.NET 17.0 Crack by Xacker

一个完整的报告解决方案&#xff0c;用于在您的业务应用程序中设计、定制、发布和查看报告。 ActiveReports.NET 通过直观的 Visual Studio 集成报表设计器和丰富的控件帮助您提供精美的报表。ActiveReports 提供基于代码的跨平台报告、易于使用的设计器和灵活的 API。适用于桌…

Windows11去掉不满足系统要求的提示水印

我的电脑是LEGION的拯救者R70002021&#xff0c;预装的是Windows 11 家庭中文版&#xff0c;没有折腾重装过系统&#xff0c;今天突然注意到右下角出现了这个提示&#xff1a;“不满足系统要求。转到’设置"了解详细信息”。 在进入设置 - 系统 面板中也提示不满足系统要…

Linux系列 操作系统安装及服务控制(笔记)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.操作系统 1.Linux系统三大类 &#xff08;1&#xff09;ubu…

操作系统题目收录(九)

1、有两个并发进程&#xff0c;对于如下程序的运行&#xff0c;正确的说法是&#xff08;&#xff09;。 int x,y,z,t,u; P1() {while(1){x1;y0;if x>1 then yy1;zy;} }P2() {while(1){x0;t0;if x<1 then tt2;ut;} }A&#xff1a;程序能正确运行&#xff0c;结果唯一B&…

SSTI漏洞基础解析

flask基础 flask是python编写的一个WEB应用程序框架&#xff0c;flask由Armin Ronacher带领的一个Pocco团队开发&#xff0c;flask基于werkzeug WSGI工具包个jinjia2模板引擎。 WSGI&#xff1a;Web Server Gateway Interface&#xff0c;即WEB服务器网关接口。 第一个flask…

openai chatgpt 相关

父文章 大数据模型 能做什么? 报告类: 剧本,报告, 标题, 大纲 (都是启发式的), 聊天类: 聊天, 反馈, 心理uu ds 搜索类: 搜索, 书本推荐 几乎可以完成自然语言处理的绝大部分任务 &#xff0c;例如面向问题的搜索、阅读理解、语义推断、机器翻译、文章生成和自动问答等等。…

C/【静态通讯录】

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;C语言学习笔记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 前言 往期回顾&#xff1a; C/扫雷 C/N子棋 通讯录作为通讯录地址的书本&#xff0c;当今的通讯录可以涵盖多项…

彻底理解 cookie、session、token (二)

Cookie cookie 是一个非常具体的东西&#xff0c;指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把cookie以kv形式保存到某个目录下的文本文件内&#xff0c;下一次…

vue2+微前端qiankun从搭建到部署的实践(主子应用切换;集成vue3+vite3子应用)

一、最终效果 二、微前端&#xff08;qiankun&#xff09;介绍及为什么选择用微前端&#xff0c;可以看官网 三、目录结构如下 四、具体配置 一、主应用配置 1、主应用技术栈 Vue-cli4搭建项目Vue2Element-Uiqiankun&#xff1b;Vue2Element-Uiqiankun 2、搭建好主项目&…