视频理解论文串讲
前言
- 参考 B 站视频:李沐 《视频理解论文串讲(上 )》
-
为什么要做视频?
-
视频包含更多信息,符合多模态发展趋势:视频包含了时序信息、声音&图像等多模态信息,而且自然界也都是连续信息而非静止的图像。
-
视频天生能提供一个很好的数据增强,因为同一个物体在视频中会经历各种形变、光照变换、遮挡等等,非常丰富而又自然,远比生硬的去做数据增强好得多
-
视频处理是未来突破的方向:目前计算机视觉领域,很多研究热衷于在 ImageNet 等几个榜单刷分,往往训练了很大的模型,使用很多的策略,也只能提高一点点,类似深度学习出现前 CV 领域中机器学习的现状,已经达到了一个瓶颈期。要想突破必须有新的网络结构,指标之一就是要能很好地处理视频数据。
总之,如何更好的利用视频数据,如何更好的做视频理解,可能是通往更强人工智能的必经之路。
-
-
视频领域发展历程
《A Comprehensive Study of Deep Video Action Recognition》 是 2020 年视频领域的一篇综述论文,总结了 VideoTransformer之前的约 200 篇用深度学习做视频理解的论文。本文基于此,讲解视频理解领域的发展。下图时间线概括了从早期卷积神经网络做视频理解的 DeepVideo,到双流网络及其变体、3D 网络及其变体的一系列过程。最后会讨论一下基于 Video Transformer 的工作。

本文分四个部分来讲解:
-
DeepVideo(早期视频领域的 CNN 工作)
-
Two-Stream 及其变体
-
3D CNN 及其变体
-
Video Transformer:将 image transformer 延伸到 video transformer。其中很多方法都是从 2 或者 3 里面来的,尤其是借鉴了很多 3D CNN 里面的技巧。
DeepVideo(IEEE 2014)
论文 《Large-Scale Video Classification with Convolutional Neural Networks》
模型结构
DeepVideo 是深度学习时代早期,使用 CNN 处理视频的代表工作,其主要研究的,就是如何将 CNN 从图片识别领域应用到视频识别领域。
视频和图片的唯一区别,就是多了一个时间轴,也就有很多的视频帧。下面是作者用 CNN 处理视频帧的的几种尝试:

-
Single Frame:单帧方式的 baseline。从视频帧中任取一帧,经过 CNN 层提取特征,再经过两个 FC 层得到图片分类结果。所以这种方式完全没有时序信息、视频信息在里面 -
Late Fusion:多个单帧特征融合:-
之所以叫 Late,就是在网络输出层面做的融合。
-
具体来说,就是任选一些帧,单独通过 CNN 得到图片特征(这些 CNN 权值共享);再将这些输出特征融合之后,过一个 FC 层得到分类结果。
-
这种单帧输入方式还是比较像图片分类,但毕竟融合了多帧的结果,还是包含一些时序信息的
-
-
Early Fusion:直接在输入层面做融合。-
将五张视频帧在 RGB 层面融合,融合后 channel 从 3 增加到 15(CNN 第一层的卷积核通道数也得改成 15),后面结构不变
-
直接在输入层面就融合时序信息
-
-
Slow Fusion:网络中间的特征层面做融合。-
输入 10 个连续的视频帧,每 4 帧通过一个 CNN 抽特征,每个 CNN 都是权值共享,这样得到 4 个特征片段。再通过两个 CNN 网络,两两融合成为 2 个特征,直到最后融合成一个视频特征,加上两个 FC 层做分类。
-
网络从头到尾都是对整个视频在学习,这种方式最麻烦,效果也最好
-
实验结果
只是作者没想到的是,这四种方式的最终结果差别都不大,而且即使在 Sports-1M (100 万视频)这么大的数据集上预训练,最终 UCF-101 (13000+视频)这个小数据集上微调,结果也只有 65%,效果还远远比不上之前的手工特征。

作者又试了一下,使用一些图片处理上的 trick,比如输入多分辨率的图片,看能否在视频分类上也得到更好的结果。如下图所示,使用了两个网络(权值共享),输入分别是原图和 center crop 之后的图片, 作者希望借此学习全局信息和中心重点区域信息。加入多分辨率操作,精度大概提升了一个点。

从下图可以看到,Early Fusion 和 Late Fusion 效果还不如 Single Frame 的 baseline,Slow Fusion 经过一顿操作之后,才提高了一点点。

总结
DeepVideo 把使用 CNN 直接处理视频的各种方式都试了一遍,为后续工作做了一个很好的铺垫。除此之外,作者还提出了一个特别大的视频数据集—— Sports-1M 数据集(有一百万视频,但是基本都是运动类,应用场景有些受限)。
双流网络及其变体
Two-Stream(NeurIPS 2014)
论文 《Two-Stream Convolutional Networks for Action Recognition in Videos》 、视频 《双流网络论文逐段精读》
简介
这部分详细内容,请参考我上一篇帖子 Two-Stream 双流网络、I3D
视频相比图片的区别,就是多了一个时序信息(运动信息),如何处理好时序信息,是视频理解的关键。当一个网络无法很好地处理时序信息的时候,可以考虑再加一个网络专门处理时序信息就行。
光流包含了非常准确和强大的物体运动信息在里面,双流网络通过额外引入一个时间流网络,巧妙的利用光流提供的物体运动信息,而不用神经网络自己去隐式地学习运动特征,大大提高了模型的性能( UCF-101 精度达到 88% ,基本和手工特征 IDT 的精度 87.9% 持平,远高于 DeepVideo 65.4% 的精度)。


