VOLO: Vision Outlooker for Visual Recognition 阅读笔记
该论文提出的方法目前在ImageNet分类任务中排名40+,但是在cityspaces-val语义分割任务中排名第5,说明该方法可以有效的应用于语义分割任务
该论文主要基于VIT进行进一步的研究和优化,VIT将transformer迁移到视觉任务的一个重要实践,在图像分类任务中,CNN一直占据主导优势地位,VIT的诞生以及后续的一系列的算法改进使得transformer逐渐在图像分类任务以及其他的一些任务中占据主导地位,反超CNN,成为了一个主流
首先作者发现限制 ViT 优于 CNN 的一个主要因素是它们在将精细特征和上下文编码为令牌表示时效率低下,这对于实现引人注目的视觉识别性能至关重要。 精细级别的信息可以通过更细粒度的图像标记化编码为标记,但这会导致更大长度的标记序列,从而二次增加 ViT 的自注意力机制的复杂性。
- 由此提出了一种新的简单且轻量级的注意力机制,称为 Outlooker,以有效地利用精细信息丰富令牌表示。创新令牌聚合生成注意力的方式,并使模型能够有效地编码精细信息。 特别是,它直接通过有效的线性投影从锚标记特征中推断出聚合周围标记的机制,从而摆脱了昂贵的点积注意力计算。
- 整体结构表达如下 ,可以看出来其实就是将原始的VIT中的self-attention替换成OutlookAttention
方法提出的原因:1)每个空间位置的特征具有足够的代表性,可以生成注意力权重,用于局部聚合其相邻特征; 2)密集和局部空间聚合可以有效地编码精细信息。
对于每个空间位置 (i, j),outlook attention 计算其以 (i, j) 为中心的大小为 K × K 的局部窗口内的所有邻居的相似性。 与需要 Query-Key 矩阵乘法来计算注意力的 self-attention 不同,outlook attention 仅通过reshape操作来简化此过程。Outlook attention:位置 (i, j) 的 Outlook 权重直接用作值聚合的注意力权重,然后是 Softmax 函数,表达式如下
Dense aggregation:Outlook attention 密集聚合映射值表示,将来自不同局部窗口的同一位置的不同加权值相加得到输出,表达式如下
# Outlook attention 实现 class OutlookAttention(nn.Module):"""Implementation of outlook attention--dim: hidden dim--num_heads: number of heads--kernel_size: kernel size in each window for outlook attentionreturn: token features after outlook attention"""def __init__(self, dim, num_heads, kernel_size=3, padding=1, stride=1,qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):super().__init__()head_dim = dim // num_headsself.num_heads = num_headsself.kernel_size = kernel_sizeself.padding = paddingself.stride = strideself.scale = qk_scale or head_dim**-0.5self.v = nn.Linear(dim, dim, bias=qkv_bias)self.attn = nn.Linear(dim, kernel_size**4 * num_heads)self.attn_drop = nn.Dropout(attn_drop)self.proj = nn.Linear(dim, dim)self.proj_drop = nn.Dropout(proj_drop)self.unfold = nn.Unfold(kernel_size=kernel_size, padding=padding, stride=stride)self.pool = nn.AvgPool2d(kernel_size=stride, stride=stride, ceil_mode=True)def forward(self, x):B, H, W, C = x.shapev = self.v(x).permute(0, 3, 1, 2) # B, C, H, Wh, w = math.ceil(H / self.stride), math.ceil(W / self.stride)v = self.unfold(v).reshape(B, self.num_heads, C // self.num_heads,self.kernel_size * self.kernel_size,h * w).permute(0, 1, 4, 3, 2) # B,H,N,kxk,C/Hattn = self.pool(x.permute(0, 3, 1, 2)).permute(0, 2, 3, 1)attn = self.attn(attn).reshape(B, h * w, self.num_heads, self.kernel_size * self.kernel_size,self.kernel_size * self.kernel_size).permute(0, 2, 1, 3, 4) # B,H,N,kxk,kxkattn = attn * self.scaleattn = attn.softmax(dim=-1)attn = self.attn_drop(attn)x = (attn @ v).permute(0, 1, 4, 3, 2).reshape(B, C * self.kernel_size * self.kernel_size, h * w)x = F.fold(x, output_size=(H, W), kernel_size=self.kernel_size,padding=self.padding, stride=self.stride)x = self.proj(x.permute(0, 2, 3, 1))x = self.proj_drop(x)return x
优点:outlook attention 通过测量标记表示对之间的相似性来编码空间信息,这对于特征学习比卷积更具参数效率 ;outlook attention 采用滑动窗口机制对令牌表示进行局部编码,并在一定程度上保留了视觉任务的关键位置信息;注意力权重的生成方式简单高效。
为了利用精细级别的标记表示,在第一阶段,调整补丁嵌入模块,使图像在大小为 8 × 8 而不是 16 × 16 的小图像补丁上进行标记。一堆 Outlookers 用于生成精细级别的更具表现力的令牌表示。 在第二阶段,使用另一个补丁嵌入模块对令牌进行下采样。 然后采用一系列transformer对全局信息进行编码。Outlooker 和 Transformer 的比例保持在 1:3 左右。
实验部分可查看原文:VOLO: Vision Outlooker for Visual Recognition,源码:https://github.com/sail-sg/volo
VOLO: Vision Outlooker for Visual Recognition 阅读笔记相关推荐
- 【论文笔记】VOLO: Vision Outlooker for Visual Recognition
论文 论文题目:VOLO: Vision Outlooker for Visual Recognition 论文地址:[2106.13112] VOLO: Vision Outlooker for V ...
- 阅读文献:VOLO: Vision Outlooker for Visual Recognition
VOLO: Vision Outlooker for Visual Recognition 1.四个问题 要解决什么问题 提高图像分类精度,缩小Transformer于CNN之间的差距 用什么方法解决 ...
- VOLO: Vision Outlooker for Visual Recognition
论文名称:VOLO: Vision Outlooker for Visual Recognition 作者:Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, ...
- VOLO Vision Outlooker for Visual Recognition论文分析
Abstract 多年来,CNN 主导着视觉识别任务.尽管最近 ViTs 在 ImageNet 分类任务上展现了自注意力模型不俗的潜力,但如果没有额外数据支撑的话,仍要弱于 SOTA 卷积模型.本文作 ...
- 5. VOLO: Vision Outlooker for Visual Recognition
VOLO的整体流程很简单:主要分为两个阶段,第一个阶段使用outlookattention + MLP获取图像特征,第二阶段使用普通attention + MLP获取图像特征,对此时获取的图像特征再执 ...
- Deep High-Resolution Representation Learning for Visual Recognition阅读笔记
用于视觉识别的深度高分辨率表示学习 论文链接 摘要: 高分辨率表示对于人体姿态估计.语义分割和目标检测这类位置敏感的视觉问题至关重要.现有的 sota 框架首先通过串联 high-to-low 分辨率 ...
- Do Deep Neural Networks Learn Facial Action Units When Doing Expression Recognition?阅读笔记
Do Deep Neural Networks Learn Facial Action Units When Doing Expression Recognition?阅读笔记 前言 Abstract ...
- (CTC损失)Hybrid CTC/Attention Architecture for End-to-End Speech Recognition阅读笔记
ASR-R (CTC损失)Hybrid CTC/Attention Architecture for End-to-End Speech Recognition阅读笔记 文章目录 ASR-R (CTC ...
- 《BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition》笔记
Paper:<BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition& ...
最新文章
- 服务容错保护断路器Hystrix之二:Hystrix工作流程解析
- python考证书-python能考证么
- Batch Norm、Layer Norm、Instance Norm、Group Norm、Switchable Norm总结
- linux实现命令解释器_想在Win10上安装Linux,只需一个命令即可实现
- python爬取方式_Python 爬虫入门(三)—— 寻找合适的爬取策略
- Javascript的面对对象的理解 【下】(prototype的使用)
- apache ignite_使用Spring Data的Apache Ignite
- Linux C高级编程——网络编程之包裹函数
- wind试用版 matlab,免费产品试用 - MATLAB Simulink
- 【常见Web应用安全问题】---1、Cross Site Scripting
- spring aop的简单使用
- 2019-02-26-GCN资料
- MapGIS注记文字无损转入ArcGIS软件
- 淘宝 喵铺脚本自动签到脚本
- Flutter 利用 FFI,绕过 Android JNI 直接调用 C++ 层!
- 酪氨酸激酶的抑制剂——白血病的靶向研究
- python微信朋友圈分享功能_利用Python让你的微信朋友圈与众不同,更加高大上
- sqlmap工具使用手册
- B. Sereja and Mirroring
- containerd环境下build镜像