代码: 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博客
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计算使得计算量减少。
Swim Transformer主要包含三个阶段:image to token, model stages,head。
类似于VIT,直接将输入图像划分为互不重叠大小为4*4的图像块,然后利用线性层对图像块进行embedding,再加上position embedding。
类似于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。
图像经过model stages 之后已经是可用的高层特征了,head部分就是根据任务进行计算就好,比如分类任务,可以直接用mlp进行分类。
——————————————————————————————————————
基本结构和Swin Transformer几乎完全一致,只是在计算时多了时间维度。
Video Swin Transformer由三个部分组成:video to token, model stages,head。
在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 stage包括Video Swin Transformer Block 和 Patch merging组成。
可以分为两部分,Video W-MSA 和 Video SW-MSA。这里相当于将Swin Transformer Block计算由二维拓展到三维。
滑动窗口是3D的。
对于输入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块计算如下所示:
类似于max pooing,将相邻(2*2窗口内)token特征合并,而后再利用线性层降维。
例如second stage的线性层将每个token 4C维度的特征映射到 2C 维度。
这里每次进行patching merging,视频帧数是不变的。
在经过Model stages之后,得到了多帧数据的高维特征,
用于视频分类时需要进行简单的帧融合(average),作者代码中用的是I3D Head。
Human action recognition:Kinetics-400,Kinetics-600,Something-Something v2
测试三种不同的时空注意力方式
joint表示在每个3D window-based MSA layer中同时进行时空注意力
split表示在spatial-only Swin Transformer后面加上两个temporal transformer层
factorized表示在每个spatial-only MSA layer后面都增加一个temporal-only MSA layer
从表4中可以看出joint版本实现了最佳速度精度折衷。
split版本在我们的场景中无法正常工作。虽然这个版本自然可以从预先训练的模型中获益,但是这个版本的时间建模并没有那么有效。
factorized版本产生相对较高的top-1精度,但需要比joint版本更多的参数。这是由于factorized版本在每个spatial-only注意层之后具有temporal-only注意层,而joint版本在相同的注意层中执行空间和时间注意。
Temporal dimension和window size越大,效果越好,但计算代价也更高。
关于backbone和head学习率比率的实验结果如表7所示。backbone结构学习率相对于head学习率的比率较低时,可以提高精度。
由于在ImageNet-21K上预训练的模型更强,因此使用在ImageNet-21K上预训练的模型从该技术中受益更多。
因此,主干在拟合新的视频输入时会慢慢忘记预先训练的参数和数据,从而获得更好的泛化效果。
这一结果为进一步研究如何更好地利用预先训练的权重提供了方向。
从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初始化。