改进工作
从上面双流网络的结构图,可以看到会有几个明显可以改进的地方:
-
Slow Fusion:理论上来说,在中间的特征层面做融合,肯定比最后在网络输出上简单的进行加权平均的效果要更好 -
优化 backbone:双流网络使用的 backbone 是 Alexnet,所以自然想到可以使用更优的 backbone
-
融入 LSTM:考虑在网络抽取特征后加入 LSTM 模型,进一步处理时序信息,得到更强的视频特征
-
长时间视频理解:双流网络输入的光流只有 10 帧,算下来不到 0.5 秒,非常的短。一般一个动作或者事件可能会更长。如果要做长时间视频理解,还需要改进
下面针对每个方向,分别介绍一个代表性工作。
Two stream +LSTM(CVPR 2015 )
论文: 《Beyond Short Snippets: Deep Networks for Video Classification》 。题目中的 Short Snippets 就是指两三秒甚至不到的这种特别短的视频段。
《【论文阅读】Beyond Short Snippets: Deep Networks for Video Classification》
模型结构
原始的双流网络,空间流输入是一帧或几帧视频帧,时间流输入是 10 帧光流,只能处理很短的视频。如果是长视频,有特别多的视频帧,首先想到的还是用 CNN 去抽取视频特征,但关键是抽取的特征如何去做 pooling。本文探索了 6 种 pooling 方法,最后结果差不多,conv pooling 稍微好一点。另外还作者还试了使用 LSTM 做特征融合,最后提升有限。作者做的 pooling 和 LSTM 操作,如下图所示:

具体的 LSTM 操作如下图所示,C 表示最后一层 CNN 输出的特征,每个视频帧都对应了一个特征。这些特征是有时序的,所以将其用 5 层的 LSTM 处理抽取的视频特征,最后的橘黄色这一层代表直接做 softmax 分类了。 简单说,就是从双流网络抽取特征之后直接做 softmax 分类,改为抽取特征后进行 LSTM 融合,再做 softmax 分类。

实验结果
-
conv pooling 效果最好



-
Slow Fusion 就是 DeepVideo 的结果,Single Frame 就是 DeepVideo 论文中的 baseline。
-
conv pooling 和 LSTM:都能处理非常多的视频帧,模型效果相比光流网络,稍有提升。
也就是说,在 UCF-101 这种只有六七秒的短视频上,LSTM 带来的提升非常有限。这也是可以理解的,因为 LSTM 操作,应该是一个更 high level,有更高语义信息的一种操作,其输入必须有一定的变化,才能起到应有的作用,才能学到时序上的改变。如果视频太短,可能其语义信息基本没有改变,对 LSTM 来说,各个时序上的输入基本都是一样的,所以它也学不到什么东西。如果是在长视频或者变化比较剧烈的视频上,LSTM 可能更有用武之地。
Two-Stream+Early Fusion(CVPR 2016 )
双流网络叫 Two-Stream Convolutional Network ,这篇论文题目是将其颠倒了一下,但关键词是 Fusion。本文非常细致的讨论了如何去做双流网络特征的合并,主要是三个方向:
-
spatial fusion(空间融合):下图展示了如何在空间上做 Early Fusion,即如何将两个特征图上相同位置的点做合并
-
temporal fusion(时间融合)
-
特征融合位置
作者通过解决这三个问题,得到了一个非常好的 Early Fusion 网络结构,比之前直接做 Late Fusion 的双流网络,效果好不少。
fusion
在有了时间流和空间流两个网络之后,如何保证这两个网络的特征图在同样的位置上的 channel responses 是能联系起来的(To be clear, our intention here is to fuse the two networks (at a particular convolutional layer) such that channel responses at the same pixel position are put in correspondence.),也就是在特征图的层面去做融合。作者对此作了几种尝试:(融合层有两个输入 ,输出为 )
-
Sum Fusion : ,两个特征图直接相加
-
Max Fusion : ,即特征图 a 和 b 在同一位置只取最大值
-
Concatenation Fusion : ,将两个特征图在通道维度做合并
-
Conv Fusion : ,将两个特征图堆叠之后再做一个卷积操作
-
Biliner Fusion : 。在两个特征图上做一个外积,然后再做一次加权平均。
cat用来拼接矩阵,*代表卷积操作,⊗代表矩阵外积。
不同融合方式的效果如下,表现最好的是 Conv fusion:

特征融合位置
关于在哪一层做融合效果最好,作者作了大量的消融实验,效果最好的两种方式如下:

-
两个网络在 Conv4 之后,就做一次融合,然后就变为一个卷积神经网络了
-
在 conv5 和 fc8 两个层都分别做一次融合
-
将空间流的 conv5 特征拿过来和时间流的 conv5 特征合并,最后时间流得到一个 spatial temporal feature(时空特征)。同时空间流继续做完剩下层,得到一个完整的空间流特征。在最后的 fc8 层,再做一次合并。
-
相当于还没有学到特别 high level 的语义信息时,先做一次融合,用空间流特征取帮助时间流去学习。然后在 fc8 层 high level 级别上再做一次合并。
-
下面是试验结果,晚融合(relu5)和多融合(relu5+fc8)效果最好,但是多融合训练参数多一倍。

