Reading

Video Model 概述

Classification,Detection

  • Classification:给定预先裁剪好的视频片段,预测其所属的行为类别
  • Detection:视频是未经过裁剪的,需要先进行人的检测where和行为定位(分析行为的始末时间)when,再进行行为的分类what。

通常所说的行为识别更偏向于对时域预先分割好的序列进行行为动作的分类,即 Trimmed Video Action Classification。

Two-Stream

Two-stream convolutional networks

简介

Two-Stream CNN网络顾名思义分为两个部分,

  1. 空间流处理RGB图像,得到形状信息;
  2. 时间流/光流处理光流图像,得到运动信息。

两个流最后经过softmax后,做分类分数的融合,可以采用平均法或者是SVM。不过这两个流都是二维卷积操作。最终联合训练,并分类。

image

如图所示,其实做法非常的简单,相当于训练两个CNN的分类器。一个是专门对于 RGB 图的, 一个专门对于光流图的, 然后将两者的结果进行一个 fushion 的过程。

  • RGB图的选择:是对于所给的一段视频随机挑选出视频中的任意一帧;
  • 光流图的选择:视频中的任意一帧的时间及其后面的N帧叠合成一个光流栈进入训练。这种光流的训练方式是论文作者认为,这样子的光流叠加可以获得它的运动信息流,但是实际上光流图并不是以motion的信息来得到结果。

什么是光流(Optical flow)?

optical flow是由一些位移矢量场(displacement vector fields)(每个矢量用\(dt\)表示)组成的,其中\(dt\)是一个向量,表示第t帧的displacement vector,是通过第\(t\)和第\(t+1\)帧图像得到的。\(dt\)包含水平部分\(dt_x\)和竖直部分\(dt_y\),可以看下图中的(d)和(e)。因此如果一个video有\(L\)帧,那么一共可以得到\(2L\)个channel的optical flow,然后才能作为Figure1中temporal stream convnet网络的输入。

image

上图中的(a)和(b)表示连续的两帧图像,(c)表示一个optical flow,(d)和(e)分别表示一个displacement vector field的水平和竖直两部分。

所以如果假设一个video的宽和高分别是\(w\)\(h\),那么Figure1中temporal stream convnet的输入维度应该是\(I_τ ∈ R^{w×h×2L}\)。其中\(τ\)表示任意的一帧。

文章实验了多种多帧画面的光流位移的输入

