[Video Transformer] Video Swin Transformer

代码: GitHub - SwinTransformer/Video-Swin-Transformer: This is an official implementation for "Video Swin Transformers".

论文: https://arxiv.org/pdf/2106.13230.pdf

代码解读: Swin-Transformer代码讲解-Video Swin-Transformer_ly59782的博客-CSDN博客

Swin Transformer

https://arxiv.org/abs/2103.14030v1?ref=hackernoon.com#

https://github.com/microsoft/Swin-Transformer

Swin Transformer的最大特点是类似于CNN中的conv+pooling结构,

在Swin Transformer中是Swin Transformer Block + Patch merging。

通过多个stage,token数越来越少,每个token的感受野也会越来越大。

同时,token数的递减以及window transformer计算使得计算量减少。

[Video Transformer] Video Swin Transformer_第1张图片

Swim Transformer主要包含三个阶段:image to token, model stages,head。

Image to token

类似于VIT,直接将输入图像划分为互不重叠大小为4*4的图像块,然后利用线性层对图像块进行embedding,再加上position embedding。

Model stages

类似于vgg或resnet结构,Model stages由多个重复的stage组成,每个model stage包括Swin Transformer Block 和 Patch merging组成。随着网络的加深,Swin Transformer 可以提取较VIT更好的高层特征。

1)Swin Transformer Block 由可以分为两部分,W-MSA and SW-MSA。

MSA即为transformer 中的MSA(Multihead self attention)。在Swin Transformer中加入了window和shift window。

2)Patch merging类似于max pooing,将4个patch合成一个新的patch,而后再利用线性层控制通道维度为2C。

Head

图像经过model stages 之后已经是可用的高层特征了,head部分就是根据任务进行计算就好,比如分类任务,可以直接用mlp进行分类。

——————————————————————————————————————

Video Swin Transformer

基本结构和Swin Transformer几乎完全一致,只是在计算时多了时间维度。

Video Swin Transformer由三个部分组成:video to token, model stages,head。

[Video Transformer] Video Swin Transformer_第2张图片

 

Video to token

在image to token中,是将4x4的图像块作为一组。

而在Video to token中,输入视频数据为T*H*W*3

首先通过3D Patch Partition得到T/2*H/4*W/4个尺寸为2 * 4 * 4 * 3 3D Patch

而后再进行线性embedding以及position embedding。

后续处理中时间维度是不变的。

 

Model stages

每个model stage包括Video Swin Transformer Block 和 Patch merging组成。

1)Video Swin Transformer Block

可以分为两部分,Video W-MSA 和 Video SW-MSA。这里相当于将Swin Transformer Block计算由二维拓展到三维。

滑动窗口是3D的。

[Video Transformer] Video Swin Transformer_第3张图片

对于输入8*8*8,窗口大小4*4*4,则第 l 层窗口数为2*2*2=8.

对于第 l + 1 层,窗口分区配置沿着来自上一层自注意模块的时间、高度和宽度方向分别移动

P/2、M/2、M/2 个token的距离。

如图右所示,输入大小为8×8×8,窗口大小为4×4×4。由于l 层采用常规的窗口划分,

l 层中的窗口数为2×2×2=8。对于第 l + 1 层,当窗口会在三个方向上分别移动

(P/2,M/2,M/2)=(2,2,2) 个token的距离,因此窗口数量为3×3×3=27。

采用滑动窗口划分的方法,两个连续的Video Swin Transformer块计算如下所示:

[Video Transformer] Video Swin Transformer_第4张图片

[Video Transformer] Video Swin Transformer_第5张图片

 

2)Patch merging

类似于max pooing,将相邻(2*2窗口内)token特征合并,而后再利用线性层降维。

例如second stage的线性层将每个token 4C维度的特征映射到 2C 维度。

这里每次进行patching merging,视频帧数是不变的。

 

3D Relative Position Bias

 

Head

在经过Model stages之后,得到了多帧数据的高维特征,

用于视频分类时需要进行简单的帧融合(average),作者代码中用的是I3D Head。

Human action recognition:Kinetics-400,Kinetics-600,Something-Something v2

[Video Transformer] Video Swin Transformer_第6张图片

[Video Transformer] Video Swin Transformer_第7张图片

Ablations

测试三种不同的时空注意力方式

joint表示在每个3D window-based MSA layer中同时进行时空注意力

split表示在spatial-only Swin Transformer后面加上两个temporal transformer层

factorized表示在每个spatial-only MSA layer后面都增加一个temporal-only MSA layer

[Video Transformer] Video Swin Transformer_第8张图片

从表4中可以看出joint版本实现了最佳速度精度折衷。

split版本在我们的场景中无法正常工作。虽然这个版本自然可以从预先训练的模型中获益,但是这个版本的时间建模并没有那么有效。

factorized版本产生相对较高的top-1精度,但需要比joint版本更多的参数。这是由于factorized版本在每个spatial-only注意层之后具有temporal-only注意层,而joint版本在相同的注意层中执行空间和时间注意。

 Temporal dimension和window size越大,效果越好,但计算代价也更高。

[Video Transformer] Video Swin Transformer_第9张图片

[Video Transformer] Video Swin Transformer_第10张图片

关于backbone和head学习率比率的实验结果如表7所示。backbone结构学习率相对于head学习率的比率较低时,可以提高精度。

由于在ImageNet-21K上预训练的模型更强,因此使用在ImageNet-21K上预训练的模型从该技术中受益更多。

因此,主干在拟合新的视频输入时会慢慢忘记预先训练的参数和数据,从而获得更好的泛化效果。

这一结果为进一步研究如何更好地利用预先训练的权重提供了方向。

[Video Transformer] Video Swin Transformer_第11张图片

从ViViT中得知,linear embedding layer的center初始化要远远优于inflate初始化。

在video swin transformer中,采用center初始化与采用inflate初始化具有相同的性能。

在本文中,我们默认采用传统的线性嵌入层inflate初始化。

对于3D relative position bias matrix,也有两种不同的初始化选择,duplicate或center初始化。

center初始化通过使用较小的负值屏蔽不同帧之间的相对位置偏差,使每个token从一开始就只聚焦在同一帧内。

如表9所示,两种初始化方法达到了相同的top-1精度。默认情况下,采用duplicate初始化。

[Video Transformer] Video Swin Transformer_第12张图片

你可能感兴趣的:(video,transformer,transformer,深度学习,人工智能)