temporal fusion
temporal fusion 就是抽取多个视频帧的特征之后,如何在时间轴位置将这些特征融合。作者 3 尝试了两种方式:3D Pooling 和 3D Conv+3D Pooling,后一种方式性能最好。

-
a:2D Pooling 完全忽略了时序信息
-
b:3D Pooling:先在时间维度堆叠各个特征图,再做 Pooling
-
c:3D Pooling 之前先做一次 3D 卷积

模型结构和最终效果

-
网络输入是
[t-τ,t+τ]时刻的 RGB 图像输入和对应的光流输入,蓝色代表空间流网络,绿色代表时间流网络。 -
时空融合:先分别从两个网络抽取特征,然后在 Conv5 这一层先做一次 Early Fusion(3D Conv+3D Pooling),融合后用 FC 层得到最后的融合特征,这个特征就包含了时空信息
-
时间流融合:因为时间流特征非常重要,所以将时间流特征单独拿出来也做一次 3D pooling,再接 FC 层,并专门设计一个时间上的损失函数 Temporal Loss。
也就是这个模型有两个分支:时空学习和时序学习,对应的也有两个损失函数 Spatiotemporal Loss 和 Temporal Loss。推理时,两个分支的输出做一次加权平均。最后结果如下:

-
标蓝色的两个是作者用 VGG 复现了双流网络,因为使用了更深的 backbone,在
UCF101上的效果更好,但是在HMDB51上的精度还略有下降。这是因为当训练集特别小(HMDB51只有约 7000 个视频)时,用一个很深的网络,就特别容易过拟合。 -
使用本文作者提出的 fusion 方法之后,
UCF101精度略有提升,HMDB51精度大幅提升。early fusion 可能算是一种变相的对网络的约束,使网络在早期的学习中,就可以融合时空信息,一定程度上弥补了数据不足的问题,所以使 early fusion 效果比 late fusion 效果要好很多。
结论
本文做了大量消融实验,从三个方面彻底研究了一下网络结构,给后续工作提供了很大的启示。另外作者尝试了 3D Conv 和 3D Pooling,增加了后续研究者对 3D CNN 的信心,变相推动了 3D CNN 的发展,所以不到一年, I3D 就出来了,从此开始了 3D CNN 霸占视频理解领域的局面。
TSN(长视频理解,ECCV 2016)
论文 《Temporal Segment Networks: Towards Good Practices for Deep Action Recognition》
本文一作王老师另外还有 ARTNet,TEA,V4D 以及去年 ICCV 的 TAM、MGSamper 等很多视频领域的工作,大家对视频领域感兴趣的,可以关注王老师的工作组
网络结构
之前的双流网络,输入是单帧或几帧视频帧和 10 帧光流图像(大概只有半秒),只能处理很短的视频段,那该如何去处理一个更长的视频呢?

如上图所示,TSN 的想法非常简单,就是把长视频分成 K 段来进行处理:
-
将长视频分成 K 段,在每一段里随机抽取一帧当做 RGB 图像输入,后续连续的 10 帧计算光流图像作为光流输入。
-
分别通过 K 个双流网络得到 2K 组 logits(一组有时空两个 logits,这些双流网络共享参数)。
-
将 K 个空间流网络输出特征做一次融合(
Segmental Consensus,达成共识),时间流输出特征也如此操作。融合方式有很多种,取平均、 -
最后将两个融合特征做一次 late fusion(加权平均)得到最终结果。
如果一个视频也不是太长,里面就包括一个事件或者一 个动作的话,抽出来的 K 帧即使表面看起来不一样,但其高层语义信息上,应该还是描述的同一个东西,所以可以分成 K 段之后再融合来进行处理。 本文的想法确实非常的简单,但不代表没有新意。一个简单而又有效的方法,才是最有新意的。
训练技巧及效果
在论文 3.2 节中的 Network Training 部分,作者尝试了很多的训练技巧。
-
Cross Modality Pre-training:作者提出了使用 ImageNet 预训练模型做光流网络预训练初始化的技巧-
在这之前并没有好的光流预训练模型,只是从头训练,光流效果并不够好,因为很多视频数据集都很小
-
ImageNet 预训练模型的网络输入 channel = 3,而光流网络输入 channel = 20,无法直接使用。作者先将 ImageNet 预训练模型第一层网络输入的 RGB 三个 channel 的权重做一个平均,得到一个 channel 的权重( average the weights across the RGB channels ),然后将其复制 20 次就行。
-
这种初始化技巧使得光流网络也能使用预训练模型,最终模型精度提高了 5 个点。这种技巧后来被广泛使用,I3D 中使用预训练的 2D 模型来初始化 3D 模型,也是这么做的。
-
-
Regularization Techniques:-
BN 层用得好,模型会工作的很好,而一旦用的不好,模型也会出各种问题。在视频领域初期,很多视频数据集都很小,使用 BN 虽然可以加速训练,但也带来了严重的过拟合问题(数据集小,一微调就容易过拟合)。作者由此提出了
partial BN。 -
partial BN:简单说就是只微调第一层的 BN,其它的 BN 层全部冻住( freeze the mean and variance parameters of all Batch Normalization layers except the first one)。 这是因为一方面存在过拟合,所以考虑冻结 BN 层;但是全部冻住,迁移学习的效果就不好了。Imagenet 数据集和视频分类数据集还是差的很远的,之前 BN 层估计出来的统计量不一定适用于视频分类,所以第一层 BN 必须进行学习,但后面再动就有过拟合的风险了。 -
partial BN这种技巧在后续很多迁移学习中也经常用到。
-
-
Data Augmentation:在传统的 two-stream 中,采用随机裁剪和水平翻转方法增加训练样本。作者采用两个新方法:角裁剪(corner cropping)和尺度抖动(scale-jittering)。-
corner cropping:作者发现 random crop 经常是 crop 图片中间部分,很难 crop 到边角。作者强制使用角裁剪,仅从图片的边角或中心进行 crop。
-
scale jittering:通过改变输入图像的长宽比,增加输入图片的多样性。具体来说,先将视频帧都 resize 到
[256,340],然后进行各种裁剪,裁剪的图片长和宽都是从列表 [256,224,192,168] 里随机选取(比如 168×256,224×224 等等)。这样丰富了图片尺寸,减少过拟合。
-
下面是在 UCF101 数据集上,这些训练技巧的提点效果。可以看出,从零开始训练网络比双流网络的 baseline 方法要差很多,证明需要重新设计训练策略来降低过拟合的风险,特别是针对空间网络。对时空网络都进行预训练,再加上 partial BN ,效果最好。