光流栈(Optical flow stacking

光流栈(Optical flow stacking),或者叫做光流的简单叠加。简单的来说就是计算每两帧之间的光流,然后简单的stacking。(1)列出了分别得到水平和竖直方向的 \(I_τ\)的计算公式,其中\((u,v)\)表示任意一个点的坐标。因此\( I_τ(u,v,c) \)存的就是\((u,v)\) 这个位置的displacement vector。

关于光流算法具体求解,可以看: KLT 光流算法详解

\[\begin{aligned} I_\tau(u, v, 2k-1) &= d_{\tau+k-1}^x(u, v), \\ I_\tau(u, v, 2k) &= d_{\tau+k-1}^y(u, v), \quad u = [1; w], v = [1; h], k = [1; L]. \end{aligned} \tag{1} \]
image

轨迹叠加(Trajectory stacking)

在基于轨迹的描述符的启发下,另一种运动表示法将在多个帧的相同位置采样的光流替换为沿运动轨迹采样的流。

顾名思义,轨迹叠加就是假设第一帧的某个像素点,我们可以通过光流来追踪它在视频中的轨迹,即用来描述一个对应特征点连续的光流变化。

\[\begin{aligned} I_\tau(u, v, 2k-1) &= d_{\tau+k-1}^x(\mathbf{p}_k), \\ I_\tau(u, v, 2k) &= d_{\tau+k-1}^y(\mathbf{p}_k), \quad u = [1; w], v = [1; h], k = [1; L]. \end{aligned} \tag{2} \]
\[\mathbf{p}_1 = (u, v); \quad \mathbf{p}_k = \mathbf{p}_{k-1} + \mathbf{d}_{\tau+k-2}(\mathbf{p}_{k-1}), \quad k > 1. \]
image

因为这个双流法是训练了两个网络,在最后 softmax 前进行了fushion,显示效果不错。

对于长范围时间结构的建模无能为力
主要因为它仅仅操作一帧(空间网络)或者操作短片段中的单堆帧(时间网络),因此对时间上下文的访问是有限的。视频级框架TSN可以从整段视频中建模动作。

TSN(Temporal Segment Networks)

这篇ECCV2016的文章主要提出TSN(temporal segment network)结构用来做视频的动作识别。TSN可以看做是双流(two stream)系列的改进,在此基础上,文章要解决两个问题:

  1. 是long-range视频的行为判断问题(有些视频的动作时间较长)。
  2. 是解决数据少的问题,数据量少会使得一些深层的网络难以应用到视频数据中,因为过拟合会比较严重。

针对第一个问题,首先,为什么目前的双流结构网络难以学习到视频的长时间信息?因为其针对的主要是单帧图像或者短时间内的一堆帧图像数据,但这对于时间跨度较长的视频动作检测而言是不够的。因此采用更加密集的图像帧采样方式来获取视频的长时间信息是比较常用的方法,但是这样做会增加不少时间成本,同时作者发现视频的连续帧之间存在冗余,因此想到用稀疏采样代替密集采样,也就是说在对视频做抽帧的时候采取较为稀疏的抽帧方式,这样可以去除一些冗余信息,同时降低了计算量。

针对第二个问题,可通过常规的数据增强方式,比如随机裁剪,水平翻转等;另外还有作者提到的交叉预训练,dropout等方式来减少过拟合。这些后面会详细解释。

image.png

上图就是作者提出的TSN网络。网络部分是由双路CNN组成的,分别是spatial stream ConvNets和temporal stream ConvNets,这和双流网络文章中介绍的结构类似,在文中这两个网络用的都是BN-Inception(双流论文中采用的是较浅的网络:ClarifaiNet)。那么这两路CNN以什么为输入呢?spatial stream ConvNets以单帧图像作为输入,temporal stream ConvNets以一系列光流图像作为输入,换句话说两个网络的输入类型是不一样的。

当然最重要的是temporal segment network(包含多个spatial stream convnet和temporal convnet,参看Figure1)的输入不是单帧图像或短时间内的一堆图像帧,而是从视频中稀疏采样得到的一系列snippets,这就是为了获取视频的长时间信息所做的改进。

Figure1的最左边是一个Video,用 \(V\) 表示,将 \( V\) 分成 \(K\) 份(文中\(K\)采用3),用(\(S_1,S_2,…,S_K\))表示。这样TSN网络就可以用下面这个式子表示:

\[TSN(T_1,T_2,...,T_K) = \mathcal{H}(\mathcal{G}(\mathcal{F}(T_1;W),\mathcal{F}(T_2;W),··· ,\mathcal{F}(T_K;W))).\]

这里的(\(T_1,T_2,…,T_K\))表示 \(K\) 个snippets,snippets翻译过来也是小片段,也就是说 \(T_k\) 是从\((S_1,S_2,…,S_k)\) 中对应的视频片段\(S_k\)中随机采样出来的结果,\(T_k\)是一个snippet,每个snippet包含一帧图像和两个光流特征图。这也就完成了作者说的稀疏采样。上面式子中的 \(W\) 就是网络的参数,因此 \(\mathcal{F}(T_k;W)\) 就是网络的输出,也就是该snippet属于每个类的得分。\(\mathcal{F}\) 函数的输出结果就是上图中spatial convnet或temporal convnet的输出结果,可以看上图中convnet图后面的绿色条形图,代表的就是socre在类别上的分布。\(\mathcal{G}\) 是一个融合函数,在文中采用的是均值函数,就是对所有snippet的属于同一类别的得分做个均值,毕竟我们最后要求的是这个video属于哪个类别,而不是这个video的某个snippet属于哪个类别。\(\mathcal{G}\) 函数的输出结果就是图中segmental consesus的输出结果。最后用 \(\mathcal{H}\) 函数(文中用的softmax函数)根据得分算概率,概率最高的类别就是该video所属的类别。注意,在输入softmax之前会将两条网络的结果进行合并,默认采用加权求均值的方式进行合并,文中用的权重比例是spatial:temporal=1:1.5。另外需要强调的是:图中的 \(K\) 个spatial convnet 的参数是共享的,K个temporal convnet的参数也是共享的,实际用代码实现时只是不同的输入过同一个网络。

网络采用交叉熵Loss,损失函数如下(standard categorical cross-entropy),\(C\)表示类别数,\(y_i\)是标签。

\[\mathcal{Y}(y,G)=-\sum_{i=1}^Cy_i\left(G_i-log\sum_{j=1}^CexpG_j\right)\]

其中\(G\)表示:

\[\mathcal{G}(\mathcal{F}(T_1;W),\mathcal{F}(T_2;W),··· ,\mathcal{F}(T_K;W))\]

也就是说 \(G\) 是一个长度为C的向量,表示一个video属于每个类别的得分。

由于视频样本较少,训练较深的ConvNet可能会过拟合。为了解决该问题,作者提出了如下的策略:

  • 跨模态预训练:RGB网络可以使用ImageNet预训练,但是光流网络没有预训练的数据集,所有作者采用ImageNet上预训练的参数来初始化光流模型参数。
  • 正则化Batch Normalization用来解决协变量偏移的问题。在学习过程中,BN将估计每批中的激活均值和方差,并使用它们将这些激活值转换为标准高斯分布。该操作会使得模型收敛速度变快,但是同时会带来了过拟合的问题。因此,作者通过固定住除了第一层以外,其他层的BN参数(partial BN),来解决该问题。而且,作者在BN-Inception模型后面加入了dropout层,来解决过拟合的问题。
    数据增强:random cropping、horizontal flipping、corner cropping、scale jittering。

3D卷积

C3D

C3D是除了Two-Stream后的另外一大主流方法,但是目前来看C3D的方法得到的效果普遍比Two-Stream方法低好几个百分点。但是C3D仍然是目前研究的热点,主要原因是该方法比Two-Stream方法快很多,而且基本上都是端到端的训练,网络结构更加简洁。该方法思想非常简单,图像是二维,所以使用二维的卷积核。视频是三维信息,那么可以使用三维的卷积核。所以C3D的意思是:用三维的卷积核处理视频。

3D-CNN和2D-CNN的区别

此部分采用C3D网络架构提取视频序列帧的特征,类似于2D卷积,3D卷积的形象描述如下图所示。3D卷积对H、W和L三个维度都进行卷积,而2D卷积(多通道(b))只对H和W两个维度进行卷积,因此3D卷积得到的是三维输出,而2D卷积得到的是二维输出。

image

区别

a)和b)分别为2D卷积用于单通道图像和多通道图像的情况(此处多通道图像可以指同一张图片的3个颜色通道,也指多张堆叠在一起的图片,即一小段视频),对于一个滤波器,输出为一张二维的特征图,多通道的信息被完全压缩了。
而c)中的3D卷积的输出仍然为3D的特征图。
如果输入一段视频,其大小是,其中\(C\)是通道数(一般是3),\(h\)\(w\)分别是每帧的高和宽,3D卷积的卷积核和池化核也是3D的,很容易想象得到,就是比2D的往里扩展一个维度,所以核大小是\(d\)是核的时间深度,\(K*K\)是空间上的大小。

网络结构

网络结构也特别的简单:

image

C3D共有8次卷积操作,5次池化操作。其中卷积核的大小均为\(3 ∗ 3 ∗ 3\) ,步长为\(1 ∗ 1 ∗ 1 \)。池化核为\(2 ∗ 2 ∗ 2\) ,但是为了不过早的缩减在时序上的长度,第一层的池化大小和步长为\(1 ∗ 2 ∗ 2 \)

最后网络在经过两次全连接层和softmax层后得到的最终的输出结果。网络的输入为\(3 ∗ 16 ∗ 112 ∗ 112\),其中3为RGB三通道,16为输入图像的帧数,\(112 ∗ 112\)* *是图像的输入尺寸。

I3D

目前针对于video的模型架构还不明确,主要集中于以下几个问题

  • 卷积核是2D还是3D
  • 输入网络的是原始RGB视频还是预计算得到的光流
  • 对于2D的ConvNets来说,不同帧之间的信息是使用LSTM还是feature aggregation

比较的范围有三类对象

  • 2D ConvNets with LSTM on top
  • Two-stream networks
  • 3D ConvNets

模型结构

下列是本文重新实现的5种代表性模型结构

image

(a) ConvNet + LSTM

  • 由于图像分类网络效果特别好,因此人们总想尽可能原封不动地把模型应用到视频上,如Karpathy做的那篇early/late/slow fusion的文章,但这样就会导致模型忽视了时序结构(如不能分辨开门与关门)
    因此,可以在模型后面加上LSTM来处理时序问题
  • 模型细节:把LSTM和BN加在Inception v1的最后一个average pooling层后面(即分类器之前),有512个节点。在模型最顶部加一个全连接层用于分类;The model is trained using cross-entropy losses on the outputs at all time steps. During testing we consider only the output on the last frame;输入帧是在25帧/s的视频流中每5帧取1帧,根据表1给出的信息,作者应该是从数据集的video中选取了5s的视频片段,所以总共是5s * 25帧/s * 1/5 = 25张rgb图像

