提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 摘要
- Abstract
- 文献阅读:带有超令牌采样的视觉转换器
- 1、研究背景
- 2、方法提出
- 3、优势
- 4、实验
- 5、贡献
- 二、StokenAttention代码学习
摘要
本周主要阅读了CVPR文章,带有超令牌采样的视觉转换器。该论文提出了一个名为SViT的方法,这是一种基于Transformer的模型,SViT主要由以下几个关键组件构成:卷积位置嵌入(CPE)、卷积FFN(ConvFFN)及空间注意力(STA)模块,通过在Transformer中引入卷积层,使得模型能够更好地利用局部信息,同时保持了Transformer对全局信息的建模能力。除此之外,还学习学习了StokenAttention的注意力模块代码的学习。
Abstract
This week, I mainly read the CVPR article on a visual transformer with super-token sampling. The paper proposes a method called SViT, which is a Transformer-based model. SViT mainly consists of the following key components: convolutional position embedding CPE, convolutional FFN ConvFFN, and spatial attention STA module. By introducing convolutional layers into the Transformer, the model can better utilize local information while maintaining the Transformer’s ability to model global information. In addition, I also learned the attention module code of StokenAttention.
文献阅读:带有超令牌采样的视觉转换器
Title: Vision Transformer with Super Token Sampling
Author:Huaibo Huang, Xiaoqiang Zhou,Jie Cao, Ran He, Tieniu Tan
From:2023 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)
1、研究背景
Transformer在许多视觉任务上取得了令人印象深刻的性能,比如Vision Transformer(ViT)。然而,它可能在捕捉浅层特征时遭受高冗余,使用自注意力机制,其计算复杂度与输入序列的长度平方成正比,在处理高分辨率图像时,计算成本较高。因此,使用局部自注意力或早期卷积,但牺牲了捕捉长距离依赖的能力。然后出现了一个挑战:能否在神经网络的早期阶段获得高效和有效的全局上下文建模?
2、方法提出
文中提出了一个名为SViT的方法,这是一种基于Transformer的模型,SViT(Spatially Variant Transformer)是一种针对图像分割任务的基于Transformer的模型。它主要由以下几个关键组件构成:
- 卷积位置嵌入(CPE):CPE用于在特征中添加位置信息,这对于Transformer模型来说至关重要。CPE通过将位置编码与原始特征进行逐元素相加,使得模型能够捕捉到不同位置的信息。实验结果显示,CPE能提高模型的性能,因为它更加灵活,适用于任意分辨率的输入。
- 卷积FFN(ConvFFN):ConvFFN是一种用于增强局部特征的模块。它通过使用3x3卷积核对特征进行处理,从而提取更丰富的局部信息。此外,ConvFFN中还使用了shortcut连接,有助于提高最终的性能。
- 空间注意力(STA)模块:STA模块用于提取全局上下文表示。它通过高效地探索和充分利用长范围依赖关系,使得模型能够更好地理解图像中的全局上下文信息。
3、优势
Spatially Variant Transformer(SVT)和Vision Transformer(ViT)都是基于Transformer架构的视觉模型,但它们在处理图像数据时具有不同的特点和优势。以下是Spatially Variant Transformer相比ViT的一些潜在优势:
- 融合局部和全局信息:SViT结合了卷积神经网络(CNN)和Transformer的优点,能够同时捕捉局部和全局上下文信息。它通过在Transformer中引入卷积层,使得模型能够更好地利用局部信息,同时保持了Transformer对全局信息的建模能力。
- 空间变化性:SViT通过引入空间变化性,使得模型能够更好地适应不同场景中的空间变化。这使得模型在处理具有复杂结构和多样性的图像时具有更好的鲁棒性。
- 高效的注意力机制:SViT采用了 deformable attention机制,这是一种可变形的注意力机制,能够以更高效的方式建模图像中的长距离依赖关系。这使得模型在处理具有复杂结构的图像时具有更高的效率。如下图所示,相比其他模型,SViT能更好地捕捉注意力信息。
- 结构简单且易于实现:SViT的结构相对简单,易于实现和优化。相比于其他复杂的Transformer架构,SViT具有更高的计算效率和更少的参数数量。
4、实验
文中进行了广泛的视觉任务上的实验,包括在ImageNet-1K 上进行图像分类,在COCO 2017 [28]上进行物体检测和实例分割,以及在ADE20K 上进行语义分割。除此之外还进行了消融研究,以检查每个组件的作用。
-
图像分类:在ImageNet-1K数据集上进行图像分类实验,与现有最先进的模型进行比较。实验结果表明,我们的Super Vision Transformer(SViT)在准确度方面具有竞争力,同时拥有22%更少的浮点运算次数(FLOPs)和两倍的速度。这说明SViT在图像分类任务中表现出色,并且计算效率较高。
-
目标检测和实例分割:在COCO 2017数据集上进行目标检测和实例分割实验。实验结果进一步验证了我们方法的有效性,表明SViT不仅在图像分类任务中表现良好,而且在目标检测和实例分割任务中也有较好的性能。
-
Ablation Study:我们进行了消融研究,以检查SViT每个组件的作用。实验结果表明,超级令牌(super tokens)具有不同的模式,从而降低了局部冗余。提出的超级令牌注意力(super token attention)将原始全局注意力(global attention)分解为乘法,有助于提高目标检测的准确性。这说明SViT的关键组件对于提高模型性能具有重要影响。
5、贡献
文章的贡献主要在于提出了一种新的图像分割方法——SViT。该方法通过将图像分割成固定大小的不重叠块,并将每个块展平成一个向量,然后利用Transformer对这些向量进行处理,从而实现在全局范围内的上下文建模。实验结果表明,SViT在多个图像分割任务中均取得了优于现有方法的性能,证明了其有效性。此外,文中还进行了详细的消融实验,探究了SViT中各组件的作用和效果。
二、StokenAttention代码学习
```clike
class StokenAttention(nn.Module):def __init__(self, dim, stoken_size, n_iter=1, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0.,proj_drop=0.):"""Args:dim (int): 特征维度。stoken_size (tuple): stoken的尺寸,格式为 (height, width)。n_iter (int): 迭代次数,默认为1。num_heads (int): 注意力头的数量,默认为8。qkv_bias (bool): 是否允许查询、键和值的偏置。qk_scale (float or None): 查询和键的缩放因子,默认为None。attn_drop (float): 注意力得分的dropout率,默认为0.0。proj_drop (float): 用于投影的dropout率,默认为0.0。"""super().__init__()# 初始化参数self.n_iter = n_iterself.stoken_size = stoken_sizeself.scale = dim ** - 0.5# 定义展开(unfold)和折叠(fold)操作self.unfold = nn.Unfold(3)self.fold = nn.Fold(3)# 定义用于精细化stoken的注意力模块self.stoken_refine = Attention(dim, num_heads=num_heads, qkv_bias=qkv_bias, qk_scale=qk_scale,attn_drop=attn_drop, proj_drop=proj_drop)def stoken_forward(self, x):'''执行图像处理中stoken的前向传播。Args:x (torch.Tensor): 输入图像张量,尺寸为 (B, C, H, W),其中B为批大小,C为通道数,H为高度,W为宽度。Returns:torch.Tensor: 处理后的图像张量。'''B, C, H0, W0 = x.shapeh, w = self.stoken_size# 计算填充数量pad_l = pad_t = 0pad_r = (w - W0 % w) % wpad_b = (h - H0 % h) % h# 执行填充操作if pad_r > 0 or pad_b > 0:x = F.pad(x, (pad_l, pad_r, pad_t, pad_b))_, _, H, W = x.shapehh, ww = H // h, W // w# 提取stoken特征和像素级特征stoken_features = F.adaptive_avg_pool2d(x, (hh, ww)) # (B, C, hh, ww)pixel_features = x.reshape(B, C, hh, h, ww, w).permute(0, 2, 4, 3, 5, 1).reshape(B, hh * ww, h * w, C)# 计算关联矩阵with torch.no_grad():for idx in range(self.n_iter):stoken_features = self.unfold(stoken_features) # (B, C*9, hh*ww)stoken_features = stoken_features.transpose(1, 2).reshape(B, hh * ww, C, 9)affinity_matrix = pixel_features @ stoken_features * self.scale # (B, hh*ww, h*w, 9)affinity_matrix = affinity_matrix.softmax(-1) # (B, hh*ww, h*w, 9)affinity_matrix_sum = affinity_matrix.sum(2).transpose(1, 2).reshape(B, 9, hh, ww)affinity_matrix_sum = self.fold(affinity_matrix_sum)if idx < self.n_iter - 1:stoken_features = pixel_features.transpose(-1, -2) @ affinity_matrix # (B, hh*ww, C, 9)stoken_features = self.fold(stoken_features.permute(0, 2, 3, 1).reshape(B * C, 9, hh, ww)).reshape(B, C, hh, ww)stoken_features = stoken_features / (affinity_matrix_sum + 1e-12) # (B, C, hh, ww)# 更新stoken特征stoken_features = pixel_features.transpose(-1, -2) @ affinity_matrix # (B, hh*ww, C, 9)stoken_features = self.fold(stoken_features.permute(0, 2, 3, 1).reshape(B * C, 9, hh, ww)).reshape(B, C, hh, ww)stoken_features = stoken_features / (affinity_matrix_sum.detach() + 1e-12) # (B, C, hh, ww)# 对stoken特征进行精细化stoken_features = self.stoken_refine(stoken_features)# 折叠stoken特征得到像素级特征stoken_features = self.unfold(stoken_features) # (B, C*9, hh*ww)stoken_features = stoken_features.transpose(1, 2).reshape(B, hh * ww, C, 9) # (B, hh*ww, C, 9)pixel_features = stoken_features @ affinity_matrix.transpose(-1, -2) # (B, hh*ww, C, h*w)pixel_features = pixel_features.reshape(B, hh, ww, C, h, w).permute(0, 3, 1, 4, 2, 5).reshape(B, C, H, W)# 去除填充if pad_r > 0 or pad_b > 0:pixel_features = pixel_features[:, :, :H0, :W0]return pixel_featuresdef direct_forward(self, x):"""执行直接处理的前向传播。Args:x (torch.Tensor): 输入张量。Returns:torch.Tensor: 处理后的张量。"""B, C, H, W = x.shapestoken_features = xstoken_features = self.stoken_refine(stoken_features)return stoken_featuresdef forward(self, x):"""执行前向传播。Args:x (torch.Tensor): 输入张量。Returns:torch.Tensor: 处理后的张量。"""if self.stoken_size[0] > 1
---# 总结
本周主要阅读了CVPR文章,带有超令牌采样的视觉转换器。该论文提出了一个名为SViT的方法,这是一种基于Transformer的模型,SViT主要由以下几个关键组件构成:卷积位置嵌入(CPE)、卷积FFN(ConvFFN)及空间注意力(STA)模块,通过在Transformer中引入卷积层,使得模型能够更好地利用局部信息,同时保持了Transformer对全局信息的建模能力。除此之外,还学习学习了StokenAttention的注意力模块代码的学习。下周继续努力!