这些技巧都非常有用,所以作者将 Good Practices 作为论文题目之一。
实验部分
作者还做了一些其它试验
-
比较了 BN-Inception、GoogLeNet 和 VGGNet-16 作为 backbone,最终 BN-Inception 效果最好;
-
对比了三种
Segmental Consensus方式,取平均效果最好
-
模型性能对比

-
第一块是传统手工特征
-
第二块是使用深度学习做视频理解
-
C3D是早期使用 3D CNN 做视频理解,即使使用三个网络,结果也比不上最好的手工特征。在下一章 3D CNN 部分会简单介绍这个模型 -
Two stream +LSTM:就是 3.2 节中的方法(Beyond Short Snippets),提升 0.6%。
-
TDD+FV:就是王利明老师改进光流堆叠方式的论文(直接叠加光流改为按轨迹叠加光流,在 此文 1.3.2 中有讲过)
-
TSN (3 modalities) 就是还使用了另外一种光流形式作为输入,本文就不做介绍了。
-
总结
本文不仅提出了一种特别简单效果又很好的方式处理长视频,而且还确定了很多很有效的技巧( Good Practices),其 贡献不亚于双流网络或者 I3D。
-
处理更长的原始视频 这种将视频分 K 段再做
Segmental Consensus的方法,除了裁剪好的 Video clip(视频段)外,还可以应用于完全没有裁剪过的长视频。如果长时间包括更多的事件,分成的 K 段包含不同的事件和动作,那么后续融合时不使用平均或者 max 这些方式融合,改为 LSTM 就行了。2017 年的 UntrimmedNet 就是处理完全没有裁剪过的长视频进行视频分类的,工作的也很好。 -
Segmental Consensus用于对比学习 本文用长视频分段后Segmental Consensus来做有监督训练,UntrimmedNet做的是弱监督训练(Weakly Supervised),但Segmental Consensus也可以用来做对比学习。 简单来说,之前的工作都是把视频里任意两帧当做正样本,其它视频帧都当做负样本。这样如果视频比较长,任意抽取的两帧不一定互为正样本。如果借鉴Segmental Consensus的思想,将长视频分为 K 段后,从 K 段视频段(K 个Segment)中各抽取任意抽取一帧,这 K 帧当做第一个样本;再在这 K 个视频段中任意抽取剩下的一帧,当做第二个样本;这两个样本互为正样本就更为合理了。因为两个样本都是从 K 个视频段中抽出的,它们在视频段中的顺序和走势都是一样的(两个样本都是从 Segment1→Segment2…→SegmentK),互为正样本的可能性更大。 -
后续进展:
-
DOVF:在 TSN 基础上融入了全局编码(Fisher Vectors encoding),从而获取了更加全局的特征,UCF101 精度推到 95%以上。
-
TLE (CVPR 2017 ) :融入了 temporal linear encoding (TLE)全局编码,并且把模型做到端到端。
-
Action VLAD:融入了 VLAD encoding 全局编码
-
DVOF:在 TSN 基础上融入了全局编码(Fisher Vectors encoding 或 VLAD encoding),从而获取了更加全局的特征,
UCF101精度推到 95%以上。
-
也就是在 2017 年, I3D 发表了,至此,双流网络慢慢淡出了舞台。另外 I3D 刷爆了 UCF101 数据集,且发布了 Kinetics 数据集, HMDB51 和 UCF101 也基本淡出舞台了。
总结
3D CNN
- 参考 B 站视频:李沐 《视频理解论文串讲(下)》
前言
上一章讲了双流网络及其改进,双流网络这种一个网络学习场景信息,一个网络引入光流学习运动信息的方式非常合理,效果也很好,那为什么大家还一直想将其替换为 3D 卷积神经网络呢?主要就是在光流抽取这一块。
-
光流抽取非常耗时
-
计算光流的常用算法 tvl one 来自《 High accuracy optical flow estimation based on a theory for warping》这篇论文,使用的是其 GPU 实现,计算一帧光流需要约 0.06 秒,所以抽取光流是非常耗时的。
-
比如对于
UCF-101数据集,有约 1 万视频,每个视频约 10 秒,每秒 30fps(30 帧),一共约 300 万帧。每两帧抽一张光流图,总共耗时约 50h。如果是Sports-1M这种更大的数据集(100 万视频,视频时长长达几分钟),不做任何优化的话,抽取光流就要成千上万个小时了,这样即使是 8 卡 GPU 也要抽取一个多月。 -
这意味着每当你想尝试一个新的数据集,都需要先抽取光流,再去做模型的开发。
-
-
光流即使存为 JPEG 图像,也还是非常占空间。 在双流网络这篇论文中,作者巧妙的将光流的密集表示改为 JPEG 图像存储,大大减少了存储空间,并在后续工作中一直沿用。但即使如此,
UCF-101数据集存储所有抽取的光流也要 27GB,如果是Kinetics 400数据集,大概需要 500G 存储空间。这么大的数据量,训练时是非常卡 IO 读取速度的。 -
推理时无法做到实时处理
-
推理时也需要先抽取光流。tvl one 算法是一帧 0.06 秒,换算下来就是约 15fps,低于实时要求的 25fps,而且这还只是抽光流,其它还什么都没做。如果加上模型,就更不是实时了。
-
视频处理的很多工作,都有实时性要求。
-
综合以上几点因素,所以才有那么多人想要避开光流,避开双流网络的架构。如果能直接从视频里学习视频特征该多好,这也是 2017 年到现在,3D CNN 火热的原因。因为 3D CNN 是直接学习视频里的时空信息,就不需要再额外用一个时间流网络去对时序信息单独建模了,也就不需要使用光流。 但其实现在回过头来看,3D CNN 越做越大,video transformer 也越做越大,大部分的视频模型依旧不是实时的。而如果在 3D CNN 或 video transformer 里加入光流,其实还是可以继续提高性能,所以光流依旧是一个很好的特征。
C3D(ICCV 2015)
论文 《Learning Spatiotemporal Features with 3D Convolutional Networks》
前言
论文题目意为使用 3D CNN 学习时空特征,而摘要的第一句话,就说到:本文的目的,就是使用一种简单的 3D CNN 结构来学习视频中的时空特征。主要贡献,就是使用的 3D CNN 还比较深,而且是在一个特别大的数据集上进行训练的( Sports-1M 数据集)。
在引言部分,作者提到,
C3D并不是第一个使用 3D CNN 来做视频理解的,但却是第一个使用大规模的训练数据集,且使用了比较深的 CNN 网络,最终取得的效果也较好。
模型结构和效果
- 模型结构
如下图所示,简单来说就是有 8 个 conv 层和 5 个 pooling 层,两个 FC 层和最后的 softmax 分类层。整个 3D CNN 的构造,就是把所有的 2d 卷积核(3×3)都变成 3d 的卷积核(3×3×3),2d pooling 层(2×2)换成 3d pooling 层(除 第一个是 1×2×2 之外,其它 pooling 层都是 2×2×2)。
整体构造,就是将 VGG-16 的每个 block 都减去一个 conv 层,然后 2d 卷积、池化核变为 3d 卷积核池化,所以 C3D 相当于是一个 3D 版的 VGG(共 11 层)。所以作者才说,这种改动的方法非常简单。没有 inception net 那种多路径的结构,也没有残差连接(当时还没有 ResNet)。
模型输入维度是 [16,112,112] (也就是输入 16 个视频帧,每帧尺寸是 112×112),其余各个 block 尺寸如下:

