前言 Vision Transformers 中,输入图像的空间维度会出现相当大的冗余,从而导致大量的计算成本。因此,本文中提出了 一种由粗到精的视觉变换器(CF-ViT)来减轻计算负担,同时保持性能。CF-ViT 以两阶段的方式实现网络推理。在粗略推理阶段,输入图像被分成一个小长度的补丁序列,用于计算上经济的分类。如果没有被很好地识别,信息块将被识别并进一步以细粒度重新分割。
在不影响Top-1 准确率的情况下,该方法在ImageNet-1k上将LV-ViT-S的FLOPs降低53%, GPU上实测推理速度也加快了2倍。
欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。
论文:https://arxiv.org/pdf/2203.03821.pdf
代码:https://github.com/ChenMnZ/CF-ViT
论文出发点
ViT 的核心在于self-attention,而自注意力机制的计算成本与token数量呈二次相关。但是,图像通常比语言具有更多的空间冗余。因此,降低ViT 计算成本的思路就是降低token数量(图像划分的patch数目)。
CF-ViT 的动机是 ViT 模型中的两个重要观察结果:(1) 粗粒度块分割可以定位输入图像的信息区域。(2) 大多数图像都可以在小长度的标记序列中被 ViT 模型很好地识别。
创新思路
本文提出了一种新颖的由粗到细的视觉变换器(CFViT),CF-ViT的推理分为粗推理阶段和精细推理阶段。粗粒度阶段接收粗粒度补丁作为网络输入,然后粗粒度块的积分信息到分割的细粒度块中,以进一步增强了模型性能。
方法
整体架构
模型架构如图3所示,粗推理阶段用小长度的token序列实现图像识别。如果没有很好地识别,信息区域将被进一步分割以进行细粒度识别。
粗推理阶段
首先执行粗分割以识别充满“简单”区域的图像。此外,当遇到“硬”样本时,它会定位信息区域以进行有效推理。同时,将类别的token送到分类器以获得粗阶段类别预测分布 pc:
在粗略推理阶段,由于patch数量较小,引入一个阈值权衡性能和计算代价。但是token数量急剧下降会对计算成本带来影响,为了节省预算,建议识别并重新划分这些对性能提升最有利的信息区域。因此,关键在于如何识别patches信息。
精细推理阶段
当粗阶段类别预测分布 pc<阈值η时,对信息块进行细粒度分割,这表明输入图像无法区分。细粒度拆分后的patch number为:
提供更细粒度的同时,切断了局部patch的完整性。为了解决这个问题,设计了一个特征重用模块(如图4),将局部patch的信息注入到四个细粒度的补丁中,将粗阶段的输出token序列作为输入。
与 FNN 类似,输入将首先由 MLP 层处理以允许灵活的转换。然后,对这些转换后的标记进行重塑,并将它们中的每一个复制 4 倍。此外,这些对应于细粒度分割补丁的标记被拾取作为特征重用模块的输出。
损失函数
设置置信度阈值 η = 1,这意味着将始终对每个输入图像执行精细推理阶段。一方面,期望细粒度的分割能够很好地拟合真实标签 y 以准确预测输入。另一方面,期望粗粒度拆分与细粒度拆分具有相似的输出,这样大多数输入可以在粗推理阶段得到很好的识别,这表明计算成本更低。因此,CF-ViT 的训练损失如下(粗推理阶段c+精细推理阶段f):
结果
CF-ViT与流行的 ViT 模型的比较:
现有基于降低tokens数量的 ViT 压缩方法与本文的 CF-ViT 之间的比较:
主干网络对比实验:
欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。
【技术文档】《从零搭建pytorch模型教程》122页PDF下载
QQ交流群:444129970。群内有大佬负责解答大家的日常学习、科研、代码问题。
模型部署交流群:732145323。用于计算机视觉方面的模型部署、高性能计算、优化加速、技术学习等方面的交流。
其它文章
【免费送书活动】 全新轻量化模型 | 轻量化沙漏网络助力视觉感知涨点
目标检测、实例分割、旋转框样样精通!详解高性能检测算法 RTMDet
大卷积模型 + 大数据集 + 有监督训练!探寻ViT的前身:Big Transfer (BiT)
超快语义分割 | PP-LiteSeg集速度快、精度高、易部署等优点于一身,必会模型!!!
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts
我需要在rail3中使用标准注册/登录/忘记密码功能进行身份验证。是否有大多数人为此使用的插件或其他东西? 最佳答案 我不确定最常用的方法是什么-但可以肯定的是,Plataformatec的“Devise”是一个非常流行的方法:http://github.com/plataformatec/devise我已经尝试了一些authgem,对我来说,它是最简单的设置和修改以满足我的需要。它内置了密码恢复、帐户确认(如果需要)和其他一些非常方便的功能。 关于ruby-on-rails-在Rail
我写了很多initialize代码,将attrs设置为参数,类似于:classSiteClientattr_reader:login,:password,:domaindefinitialize(login,password,domain='somedefaultsite.com')@login=login@password=password@domain=domainendend有没有更像Ruby的方式来做到这一点?我觉得我在一遍又一遍地编写相同的样板设置代码。 最佳答案 您可以使用rubyStruct:classMyClass或
我在ruby表单中有一个提交按钮f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id"我想在不使用任何javascript的情况下通过ruby禁用此按钮 最佳答案 添加disabled:true选项。f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id",disabled:true 关于ruby-on-rails-如何在Rails中添加禁用的提交按钮,我们在St