(b) 3D ConvNet

  • 3D ConvNet看上去是一种很自然的方法,能够直接对于时空数据创建高层表征
    但这个模型有两个问题:
    1. 相比于2D,参数更多,也就更难训练(因为数据量不足),所以之前3D ConvNet用的都是浅层的架构
    2. 由于都是三维的核,无法直接用在ImageNet上预训练过的网络,因此只能在video数据集上train from scratch。由于之前的数据集量都太小,因此效果不是太有竞争力。但这种方法可能会比较适用于大数据集
  • 模型细节:是原论文中C3D的变种。8层卷积、5层pooling、2层全连接。与C3D的区别在于这里的卷积和全连接层后面加BN;且在第一个pooling层使用stride=2,这样使得batch_size可以更大。输入是16帧,每帧112*112。

(c) Two-Stream Networks

  • LSTM缺点:能model高层变化却不能捕捉低层运动(因为在低层,每个帧都是独立地被CNN提取特征),有些低层运动可能是重要的;训练很昂贵
  • Two-Stream Networks: 将单独的一张RGB图片和一叠计算得到的光流帧分别送入在ImageNet上预训练的ConvNet中,再把两个通道的score取平均这种方法在现在的数据集上效果很好,训练和测试都十分经济
  • 一个改进(Fused Two-Stream): 在最后一层卷积层之后,使用3D ConvNet把空间流和时间流融合(相比于传统双流是在softmax后才做fusion,把softmax输出的score进行平均)在HMDB数据集上提升了效果,测试时间也更短
  • 模型细节:输入是每隔10帧取连续的5帧以及相应的光流。在Inception v1之后,是一个333的3D卷积层,输出是512个channel,随后是一个333的3D max-pooling层以及全连接层。这个新的网络是用高斯随机初始化
  • 对于双流网络有两种实现,一种实现是训练时把两个流分开训练,测试的时候在最后把两个流的预测结果做平均;第二种是直接端到端进行训练。在c)和d)的实现中使用的是端到端;而在e)的实现中使用了第一种实现

(d) Two-Stream Inflated 3D ConvNets

  • 结论:3D ConvNets可以受益于在ImageNet上训练过的2D ConvNet模型,并有选择性的使用相应的预训练参数;虽然3D ConvNets可以直接从RGB流中学习到时序信息,但是使用光流还是可以提升效率
  • 区别于之前的几种双流,光流数是RGB帧数的2L倍,这里光流和RGB帧都使用了64帧
    Inflating 2D ConvNets into 3D
  • 把一些很成功的2D模型转移成3D,通过把所有卷积核以及pooling核增加时间的一维
    Bootstrapping 3D filters from 2D filters
  • 想要利用在ImageNet上预训练好的2D模型的参数:
    Idea: 若是把ImageNet中的同一张图片反复复制生成一个序列,那么这个序列就可以当作是一个video来训练3D模型了
  • 具体实现:把2D模型中的核参数在时间维上不断复制,形成3D核的参数,同时除以N,保证输出和2D上一样;别的非线性层结构都与原来的2D模型一样
  • Pacing receptive field growth in space, time and network depth (在时间维度上的感受野要如何变化,即conv和pooling的stride怎么选)
  • 在Image模型中,对待水平和垂直两个空间维度往往是一致的,也就是两个维度上pooling核大小以及stride都一样
    在时间维度上这样的对称对待未必是最优的(也就是时间维度上的pooling核大小选与空间上的一致是不可取的),因为这取决于帧率和图像大小之间的相对值
    具体实现:在Inception v1中,涉及到感受野变化的就是第一个卷积核(stride=2)以及后续4个max-pooling(stride=2),还有最后的一个\(7*7\)average-pooling层。在本文的实验中,作者发现:在前两个max-pooling层上,时间维度上的stride取1;而在别的max-pooling层上使用对称的stride(即时间维度上的stride和空间上的一致);最后的average pooling使用\(27*7\)的核

(e) Two 3D Streams

  • 作者发现双流还是有价值的,可能因为3D ConvNet只有纯前馈计算,而光流提供了迭代的思想在里面
  • 训练时,分别训练这两个网络,测试的时候在最后把两个流的预测结果做平均

实验对比

image

Non-local

前言

I3D奠定了3D CNN的视频处理架构之后,后续的就是各种改进了。其中一点,就是如何处理更长的视频,也就是该如何进行更好的时序建模。

恰好这一时期,NLP领域发生了一个巨大的变革,transformer、GPT和BERT相继被提出来了,并被广泛证明其有效性。而其中的attention操作,本来就是可以学习远距离信息的,与LSTM的作用不谋而合。所以本文的作者,就考虑将self-attention融入I3D当中。

结果也证明这样做确实有效,后续视频检查分割等等任务,都融入了non-local算子。尤其是2019年,简直都卷疯了,不知道有多少论文,尝试用各种方式将attention操作加到不同的视频分割网络结构里来。

卷积(convolutional)和递归(recurrent)都是对局部区域进行的操作,所以它们是典型的local operations。那如果能看到更长距离的上下文,肯定是对各种任务都有帮助的。 受计算机视觉中经典的非局部均值(non-local means)的启发,本文提出一种non-local 算子用于捕获长距离依赖,可用于建模图像上两个有一定距离的像素之间的联系,建模视频里两帧的联系,建模一段话中不同词的联系等。 non-local operations在计算某个位置的响应时,是考虑所有位置features的加权——所有位置可以是空间的,时间的,时空的。所以non-local 算子是一个即插即用的 building blocks(模块),所以可以用于各种任务,泛化性好。在视频分类、物体检测、物体分割、姿态估计等任务也都取得了不错的效果。

Non-local Block结构

下图是一个时空Non-local Block,也就是专门用于视频理解的Non-local 模块。输入X经过变换得到 \(\theta ,\phi ,g\),也就相当于self-attention里的q、k、v。然后前两者做点积注意力操作得到注意力分数,再和g做加权求和,得到最终的自注意力结果。这个结果和模块的输入做一个残差连接,得到整个模块的最终输出Z:

\[Z=W_Z⋅Attention(θ,ϕ,g)+X=W_Z⋅softmax(\frac{θϕ^T}{\sqrt{d_ϕ}})g+X\]
image.png
  • 上图T应该是输入的视频帧的数量,\(H\)\(W\)是视频帧的高宽尺寸。
  • 计算过程中, \(\theta ,\phi ,g\)的维度是输入X的一半,减少计算量。最后乘以 \(W_Z\) 时,恢复原来的通道数(也就是图中1×1×1的卷积操作),这样就可以做残差连接了(\(\bigotimes,\bigoplus\)分别表示矩阵乘法和矩阵加法)
  • 这种残差结构,可以让我们在任意的模型中插入一个新的non-local block,而不改变其原有的结构。

整体的网络结构如下图所示:

image.png

将non-local block嵌入到I3D网络中

实验&结论