作者在此发现直接预训练后微调的效果不太好,最后使用的方法是抽取 FC6 层的输出特征,然后训练一个
SVM分类器,得到最终的输出。所以本文的C3D,更多时候指代的是FC6层抽取出来的C3D特征。
- 模型结果

如上图所示,前两行都是 Deep Video 在 Sports-1M 数据集上的训练结果。如果改为 C3D ,则效果略有提升。如果 C3D 换成是在更大的数据集 I380K (Facebook 内部数据集,未开源)上预训练,效果进一步提升。所以这也是作者反复强调的,3D CNN 比 2D CNN 做更适合做视频理解( Deep Video 还是使用一个 2D CNN,只不过后面做了一些 Fusion )。
下面是在 UCF101 数据集上的精度对比。

-
只使用一个 C3D 网络,精度 只有 82.3%,如果集成三个网络,精度为 85.2%,也低于同期双流网络和手工特征的结果。
-
结果最好的是 C3D+iDT+SVM 分类器,精度 90.4%。
总结
C3D 的结果并不是最好,但依旧很吸引人,因为其卖点是在特征抽取上。
作者当时给出了 Python 和 matlab 的接口。不管是使用 Python 还是 matlab,如果用 opencv 读进来,就可以返回一个 1×4096 的特征,直接用这个特征去做下游任务就行,中间细节通透不用管。所以当时很多视频理解任务,比如 video detection、video captioning 都纷纷使用 C3D 特征去做。
C3D当时以 Facebook 的算力,还是训练了一个月,所以当时做好的做法不是微调,抽特征才是最好的选择,也就是不做任何微调) 这也跟现在transformer的情况一样。比如很多多模态的任务,即使使用transformer微调也训练不动,所以大家往往是抽取一个transformer特征,然后再去做多模态的特征融合或者说多模态学习。 所以做研究,除了考虑新颖度,还需要考虑易用性、适用性。
除了抽取特征这种方式,让大量的研究者可以用于下游任务,作者还系统的研究了如何将 3D CNN 用于视频理解任务上来,为后续的一系列 3D CNN 工作做了铺垫。
I3D(CVPR 2017)
论文: 《Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset》 参考视频:李沐 《I3D 论文精读》 、I3D 的 Resnet 实现代码
研究动机
C3D 在 Sports-1M 这么大的数据集熵进行预训练之后,效果还是不太行。作者坚信,如果使用一个类似 ImageNet 这样的预训练模型,让网络进行更好的初始化,降低训练难度,模型性能一定会提高很多。
所以作者提出了 Inflated 3D ConvNet ,这也是 I3D 里面的 I 的来源。具体来说,就是将一个 2D 的网络扩张成一个 3D 网络(2D 卷积池化改为 3D 的卷积池化,类似 C3D ),而保持整体网络架构不变。同时这样可以后续采样用 Bootstrapping 技术,将 2D 网络的预训练参数,可以用于扩张后的 3D 网络的初始化。
C3D虽然也是这种扩张的方式得到 3D 模型,但是每个block都少了一个卷积层,所以整体结构变了,无法直接使用2D VGG的预训练参数,这也导致其很难优化,得到一个比较好的结果。
简介
本文从两个方面降低了训练 3D 网络的难度。
-
Inflated 3D ConvNet:如果没有好的训练数据,可以使用 ImageNet 上预训练的 2D 模型,按 I3D 的方式扩张到 3D 网络。这样不用设计 3D 网络结构,而且使用了预训练模型的参数进行初始化,效果一般都很好(Inflating+Bootstrapping); -
Kinetics 400:如果你想从头设计一个 3D 网络,那么可以使用本文提出的Kinetics 400数据集进行预训练,是一个不错的选择(不再依赖于 ImageNet 预训练的模型参数)
具体的 I3D 网络结构,就是 Two-Stream+3D ConvNet (backbone 为 Inception-V1 ):
详细内容请看我的上一篇帖子 Two-Stream 双流网络、I3D 第二章——
I3D部分)

