论文主要的贡献点之一是提出一个新模型:inflated 3D network(I3D),把2D模型扩张到3D模型,这样就不用专门设计一个视频理解的网络了,可以使用2D里已经设计好的网络,比如VGG、ResNet直接把它扩张到3D就可以了,甚至利用一些巧妙的方式把预训练模型利用起来,这样不仅设计简单,而且可以省掉很多预训练的麻烦。
另一个贡献点就是提出了一个新的数据集——Kinetics数据集(Kinetics Human Action Video dataset)。这个大型视频行为识别数据集比UCF-101和HMDB-51大了两个数量级。包括400个人类动作的类别,每个类别都有超过400个clips。数据集是从Youtube中搜集的真实场景下的视频。一经提出就得到了广泛的使用。
接下来介绍一下论文的主体部分,首先论文梳理介绍了过去比较流行的视频理解方法。
- LSTM
第一种:卷积神经网络后面跟一个LSTM,这种方式呢,还是把视频更多看成图像分类的任务,逐帧提取所有的特征之后,把特征扔给LSTM网络进行时序建模,可将每个时间戳上的特征糅合起来,从而去理解整个视频内容。把最后一个时间戳上出来的结果后面加上一个全连接层,然后去做分类任务。
缺点:只有在LSTM的部分才能够基于高维抽象的特征进行运动信息的提取,损失了很多低等级的运动信息。
b)3D-ConvNet
这是一个比较暴力的方法,把视频切分成一个个视频段,每个视频含有1-k张图片,将其视为一个volume,使用三维卷积核进行时空学习,最后返回特征做全连接层,而后分类。
缺点:所有参数层都多一个维度,参数量大,在数据量少的情况下不好训练。
c)Two-Stream
如果不想使用 LSTM 做时序的模拟,也不想训练一个 3D 网络去做时空学习,怎样能够抓住时序信息呢?一个非常简单的方式就是提前抽取好光流。双流网络中的光流,指的是视频中每个物体的运动轨迹,自身就蕴含了非常准确的而且非常强大的物体运动信息,变相的相当于是视频里时序信息的一个特征表示。所以现在只需要先从视频里面抽取光流图,学习映射(从这个光流到最后的动作之间的映射关系)。具体的是这个双流网络就是有两个卷积神经网络都是2D不是3D,左边的网络叫做空间流,他的输入是一帧或者多帧,主要负责学习这个场景信息,右边的叫做时间流,他的输入是光流图像,主要为了学习这个物体的运动信息,这两个神经网络最后会给一个特征,然后做一个分类的结果,当有一个分类的结果之后,做一个later fusion最后就把这两个logist加权平均一下就可以了。
优点:网络简单,对模型的要求也比较低,所以比较好训练,结果也非常的高。在15、16年的时候,双流网络是完全压着这个3D神经网络的,90%的工作都是基于双流网络。
d)3D-Fused Two-Stream
early-fusion:还没出结果的时候先把两个特征融合在一起,用一个3D神经网络去处理,最后直接得到一个分类结果。结合3d和双流网络,刚开始按双流网络做,输入是一个2DCNN,右边也是2DCNN然后输入是光流,最后在还没有出结果的时候把两个特征先融合在一起,然后用一个3D卷积神经网络去处理一下,最后直接得到一个分类结果,这里的3DCNN也可以用LSTM替代的,但是因为效果不好,大家都是用3DCNN做的。
e)Two-Stream 3D-ConvNet
前面 4 种都是之前的方法,作者在自己提出的 K400 数据集上进行复现,得到结果之后然后进行反复对比,作者就提出了第五种模型设计方案。
接着看一下I3D的模型结构,
I3D双流网络的空间流(RGB)和时间流(光流)是分开训练的,测试时将其预测的结果进行平均。
左边是一个标准的 Inception-V1 的结构,只不过经过了 inflate 处理过了,这样就不需要重新设计网络。其中比较值得注意的是,在前几步的操作中,如果按照文章中的 inflate 的处理3*3pooling应该变成3*3*3的,但是作者采用的是1*3*3。这是因为视频数据的时长较短,作者发现时间维度上,最好不要太快进行这种下采样。
得到一个合理的做视频理解的网络结构其实只是第一步,接下来更难的问题是如何能更好地将这个 3D 网络训练起来。论文使用了bootstrapping来将一个 2D 的预训练好的模型初始化一个 3D 的模型。
用什么方式能够将 2D 已经训练好的网络参数用来初始化 3D 模型?(最后如果能够使得这两个模型的输出一致,就能从侧面验证这个 3D 模型是从 2D 模型初始化而来的)。作者使用同样一张图片反复地进行复制粘贴最后变成了一个视频,也就是说这个视频中全是同样的视频帧,如果进行播放的话是没有任何的变化的,也就是作者所说的 boring video。同时将所有的 2D Filter 全都在时间维度上复制粘贴 n 次,就和输入视频对应起来了。
原来是一张图片对应一个 2D 神经网络,假设输入是 X ,网络是 W 的话,最后就会得到输出 X × W;现在输入变成了一个视频,视频里面有 n 个 X,3D 神经网络的参数也是 W × n,那么最后的结果就相当于得到了 n 份的 W × X
如果想让 2D 神经网络和 3D 神经网络的输出保持一致,就需要做一些 rescaling (在所有的 2D Filter 上都除以 n),这样 n 倍的 W × X 除以 n 之后就又变成了 W × X,也就是说,最后输入为图像的 2D 神经网络的输出是 W × X ,输入为视频的 3D 神经网络的输出也是 W × X
这样就保证了无论是在网络的哪一层,不论输入是图片还是视频,分别对应通过一个 2D 神经网络和一个 3D 神经网络之后,最后得到的输出都是一样的,这样再向后面的层进行传递的时候,后面的层也能接的住这个输入,因为它们是完全一样的,也就是说可以用预训练好的参数来做进一步的计算。
表中总结了之前所提到的五种形式,以及它们训练和测试的时候输入输出的大小、模型大小。
最后是论文中的实验结果。