baseline

  • ResNet-50 C2D baseline:2D 卷积核,3D pooling,结构如下图: 作者先构造了一个没有使用non local的ResNet-50 C2D baseline。输入的video clip是32帧,大小为\(224*224\)。所有卷积都是2D的,即逐帧对输入视频进行计算。唯一和时序有关的计算就是pooling,即简单的在时间维度上做了一个聚合操作。
  • I3D:上面的C2D可以通过I3D论文中Inflating的方式扩张成3D CNN,即卷积核也变成3D的。但采用两种扩张方式:一种是将residual block中的卷积核由\(3*3\) 扩张为\(3*3*3\),另一种是将residual block中卷积核由\(1*1\)扩张为\(3*1*1\)。扩张后的模型分别表示为\(I3D_{3\ast 3\ast 3}\)\(I3D_{3\ast 1\ast 1}\)

作者将self attention引入到了视觉领域,而且针对视频理解,提出了spacetime self attention,通过一系列实验,证明了其有效性。从此在CV 领域,大家基本都使用non local算子,而不使用LSTM了。

SlowFast

  • 研究动机:人的视觉系统有两种细胞:p细胞和m细胞。前者数量占比约80%,主要处理静态图像;后者占比约20%,主要处理运动信息。这种方式就类似双流网络,受此启发,作者设计了SlowFast网络。
  • 摘要:本文提出了一种快慢结合的网络来用于视频分类。其中一路为Slow网络,输入为低帧率,用来捕获空间语义信息。另一路为Fast网络,输入为高帧率,用来捕获运动信息,且Fast网络是一个轻量级的网络,其channel数比较小。SlowFast网络在Kinetics数据集上视频分类的精度为79.0%,在AVA动作检测达到了28.3mAP,都是当前的SOTA效果。

模型结构

整体结构

image.png

如上图所示,SlowFast网络有两条分支。

  • Slow pathway:类似p细胞,主要学习静态图像
    • 慢分支每隔 \(τ\) 帧取一帧,假设输入是 \(T\) 帧时,原视频是 \(τ×T\) 帧的vedio clip。
    • 默认\(T=4,τ=16\)(以帧率30fps来说,刷新速度大约是每秒采样2帧)。
    • 慢分支的网络就类似一个I3D,网络是比较大的。但因为输入只有4帧,所以相对而言,计算复杂度也不高
  • Fast pathway:快分支用于处理动态信息,所以需要更多的输入帧。
    • 高帧率:每隔\(τ/α\) 帧取一帧,所以输入是 \(αT\) 帧,默认\(α=8\),快分支输入就是32帧。
    • \(α\)是两个分支的帧速比,是SlowFast的关键概念,它表示这两条pathways的时间速度不同,促使两个分支分别学习不同的特征。
    • 低通道容量:相比于Slow分支, Fast分支的channel数是其 \(β\) 倍(默认\(β=1/8\)),所以是一个轻量级的分支。一般计算复杂度(FLOPs)是channel的平方关系,最后Fast分支约占整个网络计算量的20%。(上面也提到了,m细胞约占总数的15%-20%)
    • 高时间分辨率:整个Fast分支中均不使用时间下采样层(既不使用时间池化,也不使用时间步长的卷积操作),这样一来,特征张量在时间维度上总是\(αT\)帧,尽可能地保持时间保真度。
  • Lateral connections(侧连接):将快分支的特征融合到慢分支上
    • 两条分支的每个 stage 上都使用一个侧连接,将快分支的特征融合到慢分支上。作者也尝试了双向融合,提升不大。
    • 对于 ResNets而言,这些连接就位于\(pool_1,res_2,res_3,res_4\)之后。
    • 这两条分支的时间维度不同,通过变换来将它们匹配在一起。

SlowFast使用小输入大网络的Slow pathway,和大输入小网络的Fast pathway,两个分支还使用侧连接进行信息融合,来学习更好的时空特征。通过这种设计,SlowFast达到了一种较好的时间和精度的平衡。

前向过程

image.png
  • Slow pathway:就是一个ResNet-50 I3D,所以有四个res block,卷积层个数分别是3、4、6、3。
  • Fast pathway:channel数是上图黄色数字,远远少于慢分支的channel数。
  • forword:
    • 输入:慢分支和快分支输入维度分别是\([T,S^{2},C]\)\([\alpha T,S^{2},\beta C]\)。假设样本是64帧224×224的视频帧,则慢分支和快分支的输入分别是4帧和32帧;
    • 下采样:在时间维度上,两个分支始终没有在时间维度上进行下采样,也就是始终保持32帧和4帧,使网络可以更好地学习时序信息;空间维度和原来一样,每个block都进行2倍的下采样
    • 侧连接:文中讨论了三种将快分支特征变换到慢分支同维度特征的方法,最后采用3D Time-strided卷积:\(kernel size=5\times 1^2,output -channel=2\beta C,stride=\alpha\)
    • 两个分支各接一个全局平均池化层,然后进行特征融合(concate)。最后接一个FC层(包含softmax),得到最终结果。

实验结果

对比Kinetics上的视频分类结果(表2)

  • 表2灰色部分表示都使用了ImageNet预训练的模型
  • 下表还对比了不同的计算复杂度,最小的SlowFast计算复杂度是很小的。
  • 随着输入帧数的提高,更换更深的backbone,以及最后加入了non-local算子,模型的精度一直在提升。最优模型在Kinetics-400上的精度达到了79.8%,基本是3D CNN中的最好结果。
  • 表3使用Kinetics-600数据集进行训练,精度更高


image.png
image.png

对比AVA上视频分割效果

image.png

另外还做了很多消融实验,比如\(α\)\(β\)\(T\)改如何取值等等,就不一一列举了。

2D替换3D卷积

R(2+1)D

  • 主要内容:本文详细讨论了,在动作识别任务上做时空卷积的几种网络结构,是一篇实验性质的论文。
  • 研究动机:作者发现,只使用2D CNN网络对一帧帧的单个视频帧抽取特征,最后动作识别的效果和3D网络差不多。而2D CNN是比3D CNN便宜很多的,所以作者考虑,在3D CNN网络结构中,部分加入2DCNN网络,并试验了各种网络结构。
  • 结论:通过Sports-1M、Kinetics等多个数据集上的测试,证明了将3D 卷积拆分成空间上的2D+时间上的1D的网络结构,效果最好,也易于训练

几种网络结构对比:

image.png
  • R2D:将时间维度合并到channel维度中。比如将输入维度 [C,T,H,W ]→[CT,H,W],然后直接输入到2D卷积网络中,得到最后的分类结果。
  • MCx:前x层为3D卷积网络,而其余顶层为2D卷积网络,也就是先在底层抽取时空特征,然后上层用2D CNN降低复杂度
  • rMCx:将一帧帧视频帧先输入x 层2D Conv抽取特征,再用3D Conv去做一些融合,输出最后的结果
  • R3D:ResNet版本的I3D,即backbone换成3D ResNet,整体结构如下:
image.png

对比结果

下面对比了几种网络结构在Kinetics验证集上的动作识别精度,并且都是使用ResNet-18从头训练的模型:

image.png
  • 单纯使用2D卷积神经网络效果最差,只使用3D效果稍微高一点、
  • 不管是MCx还是 rMCx,加入部分2D网络,效果都有提高
  • 本文提出的R(2+1)D网络结构的效果最好

R(2+1)D结构

image.png

如上图所示, R(2+1)D 就是将一个 \(t×d×d\)的卷积核,替换为一个 \(1×d×d\) 的卷积核和一个\(t×1×1\) 的卷积核。也就是先只在空间维度(宽高尺度)上做卷积,时间维度卷积尺寸保持为1不变;然后再保持空间维度不变,只做时间维度的卷积。

  • 为了使分解后的 R(2+1)D 网络参数量 和原3D网络参数量大体相同(和3D网络公平对比),中间使用\(M_i\)个2D CNN进行一次维度变换(输出维度为\(M_i\)
\[M_i=\lfloor\frac{td^2N_{i-1N_i}}{d^2N_{i-1}+tN_{i}}\rfloor\]
  • R(2+1)D增强了模型的非线性表达能力:相比原来,多使用了一次卷积操作,也就多用了一次RELU函数,所以模型的学习能力更强了;
  • R(2+1)D结构使网络更加容易优化:直接使用3D卷积,模型是不容易学习的,拆分成两次卷积之后,降低了模型学习的难度。在参数量相同的情况下,R(2+1)D获得的训练损失和测试损失更低。网络层数越深,效果差距越明显。

下面是两种结构的训练和测试误差对比图,R(2+1)D网络误差都更小,这既不是过拟合也不是欠拟合,而确实是网络更容易训练。

image.png

实验和总结

下图对比其它模型在 Kinetics上的结果。R(2+1)D单个网络(RGB/Flow)比I3D单个网络的效果更好,但是双流R(2+1)D比双流I3D效果略低,也就是Fusion操作对I3D提升更大。在UCF101和HMDB51两个数据集上,也观察到同样的现象。

image.png

这也是可以理解的,因为R(2+1)D输入尺寸是\(112×112\),I3D输入尺寸是\(224×224\),所以稍微低一点没关系。R(2+1)D这种拆分方式,确实有助于降低过拟合,降低训练难度。而且可以从头训练,不需要像I3D一样借助2D模型的ImageNet预训练参数,所以是一个很值得借鉴的网络结构。

在前两年视频领域对比学习很火的时候,很多工作的backbone都是R(2+1)D,就是因为其容易训练和优化,而且输入尺寸是\(112×112\),对GPU内存比较友好。

TSM

大概过一下之前的几个重要工作(也是本文性能对比的主要几个state-of-the-art):

  1. TSN:视频动作/行为识别的基本框架,将视频帧下采样(分成K个Segment,各取一帧)后接2D CNN对各帧进行处理+fusion
  2. TRN:对视频下采样出来的 frames 的deep feature,使用 MLP 来融合,建立帧间temporal context 联系。最后将多级(不同采样率)出来的结果进行再一步融合,更好表征short-term 和 long-term 关系。
  3. ECO系列:

ECO-Lite:轻量级网络,使用 TSN的中间层 feature maps,来组成 feature clips,然后使用3D CNN来融合时空特征。

ECOen-Lite:在ECO-Lite基础上,concat上帧间fusion后的 TSN 特征,再做决策。

  1. NL I3D+GCN:使用 non-local I3D来捕获long-range时空特征,使用 space-time region graphs 来获取物体区域间的关联及时空变化。

算法框架

为了解决上述的3D卷积运算量问题,作者提出了可嵌入到2D CNN中的 TSM 模块。作者发现:一般的卷积操作,可以分解成 位移shift + 权值叠加 multiply-accumulate 两个过程。

比如说对一个1D vector X 进行 kernel size=3 的卷积操作 \(Y = Conv(W; X)\) 可以写成:

\[Y_i=w_1X_{i-1}+w_2X_{i}+w_3X_{i+1}\]

故分解后的两个操作分别为:

  1. 位移(基本不消耗计算资源,常规地址偏移指针操作)
  2. 权值叠加
\[Y=w_1X^{-1}+w_2X^0+w_3X^{+1}\]

故作者认为,设计TSM模块时候,尽可能多使用位移操作(几乎0计算量),把权值叠加操作放到2D CNN本身的卷积里去做,这样就可在不加任何参数计算量基础上,实现更多功能。

TSM模块

那么问题来了,怎么在时空建模的视频理解任务里,用好这个位移操作呢?

image.png

上图中最左边的二维矩阵是 \(T_i\) 时刻 tensor中 temporal和 channel维度(不需要考虑 batch 和 spatial 维度先); 中间是通过TSM模块位移后的的矩阵,可见第一个channel向前位移一步来表征\(T_{i-1}\)的 feature maps,而第二个channel 则向后位移一步来表征 \(T_{i+1}\),最后位移后的空缺 padding补零;右边的与中间的类似,不过是 online的形式,所以只考虑向前做位移。

这里就涉及一个超参:究竟多少比例的channel进行 temporal shift 才比较合适呢?

作者也考虑到了这个问题,因为如果太多channel进行时间位移,那么原始固定时刻帧的 2D CNN空间特征就会受到损害,但如果太少channel进行时间位移,那么网络又会因temporal上下文交互太少而学不到准确的temporal representation。

为了解决这个问题,作者提出了残差TSM,这样就可以整合位移前后的特征。

image.png

本文中的TSM是基于ResNet实现的,往ResNet里加shift,最直接的方法是在每一次卷积或者每一个residual block前做移动,我们称之为In-place TSM。以这种方式做卷积时,移动的操作是丢失了时刻上的空间信息的。因此,我们采取不同的办法,如(b)所示,将shift操作放到残差值中,另一支不动,以保留某一帧原始的空间信息,这样可以避免伤害到原来的2D CNN模型的空间特征学习能力,我们称之为Residual TSM。这里解释一下,为何每个卷积层或block都要做shift,而不是直接在开始就shift后面不再使用。这是因为,每做一次+-1的shift操作,时域上的感受野都会扩大两倍。已知ResNet本身随着网络的加深,空间感受野会越来越大,看到的信息越来越多。要在时序上也模拟这种情况,就得随着网络的加深扩大感受野,相当于让时域上看到的信息也越来越多,以模拟时序卷积的过程。

image.png

上图(b)比较了In-place TSM和Residual TSM的效果。实验显示,在所有的shift比例上,residual的方式都领先于in-place,并且,即使是做naive shift,它也能比2D baseline TSN好。利用这个实验,我们也可以结合时延实验对shift比例做选择,shift part比例在1/4的时候accuracy效果最好,而此时模型在各种设备上的时延也可以接受,因此后面的实验都是选择移动1/4的比例(1/8 for each direction)。

到这里,模型设计就介绍完了,我们串一下整个视频分类任务的流程。对于一个视频\(V\),抽取\(T\)帧作为采样,记为\(F_1,…,F_T\)。在每一帧\(F_i\)上,我们都在处理它的2D CNN里加上TSM操作,每个帧得到一个预测的output,再把所有帧的output aggregate起来,可采用average之类的方法,从而得到预测。

shift 操作可以认为是一种特殊的1D conv

\[\begin{aligned} \mathbf{X}[n, t, c, h, w] &= \mathbf{X}[n, t+1, c, h, w], & 1 \le t \le T-1, \quad & 1 \le c \le C/8 & \text{left shift} \\ \mathbf{X}[n, t, c, h, w] &= \mathbf{X}[n, t-1, c, h, w], & 2 \le t \le T, \quad & C/8 < c \le C/4 & \text{right shift} \\ \mathbf{X}[n, t, c, h, w] &= \mathbf{X}[n, t, c, h, w], & 1 \le t \le T, \quad & C/4 < c \le C & \text{unchanged} \end{aligned} \]

这种特殊的1D conv可以通过以下的方式进行构建:

\[\begin{aligned} \mathbf{X}_{\text{reshape}} &= \text{Reshape}(\mathbf{X}), \mathbf{X} \in \mathbb{R}^{N \times T \times C \times H \times W}, & \mathbf{X}_{\text{reshape}} \in \mathbb{R}^{NHW \times C \times T} & \quad \text{reshape \& permute} \\ \mathbf{X}_{\text{shift}} &= \mathbf{K} * \mathbf{X}_{\text{reshape}}, \quad \mathbf{X}_{\text{shift}} \in \mathbb{R}^{NHW \times C \times T}, & \mathbf{K} \in \mathbb{R}^{C \times 1 \times 3} & \quad \text{temporal convolution} \\ \mathbf{K}[\text{cout}, 1, k] &= 1, \quad 1 \le \text{cout} \le C/8, & k=3 & \quad \text{left shift} \\ \mathbf{K}[\text{cout}, 1, k] &= 0, \quad 1 \le \text{cout} \le C/8, & k=1, 2 & \quad \text{left shift} \\ \mathbf{K}[\text{cout}, 1, k] &= 1, \quad C/8 < \text{cout} \le C/4, & k=1 & \quad \text{right shift} \\ \mathbf{K}[\text{cout}, 1, k] &= 0, \quad C/8 < \text{cout} \le C/4, & k=2, 3 & \quad \text{right shift} \\ \mathbf{K}[\text{cout}, 1, k] &= 1, \quad C/4 < \text{cout} \le C, & k=2 & \quad \text{unchanged} \\ \mathbf{K}[\text{cout}, 1, k] &= 0, \quad C/4 < \text{cout} \le C, & k=1, 3 & \quad \text{unchanged} \end{aligned} \]
  • FC 层的 lr 和 weight decay 设置为其他layer的5倍
  • HMDB-51 UCF-101 中的 BN 层除了第一层之外全部frozen
class TemporalShift(nn.Module):
    def __init__(self, net, n_segment=3, n_div=8, inplace=False):
        super(TemporalShift, self).__init__()
        self.net = net
        self.n_segment = n_segment
        self.fold_div = n_div
        self.inplace = inplace
        if inplace:
            print('=> Using in-place shift...')
        print('=> Using fold div: {}'.format(self.fold_div))

    def forward(self, x):
        x = self.shift(x, self.n_segment, fold_div=self.fold_div, inplace=self.inplace)
        return self.net(x)

    @staticmethod
    def shift(x, n_segment, fold_div=3, inplace=False):
        nt, c, h, w = x.size()
        n_batch = nt // n_segment
        x = x.view(n_batch, n_segment, c, h, w)

        fold = c // fold_div
        if inplace:
            out = InplaceShift.apply(x, fold)
        else:
            out = torch.zeros_like(x)
            out[:, :-1, :fold] = x[:, 1:, :fold]  # shift left
            out[:, 1:, fold: 2 * fold] = x[:, :-1, fold: 2 * fold]  # shift right
            out[:, :, 2 * fold:] = x[:, :, 2 * fold:]  # not shift

        return out.view(nt, c, h, w)


TDN

目前 3D-based 的方法在大规模的 scene-based 的数据集(如kinetics)上相对于2D的方法取得了更好的效果,但是3D-based也存在一些明显的问题:

  • 3D-based 的网络参数量大,计算开销大,训练的 scheduler 更长,inference latency 明显慢于 2D-based 的方法。
  • 3D卷积其实并不能很好得学到时序上信息的变化,而且3D卷积学出来的时序Kernel的weight的分布基本一致,更多的还是对时序上的信息做一种 smooth aggregation。这一点在之前的工作TANet 中有比较详细的讨论。也基于此,3D-based 的网络在Something-Something这种对时序信息比较敏感的video数据集上并不能取得很好的效果( 得靠 Kinetics 的pre-train来提点
    基于以上几点,我们组最近一直在探索更高效的2D-based的时序建模方法,提出了包括 TSN,TEINet,TEA,TAM 等轻量级的时序建模方法。

TDN 的研究动机也很直接明了:我们能不能将时序上运动的变化显式得提取出来然后加入到网络中呢?

最早在14年 VGG 就提出了大名鼎鼎的 Two-Stream 网络,通过将光流(Optical Flow)信息做为输入去提取时序上的运动信息。但是 Two-Stream 网络需要两个独立分离的Backbone,计算量直接翻倍,而且提取光流也需要巨大的计算开销。所以我们提出了 Temporal Difference Network (TDN) 这种结构,尝试通过 Difference 这种简单的操作去强制提取出时序信息中运动的变化,然后补充到正常的 RGB 网络中去,在不增加过多的计算量的前提下去更高效得进行时序建模。

下面简单介绍一下 TDN 的方法

image.png

TDN 是一个 Two-level 的结构,其主要包含短时和长时两个模块——Short-term temporal difference module(S-TDM) 和 Long-term temporal difference module(L-TDM):

短时建模(S-TDM):

image.png

首先,我们还是参考 TSN 的采样方式,在整个 Video-level 上均匀分段(segment)进行采样。在网络的前一个阶段,我们希望可以在段内融合局部的运动变化信息,所以我们提取原始 RGB 帧间的 difference 作为局部运动变化的一种表征,然后 CNN 去进一步提取这种运动信息,具体公式如下:

\[D(I_i)=[D_{-2},D_{-1},D_1,D_2]\]

其中 \(D_i\) 由相邻帧通过 RGB Difference 得到: \(D_i=I_{i+1}-I_i\) , 然后我们将连续四个RGB Difference 的图在 channel 维度concat起来,作为 Difference 流的输入 \(D(I_i)\)

\[\mathcal{H}(I_i) = Upsample(CNN(Downsample(D(I_i))))\]

为了降低计算量,对于输入的 \(D(I_i)\) ,我们首先对它做一个空间上的下采样( Downsample ),用一层卷积去提去其中的motion信息,然后做一个空间上的上采样(Upsample),使得Difference 流的空间尺度和 RGB 流对齐,这样就可以通过一个非常简单的 add 操作将具有运动信息的 Difference 流补充到 RGB 的 Backbone 中。

长时建模(L-TDM)

image.png

相对于之前S-TDM的段内 frame-wise 形式的时序建模,在网络的后一个阶段,我们希望可以对段间的运动变化信息进行增强,去放大运动增强。所以我们参考 TEINet 的形式,设计了一种基于 feature-difference 的通道 attention 增强方法。同时,为了提升最后的效果,我们还增加了multi-scale 和 bidirectional 的结构。这部分的具体公式如下:

\[C(F_i, F_{i+1}) = F_i − Conv(F_{i+1})\\ M(F_i,F_{i+1}) = Sigmd(Conv(\sum_{j=1}^NCNN_j(C(F_i,F_{i+1})))) \\ F_i ⊙G(F_i,F_{i+1}) = F_i ⊙ \frac{1}{2}[M(F_i,F_{i+1})+M(F_{i+1},F_i)] \]

Video Transformer

TimesFormer

前言

在CV领域,卷积和 Transformer 相比,有以下的缺陷:

  • 卷积有很强的归纳偏置(例如局部连接性和平移不变性)。对于一些比较小的训练集来说,这毫无疑问是有效的,但数据集够大时,这些会限制模型的表达能力。相比之下,Transformer 的归纳偏置更少,能够表达的范围更广,也更适用于非常大的数据集。
  • 卷积核是专门设计用来捕捉局部的时空信息,并不能够对感受野之外的依赖进行建模。虽然将卷积进行堆叠,会扩大感受野,但是这种策略,仍然会限制长期依赖的建模。与之相反,自注意力机制通过直接比较在所有时空位置上的特征,可以被用来捕捉局部和全局的长范围内的依赖。
  • 当应用于高清的长视频时,训练深度 CNN 网络非常耗费计算资源。而在静止图像的领域中,Transformer 训练和推导要比 CNN 更快。使用相同的计算资源可以训练更强的网络。

本文讨论了如何将Vision Transformer从图像领域迁移到视频领域,即如何将自注意力机制从图像的空间维度(2D)扩展到视频的时空维度(3D)。TimeSformer算是这方面工作最早的一篇。

TimeSformer 在多个有挑战的行为识别数据集上达到了 SOTA 的结果,相比于 3D CNN网络,TimeSformer训练要快3倍,推理时间仅为其十分之一。此外,TimeSformer 的可扩展性,使得它可以在更长的视频片段上训练更大的模型(当前的 3D CNN 最多只能够处理几秒钟的片段,而TimeSformer 甚至可以在数分钟的片段上进行训练。),为将来的 AI 系统理解更复杂的人类行为做下了铺垫。

网络结构

具体来说,文中讨论了五种融入自注意力的结构:

image.png
  1. 空间注意力机制(S):只在单帧图像上计算空间自注意力(+残差连接),然后接一个MLP(+残差连接)得到最后的结果,就类似ViT本身的做法,相当于是一个baseline了
  2. (共同)时空注意力(ST):在视频的三个维度上都使用自注意力
    1. 暴力的计算所有视频帧中的所有图像块的自注意力,剩下的操作和上面一样。
    2. 这种方式基本显存都塞不下(本来ViT就快塞不下了,视频使用更多的视频帧,更是塞不下
  3. 拆分的时空自注意力(T+S):直接计算3D的时空自注意力显存不够,借鉴R(2+1)D的方法,将其拆分为Temporal Self Attention+Spatial Self Attention。
    1. 先计算不同帧中同一位置图像块的自注意力,再计算同一帧中的所有图像块的自注意力
    2. 这种方式大大降低了计算复杂度
  4. 局部-全局注意力机制(L+G) :直接计算序列太长,所以考虑先计算局部的自注意力,再在全局计算自注意力,类似Swin-Transformer。
    1. 具体来说,先利用所有帧中,相邻的 \(H/2\)\(W/2\) 的图像块计算局部的注意力。然后在空间上,使用2个图像块的步长,在整个序列中计算自注意力机制,这个可以看做全局的时空注意力更快的近似
  5. 轴向自注意力(T+W+H):分别沿着时间维度、width维度和height维度计算自注意力

R(2+1)D中,作者是画了五种结构图,讨论如何将2D卷积结构加入到3D CNN中。本文作者很多也是R(2+1)D的作者,套路也一样,也画了五种结构图。

下面作者对这五种自注意力方式进行了可视化,更加的形象:

image.png
  1. 空间注意力机制(S):上图以第t帧blue patch为基准点时,Space Attention只计算这一帧内其他patches和基准点的self attention,而完全看不到其它帧的信息;
  2. 时空注意力(ST):基准点和所有帧的所有patches都计算自注意力;
  3. 拆分时空注意力(T+S):先做时间上的自注意力,也就是计算不同帧中同一位置的self-attention。然后计算同一帧上所有patches的self attention;
  4. 局部-全局注意力机制(L+G):先计算图中蓝色快和黄色/红色块的局部自注意力,再计算全局自注意力(此时是进行稀疏的计算,所以只计算蓝色块和紫色块的自注意力)。
  5. 轴向自注意力(T+W+H):先做时间轴(绿色块)的自注意力,再分别作横轴(黄色块)和纵轴(紫色块)上的自注意力。

最终作者在Kinetics-400和Something-Something-V2数据集上,试验了这几种结构的精度。拆分时空注意力( divided space-time attention)效果最好;

image.png

K-400是一个比较偏静态图像的,所以单纯的Space Attention效果也不错,但是换成SSv2数据集,这样做效果非常差。

实验

显存对比 下图表示随着输入图像尺度的增长和输入帧数的增长,Divided Space-Time的方式计算复杂度基本还是线性增长,而Joint Space-Time的方式,计算复杂度增长非常快。下图灰色部分表示从448×448 crop和32帧起,就爆显存了,无法训练。

image.png

模型效果对比

image.png
image.png
  • 表2对比了TimeSformer、I3D、 SlowFast三种模型在K400数据集上的精度。其实 SlowFast使用Resnet101效果更好(精度78.9)。但是TimeSformer确实训练(微调)时间和推理速度都更短。
  • 表3是作者使用了更大的TimeSformer-L模型,并在ImageNet-21K 上进行训练,终于把K400刷到80.7了。作为第一篇把ViT用到视频理解上的论文,这效果已经不错了。
  • 下图是在K600数据集上,TimeSformer达到了 SOTA。
image.png

长视频处理 作者还验证了TimeSformer在长视频处理上相比于 CNN 更有优势,这一步使用了 HowTo100M 数据集。可以看到,当TimeSformer 输入96帧时,能够有效利用视频中长期依赖的信息,达到了最好的效果。

image.png
  • Input Frames :代表输入模型的帧数
  • Single Clip Coverage :代表输入的一段视频覆盖了多久的视频
  • Test Clips: 代表预测阶段,需要将输入视频裁剪几段才能输入进网络。

预训练和数据集规模的重要性

  • 因为这个模型需要非常大的数据才能够训练,作者有尝试自己从头训练,但是都失败了,因此在论文中报告的所有结果,都使用了 ImageNet 进行预训练。
  • 为了研究数据集的规模的影响,使用了两个数据集,实验中,分四组,分别使用25%,50%,75%和100%的数据。结果是 TimeSformer 当数据比较少的时候表现不太好,数据多的时候表现好(这个结论和ViT中是一样的,即训练transformer需要更大的数据量才能达到媲美CNN的效果)。

总结

TimeSformer有以下几个优点:

  • 想法简单
  • 效果好,在很多动作识别数据集上都取得了SOTA效果
  • 训练和推理都和高效
  • 可以处理超过一分钟的长视频,也就是可以做长视频理解了。

另外还有一些其它的Vedio Transformer论文,也都是研究如何拆分时空自注意力,只是方式不一样,比如:

  • VidTr(ICCV 2021):朱老师组的另一篇工作,提出了separable-attention用于视频分类。VidTr能够通过叠加注意力来聚集时空信息,效率更高性能更好。
  • MViT(Multi-Scale Vision Longformer,ICCV 2021 ):Facebook的工作,使用了多尺度和Longformer,效果更好。
  • ViViT(ICCV 2021 ):Google 的工作

Video 总结

image.png
  • 阶段一:
    • DeepVedio(CVPR2014:最早将CNN网络用于视频理解
      • 自从2012年Alexnet出来之后,大家就想把CNN也用到视频理解领域,所以就有了DeepVedio这个工作。
      • 提出了Sports-1M数据集(100万视频)
      • DeepVedio没有很好地利用运动信息,所以即使在Sports-1M这么大的数据集上预训练,效果也不好(UCF101 精度65.4%),比最好的手工特征IDT差了近20个点。
  • 阶段二:Two-Stream
    • Two-Stream(NeurIPS 2014 :开启了用深度学习做视频理解的新时代(UCF101 精度87%)。
      • 作者受IDT的启发,考虑将运动特征也加入到网络中来。最后是选择了引入光流的形式,用一个额外的时间流网络学习物体的运动特征,大大提高了模型的精度,使其可以媲美最好的手工特征,由此开启了用深度学习来做视频理解的时代。
      • 因为Two-Stream证明了其有效性,所以后续涌现了很多改进工作。
    • Two-Stream+LSTM(CVPR 2015:融入LSTM,使模型拥有更长的时序建模(理解)能力
    • Two-Stream+Early Fusion(CVPR 2016 ):改进了双流网络简单加权平均的Late Fusion方式。简单就是在Conv5这一层两个分支做3D Conv+3D Pooling,融合时空特征;同时时间流单独拿出来也做一次3D pooling,最后进行特征融合(加权平均)。相应的模型有Spatiotemporal Loss 和Temporal Loss两个损失函数。(UCF101 精度91.5%左右)
    • TDD(CVPR 2015):将光流按轨迹叠加特征,效果更好
    • TSN(ECCV 2016):为了处理长视频理解,TSN将长视频分成K段,每段都输入一个双流网络。然后将K个时间流特征进行融合得到一个时间流特征,空间流特征也这样操作。最后将两个融合后的特征再次合并,得到最终的视频特征。(UCF101 精度94%左右)
    • TSN得想法非常简单,所以后面也有很多改进,也就是加入传统手工特征里面的全局建模。到这个阶段,就把UCF-101和HDB51刷的非常高了,也没有什么太多可以做的了。
      • DOVF:在TSN基础上融入了全局编码(Fisher Vectors encoding),从而获取了更加全局的特征,UCF101精度推到95%以上。
      • TLE (CVPR 2017 ):融入了temporal linear encoding (TLE)全局编码,并且把模型做到端到端。
      • Action VLAD:融入了VLAD encoding全局编码
  • 阶段三:3D CNN
    • C3D(ICCV 2015):将3D CNN用于视频理解是一个很自然的想法,所以有了C3D这篇工作。因为有了Sports-1M这么大的数据集,作者觉得还是可以训练一个很好的网络的。结果C3D抽取特征还可以(作者提供了抽取特征的接口),但是直接用于刷分效果还是差的比较远(C3D (1 net)+linear SVM 在UCF101精度为82.3)。
    • I3D(CVPR 2017):Two-Stream+3D ConvNet,开启3D CNN 做视频理解的时代
      • C3D的效果不好,可能是网络的初始化不够好。I3D的作者使用将2D网络Inflating成3D网络,保持整体网络架构不变。这样既不用从头设计3D网络,还可以使用Bootstrapping技术,将2D网络的预训练参数,用于扩张后的3D 网络的初始化,使模型得到更好的效果。
      • 依旧使用了光流,提高模型性能。
      • 提出了K400数据集
      • UCF-101和HDB51两个数据集基本被刷爆了,此后,大家都使用K400数据集或者SSv2数据集汇报结果。
    • 改进backbone:R3D(ResNet)、MFNet(ResNext)、STC(SENet)
    • 将纯3D CNN改为2D+3D的形式:降低模型复杂度,大幅提高模型性能。
      • S3D、ECO、P3D等等。
      • R(2+1)D(CVPR 2018 ):将3D CNN拆成2D的空间卷积+1D的时间卷积,降低过拟合和训练难度。
    • 长视频理解:
      • LTC(输入是120帧)、T3D、V4D
      • non-local(CVPR 2018):融入自注意力,使模型精度更高,且可以建模更长的时间序列。
    • 高效处理:
      • CSN( Channel-Separate Network)、X3D(使用anto ml方式搜索网络,最终网络效果好,且参数量很少,基本刷到顶了)
      • SlowFast(ICCV 2019 ):使用快慢结合的网络来用于视频分类,两个网络分别学习静态信息和运动信息,得到了SOTA效果。
  • 阶段四:Vedio Transformer:3D 基本刷不动了,正好ICLR 2021发布了ViT模型,从此步入了Vedio Transformer时代
    • TimeSformer(2021.2.9):Joint Space-Time Attention太贵了,容易爆显存,所以考虑将其拆分。借鉴R(2+1)D的方法,将其拆分为Temporal Self Attention+Spatial Self Attention。
    • 还有一些其它的拆分自注意力工作,比如VidTr、MViT、ViViT等等。
    • vison transformer在视频理解领域的应用还是比较初级的,在长视频、多模态、自监督等方向还可以进一步挖掘。而且视频领域发展这么多年,其实也还是处于一个比较初级的阶段,还有很多工作可以做。

最后借用Andrej Karpathy大神在Twitter的一句话:如果想训练一个强大的视觉模型,处理好视频才是正确的做法。

Reference

TSN(Temporal Segment Networks)算法笔记

李沐论文精度系列之八:视频理解论文串讲