总结
I3D 最大的亮点就是 Inflating 操作,不仅不用再从头设计一个 3D 网络,直接使用成熟的 2D 网络进行扩充就行,而且看还可以使用 2D 网络的预训练参数,简化了训练过程,使用更少的训练时间达到了更好的训练效果。
I3D 的最终结果,也超过了之前的 2D CNN 或者双流网络( UCF101 精度刷到 98% , 远高于 C3D 的 85.2% 和 Two-Stream 的 88% )。所以自从 I3D 在 2017 年提出之后,到 2020 年, 3D CNN 基本霸占了整个视频理解领域,双流网络瞬间就不香了,直到 vision transformer 的出现。
I3D 的影响:
-
I3D虽然使用了 3D CNN,但依旧使用了光流。也就是说光流不是没有,只是计算代价太高。 -
I3D以一己之力,将视频理解领域 从双流网络推动到 3D CNN 时代,将做视频测试的数据集,从UCF-101和HMDB-51变成了Kinetics 400(前两个已经被刷爆了) -
证明了从 2D 网络迁移到 3D 网络的有效性,后续有很多工作跟进(比如 backbone 换成 ResNet,融入 ResNext 或者 SENet 的思想等等。)
Non-local Neural Networks(CVPR 2018)
前言
- 研究动机
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 经过变换得到 ,也就相当于 self-attention 里的 q、k、v。然后前两者做点积注意力操作得到注意力分数,再和 g 做加权求和,得到最终的自注意力结果。这个结果和模块的输入做一个残差连接,得到整个模块的最终输出 Z:

-
上图 T 应该是输入的视频帧的数量,H 和 W 是视频帧的高宽尺寸。
-
计算过程中, 的维度是输入 X 的一半,减少计算量。最后乘以 时,恢复原来的通道数(也就是图中 1×1×1 的卷积操作),这样就可以做残差连接了( 分别表示矩阵乘法和矩阵加法)
-
这种残差结构,可以让我们在任意的模型中插入一个新的 non-local block,而不改变其原有的结构。
实验
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。扩张后的模型分别表示为 和 。
消融实验
下面的试验,都是在 Kinetics 数据集上,进行视频分类的结果:
-
a: 试验自注意力计算的方式 :点积计算效果最好,这也是 transformer 默认的计算方式
-
b: 试验单个 non-local block 插入位置 :在 和 上插入
non-local block。-
在 ResNet 的第 2、3、4 这三个 block 上插入 non-local 的效果都不错。加在 上效果不好,作者认为这是因为第五个 block 的特征图太小了,没有多少远距离的信息可以学习
-
加在 上计算代价比较高,因为这个模块的特征图尺寸还是很大的
-
-
c: 试验插入
non local block的数量 。-
ResNet50 的 4 个 Conv Block 的卷积层层数分别是 3、4、6、3,所以下表中加入 10 个 non-local 就等于是,在 ResNet50 的第二、三这两个模块的每个卷积层上,都加入
non local block。5-block 就是每隔一层来一个 -
下图可以看到,加入更多的 block 效果就更好,这也说明,自注意力操作真的有用,特别是在视频理解里面,长距离时序建模更为有用。
-
-
d: 试验时空自注意力的有效性
- 表 d 分别试验了只在时间维度和只在空间维度计算 self -attention,以及在时空维度计算 self attention 的结果,最终显示,时间维度做 self attention 效果优于空间维度,两个维度都做,效果最好。这也证明作者提出的
spacetime self attention才是最有效的。
- 表 d 分别试验了只在时间维度和只在空间维度计算 self -attention,以及在时空维度计算 self attention 的结果,最终显示,时间维度做 self attention 效果优于空间维度,两个维度都做,效果最好。这也证明作者提出的

-
e:对比
C2D+5 non local blocks和两种I3D模型的效果,前者精度更高,FLOPs更小,说明单独使用non-local比3D conv更高效 -
f:
I3D+ 5 non-local blocks,效果进一步提升。 -
g:使用更长的视频段(32 帧 →128 帧,大概 4 秒),加入
non-local block依然可以提高模型的精度,也说明其对长距离时序建模的有效性。
对比其它模型
下面是本文的方法和 I3D 等几种模型在 Kinetics 400 上的效果对比。 NL I3D 是将 I3D 的 backb 替换为 ResNet ,精度提升了一个点左右,加入 non local 之后,又提升了三个点,所以总共提升了约 4 个点,而且比双流 I3D 的效果还要好,更是给了做 3D CNN 研究者以信心。

之前的双流网络等 2D 模型都是在
UCF-101和HMDB-51上跑的,没有Kinetics 400分数
总结
作者将 self attention 引入到了视觉领域,而且针对视频理解,提出了 spacetime self attention ,通过一系列实验,证明了其有效性。从此在 CV 领域,大家基本都使用 non local 算子,而不使用 LSTM 了。
R(2+1)D(CVPR 2018 )
论文 《A Closer Look at Spatiotemporal Convolutions for Action Recognition》
前言
-
主要内容:本文详细讨论了,在动作识别任务上 做时空卷积的几种网络结构 ,是一篇实验性质的论文。
-
研究动机:作者发现,只使用 2D CNN 网络对一帧帧的单个视频帧抽取特征,最后动作识别的效果和 3D 网络差不多。而 2D CNN 是比 3D CNN 便宜很多的,所以作者考虑,在 3D CNN 网络结构中,部分加入 2DCNN 网络,并试验了各种网络结构。
-
结论:通过
Sports-1M、Kinetics等多个数据集上的测试,证明了 将 3D 卷积拆分成空间上的 2D+时间上的 1D 的网络结构,效果最好,也易于训练。
网络结构
- 几种网络结构对比:

-
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,整体结构如下:
-
R(2+1)D:本文的网络结构,先做 2D 的Spatial Conv,再做 1D 的Temporal Conv,效果最好。
- 对比结果 下面对比了几种网络结构在 Kinetics 验证集上的动作识别精度,并且都是使用 ResNet-18 从头训练的模型:
-
单纯使用 2D 卷积神经网络效果最差,只使用 3D 效果稍微高一点
-
不管是
MCx还是rMCx,加入部分 2D 网络,效果都有提高 -
本文提出的
R(2+1)D网络结构的效果最好
对比了输入分别为 8 帧和 16 帧的两种情况
R(2+1)D 结构

如上图所示, R(2+1)D 就是将一个 t×d×d 的卷积核,替换为一个 1×d×d 的卷积核和一个 t×1×1 的卷积核。也就是先只在空间维度(宽高尺度)上做卷积,时间维度卷积尺寸保持为 1 不变;然后再保持空间维度不变,只做时间维度的卷积。
-
为了使分解后的 R(2+1)D 网络参数量 和原 3D 网络 参数量大体相同(和 3D 网络公平对比),中间使用 Mi 个 2D CNN 进行一次维度变换(输出维度为 Mi)
-
R(2+1)D增强了模型的非线性表达能力 :相比原来,多使用了一次卷积操作,也就多用了一次 RELU 函数,所以模型的学习能力更强了; -
R(2+1)D结构使网络更加容易优化 :直接使用 3D 卷积,模型是不容易学习的,拆分成两次卷积之后,降低了模型学习的难度。在参数量相同的情况下,R(2+1)D获得的训练损失和测试损失更低。网络层数越深,效果差距越明显。 下面是两种结构的训练和测试误差对比图,R(2+1)D网络误差都更小,这既不是过拟合也不是欠拟合,而确实是网络更容易训练。
实验和总结
下图对比其它模型在 Kinetics 上的结果。 R(2+1)D 单个网络(RGB/Flow)比 I3D 单个网络的效果更好,但是双流 R(2+1)D 比双流 I3D 效果略低,也就是 Fusion 操作对 I3D 提升更大。在 UCF101 和 HMDB51 两个数据集上,也观察到同样的现象。
这也是可以理解的,因为 R(2+1)D 输入尺寸是 112×112,I3D 输入尺寸是 224×224,所以稍微低一点没关系。 R(2+1)D 这种拆分方式,确实有助于降低过拟合,降低训练难度。而且可以从头训练,不需要像 I3D 一样借助 2D 模型的 ImageNet 预训练参数,所以是一个很值得借鉴的网络结构。
在前两年视频领域对比学习很火的时候,很多工作的 backbone 都是 R(2+1)D ,就是因为其容易训练和优化,而且输入尺寸是 112×112,对 GPU 内存比较友好。
后面会讲到 TimeSformer 这篇论文,其中一些作者就是本文作者,想法也类似,即将一个时空自注意力,拆分成时间上和空间上分别作自注意力。这样拆分,大大减少了对显存的要求,从而能训练起一个 video transformer。
SlowFast(ICCV 2019 )
论文 《SlowFast Networks for Video Recognition》 、 代码 、知乎解读贴 《SlowFast Networks for Video Recognition》
前言
-
研究动机:人的视觉系统有两种细胞:p 细胞和 m 细胞。前者数量占比约 80%,主要处理静态图像;后者占比约 20%,主要处理运动信息。这种方式就类似双流网络,受此启发,作者设计了
SlowFast网络。 -
摘要:本文提出了一种快慢结合的网络来用于视频分类。其中一路为 Slow 网络,输入为低帧率,用来捕获空间语义信息。另一路为 Fast 网络,输入为高帧率,用来捕获运动信息, 且 Fast 网络是一个轻量级的网络,其 channel 数比较小。
SlowFast网络在Kinetics数据集上视频分类的精度为 79.0%,在AVA动作检测达到了 28.3mAP,都是当前的 SOTA 效果。
模型结构
- 整体结构
如上图所示, SlowFast 网络有两条分支。
-
Slow pathway:类似 p 细胞,主要学习静态图像
-
慢分支每隔
τ帧取一帧,假设输入是T帧时,原视频是τ×T帧的 video 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 而言,这些连接就位于 之后。
-
这两条分支的时间维度不同,通过变换来将它们匹配在一起。
-
SlowFast 使用小输入大网络的 Slow pathway,和大输入小网络的 Fast pathway,两个分支还使用侧连接进行信息融合,来学习更好的时空特征。通过这种设计, SlowFast 达到了一种较好的时间和精度的平衡。
- 前向过程
-
Slow pathway:就是一个 ResNet-50 I3D,所以有四个 res block,卷积层个数分别是 3、4、6、3。
-
Fast pathway:channel 数是上图黄色数字,远远少于慢分支的 channel 数。
-
forword:
-
输入:慢分支和快分支输入维度分别是 和 。假设样本是 64 帧 224×224 的视频帧,则慢分支和快分支的输入分别是 4 帧和 32 帧;
-
下采样:在时间维度上,两个分支始终没有在时间维度上进行下采样,也就是始终保持 32 帧和 4 帧,使网络可以更好地学习时序信息;空间维度和原来一样,每个 block 都进行 2 倍的下采样
-
侧连接:文中讨论了三种将快分支特征变换到慢分支同维度特征的方法,最后采用 3D Time-strided 卷积: 。
-
两个分支各接一个全局平均池化层,然后进行特征融合(concate)。最后接一个 FC 层(包含 softmax),得到最终结果。
-
实验结果
-
对比 Kinetics 上的视频分类结果(表 2)
-
表 2 灰色部分表示都使用了 ImageNet 预训练的模型
-
下 = 表还对比了不同的计算复杂度,最小的 SlowFast 计算复杂度是很小的。
-
随着输入帧数的提高,更换更深的 backbone,以及最后加入了 non-local 算子,模型的精度一直在提升。最优模型在
Kinetics-400上的精度达到了79.8%,基本是 3D CNN 中的最好结果。 -
表 3 使用
Kinetics-600数据集进行训练,精度更高
-
-
对比 AVA 上视频分割效果
另外还做了很多消融实验,比如
α,β,T改如何取值等等,就不一一列举了。
3D CNN 总结
除了上面列举的这些,还有很多优秀的论文。比如:
-
Hidden Two-Stream :朱老师组 2017 年的 论文,使用一种新的 CNN 架构,在网络中隐式地捕获相邻帧之间的运动信息,相当于隐式的光流。这样在训练和推理时都不需要抽取光流,这种端到端的算法比 two-stage baseline 快 10 倍。
-
TSM (Temporal Shift Module ,ICCV2019):提出了一种通用且有效的时间移位模块(TSM)。TSM shifts part of the channels along the temporal dimension,从而在相邻帧之间交换信息。引入 shift 操作之后,能让一个 2D CNN 媲美 3D CNN 的效果,且 2D CNN 计算量小,更高效,更易部署。作者还提供了一个首饰检测的 demo 。
Video Transformer
TimeSformer(2021.2.9)
论文 《Is Space-Time Attention All You Need for Video Understanding?》 ,即时空注意力在视频理解中是不是 All You Need。