【视频理解】论文串讲

2020-视频理解综述-A Comprehensive Study of Deep Video Action Recognition

论文地址
讲解视频 1
讲解视频 2

本文为朱毅老师 bryanyzhu 讲解的视频理解论文串讲笔记。

 我们从 2014 年开始,一直到 2021 年,对视频理解方面的工作一起来做一下总结。

 这篇综述大概提及了超过 200 篇在视频领域里的论文,除了没有 Video Transformer,基本是包含了之前用 Deep Learning 去做 Video Action Recognition 的大部分工作。

今天我们就按照时间线上的结构,从最开始用卷积神经网络做 DeepVideo 这个工作,然后到双流网络,以及双流网络的这些大部分变体,还有 3D 网络以及 3D 网络的这些变体;以及讨论一下最近的基于 Video Transformer 的工作。

时间线

我们分 4 个部分来讲

  1. 第一部分就是自从 AlexNet 之后,对视频理解的研究就从这种手工特征慢慢转移到卷积神经网络了,这一部分我们只讲一篇论文,就是 CVPR 2014 的 DeepVideo。
  2. 接下来在第二部分和第三部分,我们会分别讲双流网络及其它的变体,还有 3D 卷积神经网络以及它们的变体,这两个部分设计的工作比较多。
  3. 然后到第四部分,自从 Vision Transformer 出现以后,视频理解领域是如何把 Image Transformer 延伸到 Video Transformer 上的,这里面用到了很多方法都是直接从第二、三部分延伸出来的,尤其是借鉴了很多 3D 卷积神经网络里使用的技巧。

2014-CVPR-Large-scale Video Classification with Convolutional Neural Networks

论文地址

 首先我们来看一下 CVPR 2014 的这篇 DeepVideo 的论文,题目非常直接了当,上来就是说:大规模的视频分类理解用卷积神经网络来做,其实在这篇论文之前也有一些工作是用神经网络来做的,有卷积神经网络也有用 LSTM(长短期记忆网络)。但是那些工作都是在 AlexNet 出现之前,一般使用的数据集都比较小,网络也比较浅;而 DeepVideo 这篇论文是在 AlexNet 出现之后,在深度学习时代使用了超大规模的数据集,而且使用了比较深的卷积神经网络去做的,所以说算是深度学习时代使用卷积神经网络去处理视频理解问题的最早期的工作之一。

 作者团队来自与 Google Research 和 Stanford,一作就是我们之前也提过好几次的 Andrej Karpathy(14 年的时候他还是 Stanford 的一个博士生,这篇工作是他在 Google 实习的时候完成的一篇论文,然而就在短短的 7、8 年之后,Andrej 就已经带领特斯拉的团队把辅助无人驾驶做得这么好了)。接下来几位作者都来自于 Google Research,这个团队其实为视频理解领域做出了很大的贡献,不光是这篇论文里提出的 Sports-1M 这个数据集,他们在两年之后呢又推出了一个更大的 YouTube-8M 的数据集,还有最近为了 Action Detection 提出的 AVA 数据集,全都是这个团队做的。最后就是我们耳熟能详的李飞飞老师,在 ImageNet 数据集取得了如此巨大的成功之后,又来建立一个如此大规模的视频数据集,也是很大程度上推动了视频理解领域的发展。

 这篇论文本身的方法是比较直接的,就是说如何把卷积神经网络从图片识别里应用到视频识别里面,那视频跟图片唯一的不同就是它多了一个时间轴,就是说它有更多的视频帧而不是单个的图片了,所以很自然就有几个变体是需要尝试的,比如说这里列出来的变体,我们一个一个来过:

  1. 首先论文里说的这个 Single Frame 的方式,就是单帧的方式,它其实就是一个图片分类的任务,在一个视频里任选一帧,然后把这一帧通过一个卷积神经网络,然后通过两层 FC 全链接得到一个分类结果。这其实就相当于是一个 baseline,它完全没有时间信息,也完全没有视频信息在里面。
  2. 然后作者就开始做各种尝试了,首先第一个比较好做的尝试,就是 Late Fusion,之所以叫它 “Late” 是因为它是在网络输出层面做的一些结合。这幅图里,就是说我有一个视频,我随机的选几帧,然后每一帧都是单独通过一个卷积神经网络,这两个神经网络是权值共享的,然后把得到的这两个特征合并一下,通过 FC 层(全连接层)最后做一下输出。虽然从做法上还是单帧进入一个卷积神经网络去得到一个特征,还是比较像图片分类的,但是毕竟后面把这个特征合并起来了,所以有一些时许信息在里面的。
  3. 做完了 Late Fusion 自然对应的就会有这种 Early Fusion,作者这里采用的是非常 “early” 的做法,也就是在输入层面就做了这种融合,具体做法就是把 5 个视频帧在 RGB 那个 Channel 上直接合起来,这样原来你是一张图片有 RGB 3 个 Channel,你现在是有 5 个图片,所以就是 3×5=15 个Channel,这就意味着你这里的网络结构要进行一定的改变了,尤其是第一层,你第一个卷积层接受的输入的通道数就要由原来的 3 变成 15 了,但之后的网络都跟之前的保持不变,这种 Early Fusion 的做法在网络的刚开始就能从输入层面去感受这种时序上的改变,希望能学到一些全局的运动或者时间信息。
  4. 最后,既然你做过 Late Fusion 又做过 Early Fusion,其实另外一个更直接的变体就是说为什么不把这两个合起来做呢。于是作者这里也尝试了一下,他管这个叫做 Slow Fusion,意思就是说你这个 Late Fusion 合并的太晚了,Early Fusion 又合并的太早了,如果能在网络学习的过程中就在这个特征层面再去做一些合并就再好不过了。具体的做法就是每次先选 1 个有 10 个视频帧的 1 个小的视频段,然后每 4 个视频帧就通过 1 个卷积神经网络去抽取一些特征,这些刚开始的层也都是权值共享的,在抽出最开始的这些特征之后,用最开始的 4 个输入片段我们又把它慢慢合并成2个输入片段,然后再做一些卷积操作去学习更深层的特征,最后再把这个特征给 FC 去做最后的分类。这个意思就是说整个网络从头到尾其实都是对这个视频的整体在进行学习,按道理来说结果应该是最好的,而事实上它结果也是最好的。

图 1:探索通过网络在时间维度上融合信息的方法。红色、绿色和蓝色框分别表示卷积层、归一化层和池化层。在 Slow Fusion 模型中,所描绘的列共享参数。

 但作者没有想到的是这几种方法差别都不大,而且更没有想到的是即使是在 100 万个视频上去做了预训练之后,在 UCF-101 小数据集上去做迁移学习的时候竟然效果还比不上之前的手工特征,这个就非常诡异了。所以作者又开始尝试另外一条路,另外一种尝试就是作者这里在图 2 里画的这种多分辨率的卷积神经网络的结构。作者一看用 2D 卷积神经网络去学时序特征确实很难,不好学我就先不学了,我把图像那边使用卷积神经网络一些好用的 trick 搬过来看能不能在视频领域里也工作得很好,也就是他这里想尝试的这种多分辨率卷积神经网络

 简单的来说作者就是把输入分成了两个部分,一个是原图,另外一个就是从原图的正中间抠出来一部分变成上面的输入,因为不论是对图片还是对视频来说,一般最有用的或者说物体都会出现在图片的正中间,所以他就把上面的这一分支叫做 Fovea Stream,下面的这一分支叫做 Context Stream;Fovea 其实就指的是人眼视网膜里最中心的一个叫中央凹的东西,它是对外界变化最敏感的一个区域,而 Context 指的就是图片的整体的信息。作者就是想通过这个操作既能学到这个图片里最有用的中间的那些信息,又能学习到这个图片整体的一个理解,看看这样能不能提升对视频的理解。其实这个架构也可以理解成是一种双流结构,因为它也有两个网络,但是这两个网络是权值共享的。然后这种架构也可以理解成早期对注意力的一种使用方式,他强制性的想让这个网络去更加关注图片中心的区域。

图 2:多分辨率 CNN 架构。输入帧被送入两个独立的处理流:一个模拟低分辨率图像的上下文流和一个处理高分辨率中心裁剪的中央凹流。两个流都由交替的卷积(红色)、归一化(绿色)和池化(蓝色)层组成。两个流都汇聚到两个完全连接的层(黄色)。

 总之呢 一顿操作下来,虽然多分辨率卷积神经网络有一定的提升,比如说跟这个单帧的 Baseline 比,单帧加上多尺度之后效果还是有一定提升的,但是提升相对来说是比较小的。然后我们再来看一下单帧的 Baseline 加上这几种时间信息上的合并之后会有什么样的表现,我们可以发现 Early Fusion 确实做得太 Early 了,所以说它的效果还不如用 Single Frame 的 Baseline,然后 Late Fusion 也不如 Baseline,只有最后的这个 Slow Fusion 经过了一顿复杂的操作之后,才勉强比这个 Single Frame 的 Baseline 高了一点点,而且这个还是在他们提出的 Sports-1M 数据集上的结果。

表 1:Sports-1M 测试集的 200,000 个视频的结果。Hit@k 值表示在前 k 个预测中至少包含一个基本事实标签的测试样本的分数。

 如果我们换一个数据集,换到 14 年当时大家广为接受的 UCF-101 数据集上,我们可以看到作者这里最好的变体也只有 65.4% 的这个准确度,而当时最好的手工特征的方法就已经能达到 87% 的准确度了。也就意味着说,当你使用了这么多预训练的数据,而且又使用了这么大规模的一个网络之后呢,最后这个迁移学习的结果竟然还不如一个手工特征的结果,而且是远远不如。所以说引发了大家很多的思考,为什么深度学习在图片分类、图片检测分割那边都工作地这么好,但是在视频领域里怎么就碰壁了呢?

表 3:使用 Slow Fusion 网络的各种迁移学习方法在 UCF-101 上的结果。

但这篇文章的意义其实是不在于它的效果,它不仅提出了当时最大的视频理解的数据集,而且把你能想到的这种最直接的方式全都试了一遍,给后续的工作做了一个很好的铺垫,这才有了后面几年深度学习在视频领域里的飞速的发展。所以到 18、19 年的时候视频理解或者说这个动作识别已经是 CV 领域排名前 5 前 6 的一个关键词了,是一个非常主流的视觉任务。

2014-NIPS-Two-Stream Convolutional Networks for Action Recognition in Videos

论文地址
讲解视频

 说完了 DeepVideo,接下来我们就来讲一下双流网络。因为我们刚才在 DeepVideo 这篇论文也看到了,2D 网络在当时还不是很好地去学习这种时序信息的,而视频理解和图像理解最关键的区别就在于它多了一个时间轴,所以如何去更好地处理这个时间信息可能才会带来更大的提升。

 所以接下来大家就想了很多的方法,双流网络是其中一个,它就利用了光流这个特征去帮助网络学习。当然了,也有很多人尝试想用 LSTM 去做这个视频理解;另外呢,大家就想用这种 3D 卷积神经网络,因为本身视频它就是一个 3D 的输入,所以你用 3D 的网络去应对听起来就更合理;然后其实还有很多别的操作,比如说基于轨迹的一些方法、基于 Ranking Function 的一些方法、还有基于 Shift 移位这种操作。总之呢 在 2014 年之后的这 5、6 年里视频动作识别还是发展的相当不错的。

 首先,我们来回顾一下双流网络,双流网络在上面的视频里已经精读过了,所以这里我们就直接跳到图 1。

双流网络的主要意义就是说当你用一个卷积神经网络无法很好的处理时序信息的时候,你只需要在下面加一个卷积神经网络去专门处理这个时序信息就好了。比如说像这里从原始视频中去抽取对应的光流图像,光流图像里就涵盖了很多的物体移动的信息,以及这个视频的时序信息。最后呢,上面的空间流网络其实就是在学一个从 RGB 图像到最后的分类的映射;而下面的时间流网络就是学一个从光流图像到最后的分类的这么一个映射。这两个卷积神经网络都不用去学习这种时序信息了,它只需要去学习这种对应的映射就可以了,一下就把问题给简化了。而且两个网络各司其职,谁也不干扰谁,相对而言优化起来就轻松许多。所以别看是仅仅加上了下面这一只时间流的网络,但是大幅度地提高了性能。

图 1:用于视频分类的双流架构。

 一旦双流网络证明了它的成功,迅速就有很多工作跟进了。我们其实单从这个图里就能看到有几个比较容易能想到的想法。

  1. 比如说,首先你最后合并这个 Fusion 是做在最后面的,你是在已经经过 Softmax 之后才做合并,所以也叫 Late Fusion,自然而然的肯定就会有人问你能不能做 Early Fusion,Early Fusion 的效果会不会比Late Fusion 好呢?因为按道理来说,如果你能在前面这些层之间去做这种空间和时间流的特征交互,应该是比你在最后做一个简单的这种加权平均效果要好的。所以说怎么去做 Early Fusion 算是一个研究方向。
  2. 第二个更直接,这里面明显就是一个 AlexNet 的变体,接下来大家已经有了 Inception Net、VGGNet、ResNet 以及更深的其它网络,很显然,对于深度学习时代来说越深的网络一般效果是越好的,尝试更深的网络对于视频动作识别来说也是一个研究方向。但是因为普遍来说视频这些数据集都比较小,所以说如何在小数据集上去训练大模型是一个难点,如何更好的去控制过拟合是个很难的问题。
  3. 第三个方向就是说当你把一个图片通过一个卷积神经网络,最后得到一个特征,双流网络直接就是把这个特征拿来就去做分类,同样的道理,对于这个时间流网络来说也是把这个特征抽出来之后直接就去做分类,而事实上我们知道我们有一类非常成熟的模型叫做 RNN 或者 LSTM,它们是专门用来处理这种时序信息的。其实很多人一直都觉得 LSTM 应该是处理视频理解的一个非常好的工具,如果你先能在每一帧上用卷积神经网络去抽特征,然后你在抽出来的特征之上再去加一个 LSTM 层去把它们之间的这些时序信息模拟起来,你最后得到的特征应该会更强。所以这也就是第三个可以做的研究方向。
  4. 第四个我们可以探索就是说,无论你是用单张图片还是用光流图像,这光流图像里面是 10 个视频帧得到的,它都非常的短。因为对于一个帧率为 25 或者 30 的视频来说,即使是 10 帧也才对应不到 0.5 秒的时间,是非常非常短的。但是一般一个动作或者一般一个事件吗,它的持续时间都是 2、3 秒甚至更长。我们如何去做这种长时间的视频理解呢?很显然不论是单帧还是光流都不能给我们有效的答案。

所以说分别针对这几个研究方向也就分别推出了不同的工作。接下来我就针对每个方向去讲一个代表工作。

2015-CVPR-Beyond Short Snippets Deep Networks for Video Classification

论文地址

 那首先我们提到的就是这篇 CVPR 2015 的论文,叫 Beyond Short Snippets Deep Network for Video Classification。题目的意思就是说我不想再做这种特别短的视频理解了,题目里的 Short Snippets 其实就是指那种 2、3 秒或者甚至还不到 2、3 秒的小的视频段。

 作者团队跟之前 DeepVideo 的作者团队差不多,还是来自 Google 这个组,只不过一作换了一个实习生。

 这篇论文的主要方法都画在这个图 1 里了,就是说如果你按照双流网络的这种思想去做,这个原始图像只有 1 帧或者几帧,光流图也就只有 10 帧,它能处理的视频其实是非常短的。如果这时候我们有特别多的视频帧,那该怎么处理呢?其实一般来讲对于所有的这些视频帧,我们肯定都是先用一种方法去抽它的特征,比如说原始的手工特征就是我们抽一个 SIFT 的特征,对于现在深度学习时代我们就拿一个卷积神经网络去抽一个特征。关键就是说在抽到这些特征之后我们该如何去做 Pooling 这个操作,我们当然可以简单地做一个 Max Pooling 或者 Average pooling。这篇论文里做了非常详尽的探索,他还做了 Conv Pooling,他还像 DeepVideo 那篇论文一样做了 Late PoolingSlow PoolingLocal Pooling。最后的结论其实也是都差不多,就是这个 Conv Pooling表现最好。

图 1:我们的方法概述。

 然后他们又尝试了一下用 LSTM 去做这种特征的融合。按道理来说 LSTM 能够掌握这种时间上的变化应该是一个更好的特征融合的方式,但是其实一会我们看结果,它的提升也非常有限。具体怎么使用 LSTM,其实就在他们的图 4 里有写。 C 在这里就代表是最后这个卷积神经网络抽出来的那个特征,意思就是说,每一个视频帧它其实都对应了一个卷积神经网络,然后去抽取到 C 这个特征,当然这里卷积神经网络肯定都是权值共享的,而不是说有很多单独训练的网络。当你达到这些特征以后,其实这些特征在时序上是有顺序的,所以你才想到要用一个 LSTM 去做这种特征的融合。接下来作者这里就用了 5 层 LSTM 网络去处理之前这些抽取出来的视频特征,最后橘黄色部分就代表 Softmax 操作,就直接做分类了。所以说这个改动相对于双流网络来说是非常直接的,前面的操作通通都没有改变,只是在最后一个卷积层之后不是简单的做一层 fc 操作直接做分类,而是把所有的这些特征通过一些 LSTM 层去做一些时序上的处理和融合,最后再做这个分类。

图 4:深度视频 LSTM 在每个连续的视频帧中从最后的 CNN 层获取输入和输出。CNN 输出通过时间向前处理,并通过五层堆叠的 LSTM 向上处理。softmax 层在每个时间步预测类别。卷积网络(粉红色)和 softmax 分类器(橙色)的参数跨时间步共享。

 作者这里先是在 Sports-1M 数据集上做了一下实验,他就对比了一下之前的最好的结果,比如说单帧或者 Slow Fusion,Slow Fusion 其实就是 DeepVideo 的结果。然后他们论文里提出来就是这个 Conv Pooling 和使用 LSTM,我们首先可以看到在使用这个视频帧数上 Conv Pooling 和 LSTM 都能使用非常多的帧,意思就是说他能看到非常长的视频,最后的结果也比之前的这两种方法好了许多。当然了这里这么大的提升也不光是使用了 Conv Pooling 或者 LSTM,主要还是因为使用了光流,而且看到了更多的视频帧。如果你仅仅地去对比 Conv Pooling 和 LSTM 来看,其实他们的差距基本没有多大。也就是说 LSTM 没有想象中的那么有用。

表 5:利用全局视频级描述符,LSTM 和 Conv-Pooling 与之前在 Sports-1M 数据集上的工作相比,Hit@1 提高了 20%。Hit@1 和 Hit@5 是在视频级别计算的。

 如果我们再来看一下UCF-101上的结果,之前传统的手工特征方式最好能达到 88% 的准确度,然后 DeepVideo 就只有 65.4%,因为它没有很好地利用时序的信息。然后双流网络一上,立马这个效果就不一样了,直接就 88% 跟之前最好的手工特征打平手了。然而这篇论文是完全在双流网络的基础上在做的,所以说它的效果肯定是要比双流网络更好才行,而事实上我们这里可以看到当使用 120 帧的 Conv Pooling 的时候,也只有 88.2% 的准确度,只比 88% 高了一点点。然后使用了 LSTM 之后用了 30 帧也只有 88.6% 的效果,只比 88% 好了一点点。

表 7:UCF-101 结果。粗体数字表示高于先前报告结果的结果。

 所以说在短视频上,比如说像 UCF-101 这种只有 6、7 秒的视频上 LSTM 所带来的提升是非常有限的。当然在我看来其实也是比较好理解的,因为我一直觉得像 LSTM 这种操作,它绝对是一个更 High Level、更有语义信息的特征。给 LSTM 的输入必须有一定的变化,LSTM 才能起到它应有的作用,它才能学到这个时间上的改变。但如果你的视频比较短,只有 5、6 秒,6、7 秒的话,你这个语义信息可能根本就没有改变,你从这个视频里却抽了很多帧出来,然后再把这些帧通过卷积神经网络去抽到更有语义信息的特征之后,这些特征其实可能都差不多,都代表了差不多的意思。你把这样的特征传给一个 LSTM 网络就相当于你把很多一模一样的东西给了 LSTM,你指望 LSTM 能学到什么?其实什么也学不到。所以这也就是我觉得为什么在短视频上 LSTM 不能发挥它威力的原因。如果在长视频上,或者说变化比较剧烈的视频理解上,LSTM 还是有用武之地的。

2016-CVPR-Convolutional Two-Stream Network Fusion for Video Action Recognition

论文地址

 说完了 LSTM 这个方向,接下来就该说 Early Fusion 这个方向,这篇是 CVPR 2016 的一篇论文,叫做 Convolutional Two-Stream Network Fusion for Video Action Recognition。它其实就把双流网络题目给颠倒了一下,双流网络叫做 Two-Stream Convolutional Networks for Action Recognition in Videos,它叫 Convolutional Two-Stream。

 其实关键词只有一个,就是这个 Fusion这篇文章非常细致地讲了一下到底如何去做这种合并。就是说当你有了这个时间流,又有了这个空间流之后,你如何去在两个流之间去做这种 Early Fusion。这个图 1 里 其实只画了他们论文中的一部分,就是如何去做这种空间上的 Fusion。比如说现在都有两个特征图,如何把特征图上的这两个对应的点去做这种合并。这个在论文中叫 Spatial Fusion,作者还讨论了一些 Temporal fusion 的方法,然后在你决定了去做这种 Fusion 之后,到底在网络的哪一层去做这种 Fusion 也是非常关键的。所以说作者就从这 3 个方向分别回答了这几个问题,从而最后得到了一个非常好的一个 Early Fusion 的网络结构,能够比之前直接做 Late Fusion 的这种双流网络效果也好不少。

图 1. 来自双流 ConvNet 模型 [22] 的前三个卷积层的示例输出。这两个网络分别以精细的时间尺度捕获空间(外观)和时间信息。在这项工作中,我们研究了几种在空间和时间上融合两个网络的方法。

 接下来看作者团队,一作 Christoph 在做完这篇工作之后就一发不可收拾,在视频领域里出了很多代表性的工作,比如说之后的 SlowFastX3D,直接就把 3D-CNN 做到了极致,让大家不得不去转向 Video Transformer。然后 Video Transformer 里,他也做了 MViT 以及 MViTv2。我们今天接下来至少还要讲到他另外两篇代表性的工作。二作 Aexl 是 Christoph 的老师,他们跟最后的三作 A.Z. 也有很多的合作,双流网络其实就出自于 A.Z. 之手。这个估计他们就想了想既然双流网络里是这么做 Late Fusion 的,我们要不要研究一下 Early Fusion,于是乎,就有了这篇论文。

 首先我们就来简单的看一下什么是 Spatial Fusion。作者在这里解释说,当你有时间流和空间里有两个网络之后,我们如何能保证时间流和空间流的特征图在同样的这个位置上,它们产生的通道 Response 是差不多能联系起来的,因为这样才算是一个 Early Fusion,就是在特征图层面他去做这种合并。作者这里就做了几个简单的尝试。

  1. 比如说这里 他说这个 Max Fusion,对于 a 和 b 两个不同的特征图来说,在同样的这个位置上我们只取它的最大值作为合并之后的值,这个就叫 Max Fusion。
  2. 如果我们不想 2 选 1,我们想尽可能的把这些信息都保留下来,我们也可以有很多别的方式。比如说最简单就是这种 Concatenation Fusion,直接把两个特征图合并起来就完了。
  3. 或者说我们也可以做一下 Conv Fusion,先把这两个特征图堆叠起来,然后再对它做一层卷积操作。
  4. 当然更简单的呢,我们可以在两个特征图上对应的位置上直接做一个Sum Fusion
  5. 最后最复杂的一种形式就是直接做一个 Bilinear Fusion,那就是说给定两个特征图之后,我们在这两个特征图上去做一个 Outer Product,做完乘积之后再在所有维度上做一次加权平均。这种方法很明显它的计算复杂度就比之前几种方法要高很多了。

 而事实上我们最后也可以看到表现最好的其实就是 Conv Fusion 就可以了。

Spatial Fusion

 然后说完了 Spatial Fusion,就是说在这个空间维度上我们已经知道如何处理这两个网络这个特征图了,接下来的问题就是说我们到底应该在网络的哪个部分去做合并,到底是偏前面一些的层,比如说 Conv1、Conv2,还是偏后面一些的层 Conv4、Conv5,甚至是最后的分类层 FC6、FC7。作者这里就做了大量的消融实验,最后作者就得出来了两种比较好的方式它就列在这个图 2 里。

  1. 第一种就是空间流和时间流先分别做,然后再做完了 Conv4 这层操作之后,把它们进行一次 Fusion,Fusion 完之后就从两个网络变成一个网络了,这其实也就是传统意义上的 Early Fusion,就是在模型的中间就已经二合一了,所以最后的输出只有一个。
  2. 另外一个表现更好的方式,就是说我先两个网络分别做,然后再做到 Conv5 这一层以后,我把空间流上的 Conv5 的特征拿过来,和时间流的的特征做一次合并,然后这里出一个 Spatial Temporal 的特征,就是它既有空间信息又有时间信息,所以这个特征应该是比较好的,但是我这个空间流也没有完全抛弃,我在他之后继续做 Pool5、FC6、FC7、FC8,保持了空间流的完整性,然后在最后的 FC8 层我们再做一次合并。这个可以简单的理解为,就是说我们在之前的这个特征层,就是在还没有学到那么 High Level 的语义特征之前,我们先合并一下,去帮助时间流去进行学习,然后等到最后 FC8 已经特别高的语义含义之后,我们再去做一次合并,也就是 Late Fusion,从而得到最后的分类结果。

 这两种方法效果都不错。

图 2. 可以放置融合层的两个示例。左边的例子显示了第四个卷积层之后的融合。从融合点来看,只使用一个网络塔。右图显示了两层(conv5 之后和 fc8 之后)的融合,其中保留了两个网络塔,一个作为混合时空网络,一个作为纯空间网络。

 说完了 Spatial Fusion,又说完了应该在哪做这种 Fusion,最后讨论一下如何去做这种 Temporal Fusion。就是说当你有很多视频帧,然后你每一帧都去抽了这个特征之后,我如何在时间轴这个维度上把它们合并起来,或者做一些交互去得到最后的特征。作者在这篇论文里就尝试了两种方式。一种叫做 3D Pooling,一种是先做一下 3D Conv,再做一下3D Pooling。

图 3. 融合时间信息的不同方式。(a) 2D 池化忽略时间并简单地池化空间邻域以单独缩小每个时间样本的特征图的大小。(b) 通过首先跨时间堆叠特征图,然后缩小这个时空立方体,从局部时空邻域进行 3D 池化。(c) 3D conv + 3D pooling 在 3D pooling 之前额外执行与跨越特征通道、空间和时间的融合内核的卷积。

 在作者分别回答完这 3 个问题之后,作者就提出了最后的总体框架。从最底下来看,这就是 RGB 的输入,这就是光流的输入,然后下一帧的 RGB 输入下一帧的光流输入,总之,蓝色就代表的是空间流,绿色就代表的是时间流,然后针对每个图像或者说光流图像,我先分别用这两个网络去抽它的特征,一旦抽取好特征之后,我就按照刚才第二个问题里说的,我在 Conv5 那一层先对时间流和空间流做一次 Early Fusion,这里面因为同时牵扯到空间信息和时间信息,所以我们想让它交互的更好一些,这里面我们就采用了这种先做一个 3D Conv Fusion 再做一个 3D Pooling 的结构。然后在两个特征融合,而且 Pool 完之后就可以把它变成一个 FC 层,最后出来一个结果,然后去算一个 Spatiotemporal 的损失函数,之所以是 Spatiotemporal,因为你这里时间和空间的信息都有,它学的是一个 Spatial Temporal 的特征。然后因为时间流特别关键,我们之前也知道,做视频就是要在这个时间上做更多的处理,所以说作者这里又把时间流单独拿出来去做一次简单的 Pooling,然后再接 FC 层,最后专门做一个针对时间上的损失函数。这也就意味着我们这个模型是有两个分支的,一个是做这种时空学习 Spatial Temporal Branch,还有一个是专门做这种时间学习,一个 Temporal 的 Branch。在训练的时候也用了两个目标函数,也就是这里说的 Spatiotemporal Loss,和这个 Temporal Loss。

 这个模型在做推理的时候是怎么做推理的,因为你网络现在有两个分支,这两个分支最后都会有一个分类头,到底应该用哪个,其实在文章中就跟在图 2 里画的一样,或者说跟之前的双流网络一样,它也是做了一个 Late Fusion,就是把这两个最后的分类结果加权平均一下这是我们最后的预测结果了。

图 4. 我们的时空融合 ConvNet 应用双流 ConvNet,以精细时间尺度 (𝑡±𝐿/2) 捕捉短期信息,以粗略时间尺度 (𝑡+𝑇_𝜏) 捕获时间相邻的输入。这两个流由一个 3D 过滤器融合,该过滤器能够学习空间流(蓝色)和时间流(绿色)的高度抽象特征之间的对应关系,以及 𝑥, 𝑦, 𝑡 中的局部加权组合。融合流和时间流的结果特征在空间和时间上进行 3D 池化,以学习时空(左上)和纯时间(右上)特征以识别输入视频。

 说完了文章的整体架构,我们就直接来看一下最后的结果。在表 5 里作者就展示了一下他们的方法在 UCF101 和 HMDB51 上的结果,这里作者首先是尝试了一下使用更深的网络会带来多大的提升,就把双流网络简单的自己复现了一下,但是他把空间流和时间流的网络 Backbone 全都换成 VGG-16 了,这个显然是比双流网络之前用的网络结构要深一些的,所以说它得到的效果也好一些。比如说在 UCF 上它的提升非常大,从 88% 直接就提升到 91.7% 了。但是在 HMDB51 这个数据集上,其实就是 59.4% 和 58.7% 是差不多的水平,还略微有所下降。这个其实在我们马上要讲的 Temporal Segment Network(TSN)这篇论文里也有提到,就是说当一个数据集特别小,但是你要用特别深的网络去训练的时候就容易遇到这种过拟合的问题。所以说不见得你用更深的网络就能得到更好的结果。但总之至少在 UCF101 这个数据集上,当你有 1 万多个视频的时候可能就比较够了,这时候你能从 88% 直接提升到 91.7%,这个提升还是非常明显的。如果我们从作者自己复现的 Baseline 出发,然后把 Late Fusion 换成 Early Fusion 之后,我们可以看到其实提升也还好,从 91.7% 直接提升到了 92.5%。但是在 HMDB51 上,它的提升就非常的明显了,直接从 58.5%-58.7% 就提升到 65.4% 了,这个效果还是非常厉害的。所以说明了这种 Early Fusion 的方式可能算是一种变相的对网络的约束,让模型在早期的训练中就能从时间流和空间流这两只网络中去互相学习、互相弥补,所以说在一定程度上可能弥补了数据不足的问题。所以说能够让 Early Fusion 比 Late Fusion 学习的效果要好很多。

表 5. 在 HMDB51 和 UCF101 上的三个训练/测试拆分中表现最佳的 ConvNet 方法的平均分类精度。对于我们的方法,我们列出了用于空间 (S) 和时间 (T) 流的模型。

 当然了这篇文章的意义和贡献远远不仅于作者尝试一下 Early Fusion 和 Late Fusion 到底谁好。他主要的贡献在我看来其实有两点。

  1. 第一点就是他做了大量的消融实验,从 Spatial Fusion 到 Temporal Fusion,再到底应该在哪里去做 Fusion,彻底地把网络结构研究了一番,所以给后面的研究工作带来了很好的见解,能让大家少走很多弯路。
  2. 第二个贡献就是他尝试了这种 3D Conv 和 3D Pooling,增加了研究者对于使用这种 3D-CNN 的信心,变相地推动了这个 3D-CNN 的发展,所以在不到一年之后 I3D 就出来了,从此就开始了 3D-CNN 霸占视频理解领域的这个局面,所以说这篇论文的影响还是非常深远的。

2016-ECCV-Temporal Segment Networks Towards Good Practices for Deep Action Recognition

论文地址

 我们刚才在回顾双流网络的时候,也提到了几个可以改进的方向,刚才已经说完了 LSTM,而且也说完了 Early Fusion,最后该说一下如何处理更长时间的视频问题了。

 接下来要说的这篇论文叫做 TSN(Temporal Segment Networks),是一篇 ECCV 2016 的中稿论文。这篇论文在视频理解领域里的贡献完全不逊色于双流网络或者是 I3D 网络,这个里程碑式的工作不仅通过一种特别特别简单的方式能够处理比较长的视频,而且效果特别好。而且它更大的贡献是确定了很多很好用的技巧,也就是他写进题目里的这些 “Towards Good Practices for Deep Action Recognition” 所谓的这些 Good Practices 好用的技巧,这些技巧包括怎么去做这种数据增强、怎么去做模型的初始化、到底该怎么使用光流、到底使用哪个网络、到底该如何防止过拟合,这篇论文全都给出了非常好的答案,它里面的很多技巧沿用至今。

 作者团队其实基本上都来自于 CUHK(香港中文大学),一作王利民老师 Limin Wang 当时已经去了 ETH(苏黎世联邦理工大学)读 Postdoc(博士后),上次我们讲双流网络的一个跟进工作,就是如何更好地利用光流然后去做这种轨迹上的光流堆叠,就是王老师的工作,叫 TDD,接下来王老师还有 UntrimmedNetsARTNetTEA,还有 MGSamplerV4D,以及去年 ICCV 的 TAM,等一系列工作。所以说做视频理解的同学不妨多去关注一下王老师组的工作,应该都会有所收获。

 TSN 这篇论文到底讲的是什么意思我们直接来看图 1 就可以了,这篇论文的研究动机就是说如果你有一个原始的双流网络,你上面是一个视频帧通过一个空间流,然后下面是几帧光流图像通过一个时间流,你能覆盖的视频长度最多 10 帧,也就是不到半秒的时间,太短了!我怎样才能去理解一个更长的完整的视频 ?

 TSN 这篇论文的想法就非常简单,我把这个视频分成几段不就完了吗。比如说我现在这个视频我就把它切成 3 段,它这里出于画图简单所以就分成了 3 段,我在每一段里去随机抽取一帧当做 RGB 图像,然后以这一帧为起点再去选几帧去算光流图像,然后后面就按照这个双流网络的做法去做,最后就会出来两个 Logits。然后同样的道理,我再从第二段里去抽一帧,然后当做这个RGB图像,然后再去算一些光流,再通过一个双流网络。当然这里所有的 Spatial ConvNet 全都是共享参数的,Temporal ConvNet 也都是共享参数的,所以说其实你只有一组双流网络。然后再从第 3 段里做同样的操作,又会得到两个 Logits。

 TSN 的想法就是说如果你这个视频也不算太长,里面也就包含了一个事件或者一个动作的话,即使抽出来的这些帧表面上看起来有些不一样,但它其实最高层的语义信息应该都描述的是一个东西。所以说我应该把每一个段里的空间流抽出来的这个 Logits 做一个 Segmental Consensus,Consensus的意思就是达成共识,其实也就是做一下融合。这里面你也可以做加法做乘法,做这个 Max 也可以做 Average 都可以,甚至你也可以用一个 LSTM 总之去融合一下每个段出来的分类结果。同样的道理,这个时间流出来的这个 Logits 也要做一个这个 Segmental Consensus,也要达成一个共识,最后空间上的共识和时间上的共识,做一个 Late Fusion,一个加权平均就得到最后的预测了。

 举个简单的例子:如果我们现在做的是 UCF101 这个数据集,也就是说一共有 101 个类的话,其实绿色这里的 Logits 其实就都是 1×101 的一个向量,同样的道理,下面蓝色这里面的这个共识也是一个 1×101 的向量。

图 1. 时间段网络:一个输入视频被分成 K 段,并从每个段中随机选择一个短片段。不同片段的类别分数由分段共识函数融合以产生分段共识,这是视频级预测。然后融合来自所有模态的预测以产生最终预测。所有片段上的 ConvNets 共享参数。

 我们可以看到 TSN 这个想法非常的简单,很多人可能觉得这太简单了有可能审稿都不给过,但之前沫神在讲 Michael J. Black 的那篇博文的时候,就是如何判断一个论文的新意度的时候,其实强调过简单不代表没有新意,反而如果你是一个既简单又工作的很好的方法其实是最具有新意的。TSN 这篇论文就完美的诠释了这个概念。而且这种给视频分段这种 Temporal Segment 的思想,它不光是可以作用于这种短一点的视频,就是说这种已经裁剪好的 Video Clip 上,那也可以工作于就没有裁剪过的这种长视频上也是可以的。因为即使你这个视频很长,我也可以把它打成更多的段落,而且每个段落里的含义也不一定需要一样,如果你不一样的话我后面这儿就不做 Average 就好了,我可以去做 LSTM 去模拟时间的走势也是可以的,王老师之后另外一篇工作 UntrimmedNets 其实就是用来去做这种没有裁剪过的长视频的视频分类任务的,工作的也非常好。

 而且这篇论文做的是 Surprised,就是有监督的方式,UntrimmedNets 做相当于是弱监督的方式。其实 Temporal Segment 这个思想也可以作用于无监督的训练方式,我们(朱毅老师)组去年的一个工作就是把 Temporal Segment 的思想融合到对比学习之中,简单来说就是之前的工作往往是把一个视频里任意的两帧当做是正样本,其它的所有帧都当做负样本,但这样的话如果你这个视频比较长你这个随机抽出来的两帧不一定是正样本,所以说我们就融合了 Temporal Segment 的思想,在一个视频里我们先把它分成段,从第一段、第二段、第三段里分别去抽出第 1 帧、第 2 帧、第 3 帧。我们把这 3 帧当做是第一个样本,然后我们再去这 3 个 Segment 里任意的再去抽 3 帧出来,第二个抽出来的 3 帧我们就当做是第二个样本,第一个样本和第二个样本就可以理解成是一个正样本对了,这样它成为正样本对的可能性就大很多,因为哪怕你这个视频很长,哪怕你每个 Segment 里表示的语义都不一样,但是我的第一个样本也是从第一个 Segment 到第二个 Segment 到第三个 Segment,我第二个样本还是从第一个 Segment 到第二 Segment 到第三个 Segment,它的基本走势是一样的。所以它俩成为正样本队的可能性是非常高的。总之别看 Temporal Segment 这个想法非常简单,但真的是非常的有效,我觉得它还能利用到更多的领域中去。

 另外我想简单提一下的就是文章题目里说的这些好用的技巧了,这个是在文章的 3.2 节,也就是在网络训练部分。

  1. 他们使用的第一个技巧叫做 Cross Modality Pre-training。它这里的 Modality 其实指的就是说图像和光流,因为图像和光流其实也算是挺不一样的输入了,所以也可以理解成是多模态。他这里的意思就是说你图像这边可以有 ImageNet 这么大一个数据集去做预训练,所以你可以直接拿来做微调效果应该不错,可是光流那边并没有一个很大的光流数据集去做预训练,如果你只在这种小的视频数据集上从头训练的话,你光流的效果可能不会太好。怎么样才能去做一个有效的预训练?作者这里就说其实你把 ImageNet 预训练好的模型拿过来用给光流也是可以的,效果也非常好。但是这里问题就来了,你这个 ImageNet 预训练好的模型,你要接收的输入是 RGB 图像,是 RGB 3 个 Channel,而你这个光流的输入是 10 张光流图,每个光流图是 2 个 Channel,是 x、y 上的分别的位移,所以说你一共有 20 个 Channel,那你这个预训练模型怎么把这 3 个 Channel 变成20个 Channel,才能使用在光流上呢?作者这里其实就把网络的第一层,就是第一个卷积层的结构和参数改变了,他就把因为 ImageNet 那边预训练好的参数刚开始的 RGB Channel 先做了一下平均,那这样 3 个通道就变成 1 个通道了,然后你现在不是需要 20 个通道吗,我直接就把这一个通道复制 20 遍就可以了,他们发现这种初始化的方式工作得非常好,后面我们可以看到这个方式提了五六个点,提升是非常显著的,而事实上这种方式现在广泛被使用,接下来的 I3D 它其实也就是这么去做 Inflation 的。
  2. 第二个技巧就是作者这里谈到的这个模型正则化的技巧,那一上来作者就说 BN 怎么着了,其实我们也讲过很多次 BN 这个层真的是让人又爱又恨,用得好效果提升很好,用得不好就会遇到各种问题。在初期的视频理解领域用 BN 就有一些困难,因为数据集太小。所以说虽然 BN 能够让这个训练加速但是同样也带来了很严重的过拟合的问题。那怎么办呢?作者在这里就提出了一个叫 Partial BN 的做法,他本来的动机是说如果你 BN 层是可以微调的话,因为数据集比较小,所以一调就会过拟合。我其实不想调你,我想把你全冻起来是最好的,不要动了。但是如果你把所有的 BN 层全都冻住的话,你可能迁移学习的效果就不太好了,毕竟你之前数据集是图像数据集跟这个视频数据集和这个视频的动作分类差得还是比较远的。之前 BN 估计出来的那些统计量可能就不太适用于这个动作识别。怎么办?所以说作者提出的 Partial BN 的意思就是说我们就把第一层的这个BN 打开,后面的 BN 我们就全都冻住,也就他这里说的 freeze the mean and variance parameters of all Batch Normalization layers except the first one。这个意思就是说因为你的输入变了,所以说我第一层这个 BN 没办法,我必须也得学一学,这样我才能适应你新的输入,适应你新的数据集,但是除了输入层再往后我就不想动了,因为如果再动就有过拟合的风险了。这个技巧后来也被广泛使用,虽然说现在视频里的数据集都变得很大了,可能暂时是不需要这种 Partial BN 了,但是在微调的时候或者在很多下游任务上还是会有很多情况 你需要使用 Partial BN,一般呢 工作得都不错。
  3. 第三个好用的技巧就是数据增强了。因为为了防止过拟合,数据增强是一个必不可少的工具。作者这里就提出了两个东西,一个叫 Corner Cropping,一个叫 Scale-jittering。Corner Cropping 其实就是作者在训练过程中发现,如果你去做这种 Random Cropping,这个 Random 出来的 Crop 经常在这个图像正中间或者在中间附近,它很难去 Crop 到图像的这种边边角角的地方。所以在这篇论文里它就强制性地去在那些边角的地方去做裁剪,就像 ImageNet 之前做这个测试的时候有的人用 One Crop,有的人用 Five Crop、Ten Crop。那个 Five Crop 其实就是在左上、右上、左下、右下和中间选 5 个裁剪的位置。这里面作者就是把之前大家去做推理、做测试的一个方法用到训练中来了,当成了一个数据增强的方式。第二个提出的数据增强方式也就他这里说的这个 Scale-jittering。就是想通过改变图片的这个长宽比而去增加这个输入图片的多样性,作者这里的实现方式很高效,他就是先把这些视频帧全都 Resize 到 256×340,然后他在这个图片上就去各种各样的做裁剪,但是他做裁剪的长宽都是从 {256, 224, 192, 168} 这个列表里去选的。意思就是说有些裁剪出来的通道,比如说就是 256×192,有些就是 224×168,当然也有可能是 224×224,反正就是随机排列组合去吧。这样图片的长宽比就变得非常多样性了,从而能提供更多的训练数据 减少这种过拟合。这两种数据增强的方式其实一直到现在还有很多论文也在使用,因为确实比较有效。

 总之除了这几点好用的技巧之外 TSN 这篇论文里还有很多宝藏技巧,所以这也就是为什么作者把 Good Practice 都放到这个论文题目里了,因为真的是这篇论文最出彩的地方之一。

 那很多的消融实验我们就暂且跳过不看了,他提出这些技巧都非常有用,提点其实都很显著的。我们直接来看最后这个大表,来看一看 TSN 的效果跟之前的方法比到底有多好。作者在这里把之前手工特征的方式列到了这个表的上面,然后底下这片全都是用深度学习来做的,里面有一些我们其实已经讲过了,比如说双流网络 59.4% 和 UCF 上 88% 的准确度,而这个 VideoDarwin 是用 Ranking Function 做的,这篇论文也非常有意思,只不过没有什么后续工作了。然后像 C3D 其实就是 3D-CNN 那边的一个早期的工作,我们很快就会在下一个部分就讲到。但是我们可以看到这些早期的工作即使用了 3 个卷积神经网络,它最后的结果也才 85.2%,既不能跟这种传统的手工特征比也没法跟双流网络的性能去比,直到I3D的出现才改变了这种现状。然后 Two stream + LSTM,也就是我们刚讲过的 Beyond Short Snippets 那篇论文,但是提升了也不是很多,从 88% 涨到了 88.6%。然后 TDD 这篇论文就是王老师自己的工作,就是那篇把光流简单地堆叠变成利用轨迹去堆叠的方式,这个提升呢还是比较明显的,就从 88% 就到 90% 了。最后呢 我们来看一下 TSN,TSN 这里呢我们就看两个 Modality 就可以了,就是 RGB 和光流,至于 3 个 Modality 是因为他们用了另外一种光流的形式,这里我们就不细说了,这里我们看到就用两个 Modality 这个 TSN 呢它在 HMDB51 上就有 68.5 %,比之前的方法都高,UCF101 上也有 94%,比之前的方法也是提升了不少。

表 6. 我们基于时间段网络 (TSN) 的方法与其他最先进方法的比较。我们分别展示了使用两种输入模式(RGB+Flow)和三种输入模式(RGB+Flow+Warped Flow)的结果。

 TSN 其实已经是把双流网络做得非常好了,接下来还有一些后续工作,比如说我(朱毅老师)和蓝振忠(西湖大学)就有一篇叫 DVOF 的论文,就是在 TSN 的基础上加入了全局编码,比如说 Fisher Vectors (FV) Encoding,或者 VLAD Encoding 这些编码方式,从而获得了更加全局的特征,然后在 UCF101 上的效果也推到了 95% 点多。然后接下来在 CVPR 2017 还有另外一篇论文叫 TLE 也是用了非常类似的思想,只不过我们的不是端到端的,他们又把这个做成端到端了。然后 TLE 的结果在 UCF101 和 HMDB51 上也是非常的高,UCF101 基本上已经到了将近 96% 了。也就是在 2017 年 I3D 这篇论文也出来了,所以说至此双流网络基本也就慢慢地淡出舞台了,而且因为有了 Kinetics 这个数据集所以说 UCF101 和 HMDB51 也基本慢慢的淡出这个舞台了。所以说 TSN 是视频理解领域里不得不读的一篇里程碑式的工作,不论你是做分类还是做动作检测还是做其他任何的这个视频理解的任务,都不要错过 TSN。

双流网络小结

  我们讲完了上半部分,就是 2D 网络和一些双流网络以及他们的变体,今天呢我们就来讲一下下半部分,就是 3D 网络和 Video Transformer 在视频理解领域里的应用。上次其实我们也讲了很多工作了,他们的这个效果呢也都不错,而且用上光流以后,一个网络去学习这种图像特征,另外一个网络去学习这种运动特征,各司其职互不打扰,最后结果也非常好。那为什么研究者这么想把这个双流网络替换掉,用这个 3D 卷积神经网络来做呢?

 其实最主要的原因就在这个光流抽取这一块,比如说大家之前常用的一种算光流的方法叫 tvl one,如果我们使用一种GPU 的实现,计算光流只需要 0.06 秒就能处理一个视频帧的一个对,你乍一听可能觉得 0.06 秒挺快的呀,但是如果你想一下这个视频数据集有多大,你就会发现提前抽取这个光流是一个非常耗时的事情。我们先拿一个比较小的数据集 UCF101 来说的话,它有 1 万个视频,UCF101 它的平均视频长度大概是 6 秒,如果我们按这个帧率 30 fps 来算的话,最后这个 UCF101 数据集大概就有 180 万张视频帧,如果我们把这 180 万和这个 0.06 秒一乘就会发现,如果你只有一个 GPU 而且不做什么优化的话,你最后需要 1.5 天的时间抽取这个光流。那现在我们换了一个稍微大一点的数据集,就是大家常用的 K400 数据集,它里面有 24 万个视频,K400 的平均视频长度大概是 10 秒,如果我们还按这个帧率 30 fps 来算的话,它最后就有 7,200 万个视频帧,那这时候你再跟这个 0.06 秒一乘,你就会发现你如果你只有一个 GPU 而且不做任何优化的话,最后你要抽 50 天。当然一般做视频也不可能只有一个 GPU,而且呢因为这个 tvl one 算法很省内存,所以一个 GPU 能同时跑好多对,所以最后肯定是花不到 50 天的,但对于一般实验室来说,抽一两个礼拜还是很正常的,那这也就意味着,当你想尝试一个新的数据集时,你都要先去抽取这个光流,然后才能做这种模型的开发,那在这抽光流的一两个礼拜时间里你什么也干不了,就这个预处理实在是太耗时了

 而且它也很占空间,即使是按照双流方法里那样,把这个光流存成 jpg 图片,那对于 UCF101 数据集来说大概也需要 20 多个 G 的存储空间去存储,然后对于 K400 老说大概需要 500G 的存储空间去存储。你可能会想,这个存储空间一点都不贵,很便宜,现在都是 4 个 T、8 个 T 的硬盘,500G 根本不算什么,但你还要考虑到这个运算时候的 IO,如果你的训练数据集这么大的话,那训练的时候呢是很容易卡 IO 的。

 而且抽取光流不光是说对训练有着一定的影响,它在推理过程中也是有影响的,因为你不论用在哪个场景里你都要先去抽取这个光流。那假设我们就用 tvl one 这种算法去抽光流的话,那他处理一个视频对呢大概是花 0.06 秒,那你 1 除以 0.06,换算过来这个帧率就是 15 fps,这个 fps 呢是低于这个实时要求的,因为实时的处理一般是需要 25 fps或者 30 fps。那这也就意味着你什么模型都没用你光抽光流你就已经不是实时了,那你再加上模型那就肯定更不是实时了。但可惜视频理解一般的应用很多都是需要实时处理的,所以说后面很多工作都是针对这些缺点去攻击这些基于光流的方法,就尽量想避开使用双流网络。如果我能直接从视频里进行学习那该多好,所以这也就有了从 2017 年到现在 3D 卷积神经网络的火热。

 他按道理来说你就是想去学习一个时空特征,就是它既有这个 Spacial 又有 Temporal 上的信息,它是一起学的。所以你没必要单独的再去对这个运动信息或者时序信息单独建模了,也就意味着你不需要这种光流了。但实际上我们可以看到,因为这个 3D 网络越做越大,或者说这个 Video Transformer 也越做越大,所以说其实这个效率上的问题并没有得到解决,大部分模型也都不是实时的。而且呢如果你给这些 3D 网络或者给这些 Video Transformer 去加上这种光流输入的话,其实他们都还能继续提高性能。也就意味着光流这个东西其实还是很好的一个特征。

2015-ICCV-Learning Spatiotemporal Features with 3D Convolutional Networks

论文地址

 那我们直接进入正文,今天要说的第一篇论文就是 ICCV 2015 的这篇 C3D 网络,题目就是用 3D 卷积神经网络去学习这种时空上的特征。作者团队来自 Facebook AI 和 Dartmouth,那其实呢 Lorenzo 后面也已经去了 FAI,所以说其实就都是 FAI 的工作。

 我们从摘要的第一句话就可以看出来这篇文章的主要贡献是什么。其实作者已经说了他们就是提出了一个简单但是有效的方法去学习视频中的这种时空特征,用什么工具呢?就是用一个简单的 3D 卷积网络就可以了。那他们的贡献主要就是用了一个更深的 3D 卷积神经网络,而且是在一个特别大的数据集上去进行与训练,而这个数据集就是我们上回讲的 DeepVideo 那篇论文里提出来的 Sports-1M 有 100 万个视频的数据集。然后作者在这个引言部分也已经提到他们不是第一个使用 3D 卷积神经网路来做视频理解的,在之前 [15] 和 [18] 这两个工作都是用 3D 卷积神经网络来做的,没有什么区别。主要是他们这篇论文在使用了大规模的这个数据集去预训练模型,而且用了这种现代的深度学习,其实就是更深的网络,从而在一系列任务上取得了非常好的结果。所以站在我们的角度再回去看这篇论文的话,他在想法上还是比较简单的。

 所以我们直接来看这个效果和这个模型总览图。

 那首先呢,作者把他们的这个最后结果放到这个表 1 里,直接放到这个论文的第二页,因为呢这算是他们论文的一个卖点,就是说在这四个数据集(后面四个)上他们都取得了最好的这个结果,然后在这两个数据集(UCF101、HMDB51)上他们也取得了不错的就是 Competitive 的结果。

表 1. C3D 与最佳发表结果的比较。除了 Sports-1M 和 UCF101 之外,C3D 在一系列基准测试中优于所有之前报告的最佳方法。在 UCF101 上,我们报告了两组方法的准确性。第一组方法仅使用 RGB 帧输入,而第二组方法(括号内)使用所有可能的特征(例如光流、改进的密集轨迹)。

 那接下来我们直接看模型的结构,在这里作者其实是用一个简略图画画出来的,而不是一个特别 Fansy、特别好看的一张图。那大体的这个网络结构呢就是你有这个 Conv1、Pool1 然后 Conv2、Pool2,Conv3a、3b、Pool3,还有 Conv4a、4b、Pool4 ,Conv5a、5b、Pool5,然后最后呢还有两层 fc,最后呢还有一个分类层 fc 8(softmax)。 所以说整体来看呢这个网络结构呢是有11层的,至于所有的这个 3D 卷积层里的这个卷积核是怎么构造呢,作者这里也说了其实就是把所有的这种 3×3 的卷积核都变成了这个 3×3×3。那其实我们看到这呢你就会发现这个网络怎么跟 VGG 这么像呢?那其实说白了它其实就是一个 3D 版本的 VGG 网络。那如果我们回顾一下 VGG 16 那个网络的话,其实在 Conve1 这块它是有两层 Conv 然后一层 Pooling, 然后又有两层 Conv 一层 Pooling,然后从第 3、4、5 这三个 block 来说他是三个 Conv 加一个 Pooling、三个 Conv 加一个 Pooling、三个 Conv 加一个 Pooling。所以说相当于 C3D 网络就是把 VGG 网络的每一个 block 里面都减少了一层 Conv,然后把所有的 Conv Kernel 都从 3×3 变成 3×3×3 了。所有的改动其实就是这些,所以这也就是为什么作者说他们这个方法设计非常简单,也没有像 Inception Net 那种 Multi Pass 也就是多路径的那种结构,而且当时也还没有 ResNet,所以也没有残差链接,就是 Conv、Pooling、Conv、Pooling。

 那现在我们给定一个输入,然后走一遍这个模型的前向过程就能更好的理解这个模型是怎么运作的了。那这篇论文里它的输入是 16×112×112,16 就是说明有 16 个视频帧,也就是时间上你这个维度是 16,然后这个空间上是 112×112。之所以没有用 224×224 是因为 GPU 内存塞不下。作者后来也实验了一下,发现 112×112 其实效果也一样。因为一般对于分类任务来说其实这个图片大小不是那么的重要,所以这个 3D 网络的输入呢就是 16×112×112 了。然后过完一层 Conv 和 Pooling 之后,他们这里写的是 1×2×2,就是在这个时序上他不做这个下采样,因为想尽可能多的再保留一下时序上的信息。那所以说呢这个时序上 16 还是 16,但是这个空间上就降了一半,那就变成 56×56了。然后再做一层 Conv、Pooling,那接下来呢所有这个 Pooling 操作也都是 2×2×2 了,所以说不仅是时间上从 16 变成 8,把空间上进一步降低变成 28×28。然后再过了第三层这个 Conv 之后,就变成 4×14×14。然后过了第四层 Conv 之后就变成 2×7×7。然后再过了第五层 Conv 和 Pooling 之后呢,最后在 fc 这一层这个特征维度就变成一个 1×4096,就变成一个一维的一个向量了,也就是我们最后抽取的这个特征,当然了 fc7 也是 4096×4096,然后最后一层 fc8 分类层就是 4096×101,分成了 101 类。

 在这篇论文里作者当时发现这个 fine-tune 这个网络最后的结果也不是很好,而且又费时又费力。其实作者每次都是抽取特征,他最后选择的就是从 fc6 这层去抽取这个 4096 的特征拿出来,然后再去训练一个 SVM 的这个分类器去做这个分类任务,又快效果又好。那其实这篇文章的名字 C3D 其实更多时候指代的就是这个 C3D 特征,也就是 fc6 抽出来的这个特征,叫 C3D 特征

图 3. C3D 架构。C3D 网络有 8 个卷积层、5 个最大池化层和 2 个全连接层,后面是一个 softmax 输出层。所有 3D 卷积核都是 3×3×3,空间和时间维度上的步长均为 1。每个框中都标明了过滤器的数量。3D 池化层表示为 pool1 到 pool5。所有池核都是 2×2×2,除了 pool1 是 1×2×2。每个全连接层有 4096 个输出单元

 模型上其实就是这些,能讲的不是很多,那接下来我们就直接看结果。首先在这个表 2 里作者就展示了一下在 Sports-1M 这个数据集上的结果。那前两行呢这个就是 DeepVideo(CVPR 2014)的那篇论文,也是第一次提出 Sports-1M 这个数据集的,我们可以看出来 C3D 这个工作在 Sports-1M 这个数据集从头训练的话,这个效果大概是 44%、60%、84%,比原来的 DeepVideo 还是要高一些的,所以证明了 C3D 网络的有效性,然后如果把 C3D 在更大的数据集上去做与训练,也就是这里的 I380K(Facebook 自己从来没有 Release 过的一个 Instagram 的视频数据集),在这个上面去做与训练之后,他发现这个效果就更好了。所以作者在这个摘要还有引言里反复强调了,他们认为这种 3D 的直接学习时空特征的方法是比 2D 网络要好的,因为 DeepVideo 这个方法还是可以看作是一个 2D 网络,它里面虽然有一些 Early Fusion 或者 Slow Fusion,但终归而言它还是用这个 2D 网络去抽特征,只不过后面做了一下合并。那这个 C3D 才是真真正正从头到尾都是一个 3D 卷积神经网络,从头到尾都是在做这种时空学习,所以作者就得出了 3D 网络要比 2D 网络要更优秀,或者说更适合视频理解的任务。

表 2. Sports-1M 分类结果。C3D 在 top-5 视频级精度上优于 [18] 5%。(*) 我们注意到 [29] 的方法使用长剪辑,因此其剪辑级别的精度不能直接与 C3D 和 DeepVideo 相媲美。

 接下来呢我们看一下这个表 3,也就是在 UCF101 这个数据集上 C3D 的表现到底如何。我们这里也可以看出来,就是 C3D 这个网络,如果你只用一个网络的话,它的结果也只有 82.3%,如果你训练了 3 个网络,把他们这个 Ensemble 起来,它最后的结果也才有 85.2% 这么高。85.2% 这个效果是远低于同期其它工作的,我们之前说过最好的手工特征都有 88%,双流网络也有 88%,然后用 LSTM 网络的也有 84%、88% 这么高。而且其实比它更早,也就是 CVPR 15 发出来的一篇论文,就是王利民老师在 TDD 里面的论文其实就已经在 UCF 上有 91.5% 的结果了,这比他这里的 90.4% 还要高。

表 3. UCF101 上的动作识别结果。C3D 与基线和当前最先进的方法进行比较。顶部:线性 SVM 的简单特征; 中间:仅将 RGB 帧作为输入的方法; 底部:使用多个特征组合的方法。

 所以说整体上来看,其实 C3D 的这个效果并不突出,那 C3D 为什么会这么火,它的接受度又这么高呢?其实我认为是作者抓住了一个机会,他没有把这篇文章的卖点放在这个网络训练上,而是把这个卖点放在这个抽特征上,而且他还给出了 Python 和 Matlab 的实现,这个在当时 15 年的时候是非常关键的,这个时候 C3D 的作者其实也发现了,他训练 C3D 网络当时花了一个月,也就是以 Facebook 这个算力,他训练这么一个网络都要花一个月的时间,对于很多人来说肯定是训练不动了。所以他知道如果大家想在这个视频理解,或者在对应的其它领域里去应用这种视频的特征,或者视频模型的话,Fine-tune 这个模型在当时并不是一个好的选择,抽特征才是。所以作者就提供了一个 Python 还有一个 Matlab 的接口,也就是说,你给我一个视频输入,你也可以用 OpenCV 读进来,Matlab、Python 都可以,然后我就返还给你一个 1×4096 的特征,中间的细节你通通都不用管,你就拿这个特征去做你其他的下游任务就可以了。所以很快啊,其它任务纷纷都用起了 C3D 这个特征,比如说 Video Detection 或者 Video Caption,都可以直接抽一个特征然后去做其它的下游任务。这个其实跟现在我们用的 Transformer 也是一个套路。因为 Transformer 训练起来太贵了,很多人也训练不动,微调也训练不动,所以大家在做多模态的时候呢,往往是把 Transformer 去抽一个特征,然后抽完特征以后,再在特征上去做这种特征的融合,或者做这种多模态的学习,这个训练起来的代价就小得多。所以从这个角度上来看,做研究也不光是要成天去考虑这种新意度的问题,更主要的是考虑一下你这个东西到底有没有用。如果你做出来的这个东西真的能推动整个领域的进步,那其实才是真的好的,真的有用的研究工作。

总之,C3D 这篇论文它的意义还是非常巨大的,不光是通过这种抽特征的方式让更多的研究者能够把深度学习时代更好的这个视频理解的特征用作其它的下游任务,同时他还系统的研究了这种 C3D 卷积神经网络,以及如何使用到这个视频理解的任务上来,从而为后续的这一系列 3D 工作做了一个铺垫。

2017-CVPR-Quo Vadis, Action Recognition A New Model and the Kinetics Dataset

论文地址
讲解视频

 那接下来就不得不提一下 I3D 这篇论文。这篇论文的意义就是降低了网络训练的难度,提出了一个更好、更大的数据集,而且在它标准的 Bench Mark 上的结果都比之前 2D 或者双流的方法要好,从而奠定了 3D 网络的这个地位。我们也可以看出来,C3D 发表在 ICCV 2015 上的,而这个 I3D 是发表在 CVPR 2017 上的,这中间将近过了两年的时间,所以说明 3D 网络的调试和模型的迭代还是非常困难的。这就更进一步的体现出了 I3D 这篇论文的意义。如何能通过这种 Bootstrapping 的形式降低网络的训练难度。那鉴于之前,在上面的讲解视频中已经精读过 I3D 这篇论文了,这里我们就快速过一下。

 那其实 I3D 这篇论文的最大亮点其实就是在这个字母 I 上,也就是这里的这个 Inflated,扩充的膨胀的一个 3D网络。那之所以作者想这么做呢,其实主要是看到 C3D 这个网络在这么大的数据集上去做过与训练之后,它的效果也不太行。所以 I3D 的作者就坚信我们这里一定要有一个类似于 ImageNet 这样一个与训练网络,我们要有一个更好的初始化,从而使接下来的训练变得更简单。那之前 ImageNet 预训练的模型全都是 2D 的,那你现在如果是一个 3D 网络,你怎么把一个 2D 网络变成 3D 呢?也就是这里的膨胀的意思,他就是要把一个 2D 的网络扩充成一个 3D 的网络,而这个网络整体的结构是不能改变的。

 在这里我们用图 3 做个例子,它这里也就是把一个 2D 的一个 Inception 网络给扩充成了一个 3D 的 I3D 网络。那对于一个 2D 的 Inception v1 网络来说,其实这里就是 Conv、Pooling,然后 Conv、Conv、Pooling,而接下来都是这种 Inception Module,也就意味着说这个 2D 的 Inception 和这个 3D 的Inception,它这个网络结构没有变,只是把这里的这写卷积核从 3×3 变成了 3×3×3,或者刚开始的 7×7 变成了 7×7×7,像这个 Pooling 层,刚开始有 1×3×3,后面有 3×3×3,最后呢还有 2×2×2,都是由 2D 变成了 3D。那这样一个好处就是因为你 2D 的网络和 3D 的网络共享了一个 Meta 结构,就是总体架构是一样的,那这样你就能想到一种比较简单的方式,能把 2D 已经训练好的参数移植到 3D 的模型上来。这个对于 C3D 网络就做不到,C3D 网络虽然我们之前说它有点像 VGG 16,基本上就是按照 VGG 那个网络的设计理念来设计的,但是它每一个 Block 里面都少了一层卷积层,所以导致它没法很简单的把这个 VGG 的 2D 网络参数一直到它的 C3D 网络中来。这也都导致了它们没法使用 ImageNet 的与训练参数,从而导致了它们很难优化,很难得到一个更好的结果。所以说呢,I3D 这篇论文的最大亮点就是这个 Inflation,这个操作不仅不用设计一个网络直接把一个 2D 网络扩充成 3D 就可以了,而且还能利用 2D 网络预训练好的模型参数,从而简化这个训练过程,最后也能利用更少的训练时间达到更好的效果。

图 3. Inflated Inception-V1 架构(左)及其详细的 inception 子模块(右)。未指定的卷积和池化运算符的步长为 1,未显示批归一化层、ReLu 和末尾的 softmax。网络中一些层的感受野大小的理论大小以“t𝑖𝑚𝑒, 𝑥, 𝑦”的格式提供——单位是帧和像素。预测是在时间上卷积获得的并取平均。

 那如果我们快速看一下 I3D 网络在 UCF101 和 HMDB51 这两个数据集上的结果,就可以发现他的这个结果是远远比之前的方法要高的。那如果我们就拿 3D 网络之间做对比,我们可以看到这个 RGB I3D 的这个结果就比对应的 C3D 用 RGB 的结果高了大概 3 个点,所以说这个提升是相当显著的。

表 4. 与 UCF-101 和 HMDB-51 数据集上的最新技术的比较,三个拆分的平均值。第一组行包含在没有标记外部数据的情况下训练的模型的结果。

而且 I3D 这篇论文还有另外几个意义所在:

  1. 第一个意义就是它还做了这种 RGB I3D 和 Flow I3D,就是即使它是一个 I3D 网络,它还是用了光流。这就是我们之前说的,即使你是一个 3D 网络,你用了光流之后,你的这个效果还会更好。所以光流不是没用,只是计算代价太高而已。
  2. 那第二个意义就是说 I3D 网络通过这种膨胀扩充的这个操作,能大幅度提高这个实验结果。从而把这个 UCF101 和 HMDB51 这两个数据集基本上就刷爆了。所以在这之后呢,大家也就不用这两个数据集,转而去用他们提出的这个新的 K400 数据集了。他相当于是仅凭一己之力把整个视频理解领域从双流变成了 3D 网络,而且把这个做测试的数据集也从 UCF101 变成了 K400 数据集。
  3. I3D 论文带来的第三个影响就是说它证明了从 2D 网络迁移到 3D 网络的有效性,所以在 I3D 网络把 2D 的 Inception Net 转成 3D 的 Inception Net 之后呢,很快就有其它的工作就跟进了。那比如说在 CVPR 2018 的时候,大家就把 2D 的 ResNet 全部变成了 ResNet 3D 了,然后 ECCV 2018 的时候就有一篇论文把 ResNeXt 的思想用过来变成了叫 Multi-Fiber Network,也就是 MF-Net。然后再后来大家又把 SENet 里的这种 Channel Attention 的思想借鉴过来 然后变成了 CVPR 2019 的一篇 STCNet 的文章。所以说是非常里程碑式的一篇文章。

2018-CVPR-Non-local Neural Networks

论文地址

 那说完了 C3D 和 I3D,那基本上 3D 网络的这个基本结构就定好了,接下来就是做各种各样的改进了。那对于视频问题来说,大家更关心的肯定是时序上怎么去建模,或者说我怎么能处理好更长的这个时间序列呢?那对于之前的传统方法,或者对于 2D 网络双流的方法,大家就是再后面加一个 LSTM 就行了。那 3D 这边呢,当然也可以再后面加一个 LSTM,没问题。但是当时在 3D 网络火起来的同时,在 NLP 领域里发生了一件巨大的事情,那就是 Transformer 这个模型出来了,也就是说 Self Attention 自注意力这个操作被提出来了,而且效果特别好。那自注意力操作我们也知道,它本身就是用来学习这种远距离信息的,正好跟这个 LSTM 的作用不谋而合。所以说 Non-local 的作者可能就想了一下,我为什么不把这个 Self Attention 拿来代替一下 LSTM 呢?看看这个自注意力操作在视觉里到底应用的好不好,结果证明把自注意力用到视觉领域效果还是非常不错的,所以说在 Non-local 这篇论文出来以后,很快视觉里别的一些下游任务,比如说检测和分割全都把 Non-local 这个算子应用到这个网络之中了,尤其是对分割而言,2019 年都卷疯了。不知道有多少论文把子注意力尝试加到分割各种不同的这个网络结构里,然后做各种不同的变体,或者说加速啊提点啊,总之五花八门。然后在后面就有了 Vision Transformer,然后就有了 Transformer 在 CV 领域里大杀四方。总体而言呢,就是自注意力操作真的非常有效。

 那在摘要里作者就是说,无论是这个卷积操作还是递归的这种操作,它每次处理都是在一个很局部的区域里进行处理的,那如果我们能看到更长的或者更多的这个上下文肯定是对各种任务都会有帮助的。所以这篇论文里捉着就提出来一个不是局部的操作,也就是这里说到 Non-local 的一个算子它是一个可以泛化的,而且可以即插即用的一个 Building Block,就是一个模块,而这个模块的作用就是用来建模这种长距离信息的。

 然后作者接下来就说,他们是收到 CV 里之前有一个方法叫做 Non-local Means 的方法,所以才想到用这个 Non-local 这个算子去做这种长距离建模的。然后作者最后就说,因为这个模块是一个即插即用的模块,所以我可以把它运用到各种任务里去。首先我们在视频这边就取得了不错的效果,其实我们还在这个检测、分割还有这个姿态检测全都取得了非常好的效果,这也说是何恺明大佬 Kaiming He 一系列工作的风格,就是实验非常的详尽,那每次基本上就是把能做的任务全都给你做了个遍,让审稿人无话可说。

 那具体这篇论文提出的这个 Non-local Block 到底是什么样呢,他就画在这个图 2 里,而且他这个图 2 里画的是一个时空的算子,也就是用来做视频理解的。但是我们先不管它是做 3D 还是 2D 的,如果我们只看这个结构一眼就可以发现,它就是一个自注意力操作。先是一个特征进来,然后通过这个 K、Q、V 对吧,Key、Query 和 Value Network,得到三个特征,那这三个特征全都是由自己变来的,然后 Key 和 Query 去做一下 Attention 操作就可到了一个自注意力,然后再拿这个自注意力去和这个 Value 做加权平均,然后得到最后这个值,之后还有一个残差链接,最后得到输出。所以说这完全就是一个标准的自注意力模块。这里只不过是为了适配这个视频理解,所以把 2D 的操作全都变成了 3D。鉴于咱们的论文精读系列之前已经讲过 Transformer 讲解视频,而且讲过 Vision Transformer 讲解视频,所以对自注意力大家都不陌生,那这里我就不再过多复述了。

图 2. 时空非局部块。特征图显示为其张量的形状,例如,T×H×W×1024 表示 1024 个通道(注意时进行适当的重塑)。“⊗”表示矩阵乘法,“⊕”表示逐元素求和。对每一行执行 softmax 操作。蓝色框表示 1×1×1 卷积。这里我们展示了嵌入式高斯版本,瓶颈为 512 个通道。vanilla Gaussian 版本可以通过删除 𝜃 和 𝜑 来完成,而点积版本可以通过将 softmax 替换为 1/N 缩放来完成。

 那我们先来看一下一些消融实验,这个消融实验很重要,因为这也体现了作者是怎么一步一步设计出来这个网络结构的。比如首先第一步就是这个自注意力该怎么算呢?

  1. 那作者就在这个表 a 里列出了几种方式,比如说到底是用 Gaussian 还是用 dot-product,还是直接 concat 一下,那最后发现使用 dot-product 这个效果是最好的,其实 Transformer 默认的也就是 dot-product
  2. 接下来确认使用 dot-product 来做这个自注意力之后接下来一个问题就是说我们怎么把这个 Non-local Block 插入到已有的网络之中呢?那像之前作者在摘要里已经说了,因为这是一个 Plug and Play 的,就是即插即用的,所以你插在哪里都可以,那作者这里先做了简单的尝试,就是我先加一层这个 Non-local Block,我先试一试把它加在哪里最好。 他就在每一个 Res Block 后面,因为对于一个 ResNet,它有 4 个 Block,Res 2、3、4、5,4 个 Block。他就尝试要么在 2 后面加个,要么就在 3 后面加一,看看到底加在哪个 Block 上效果最好。然后作者就发现加在 2、3、4 上的效果不错,加在 5 上的效果不太行。作者就觉得加在 5 上不太行的原因是因为 5 这个特征图太小了,它已经没多少空间信息在里面了,这也没有什么远距离的特征可以学,那这个 Non-local 这个操作就起不到应有的作用。然后呢又因为自注意力操作比较贵,所以作者也不想再 Res 2,就是特别早的特征出来的时候去做 Non-local 操作。所以作者最后就决定在这个 Res 3 和 Res 4 上去做这种 Non-local 的操作。
  3. 那接下来又有新的问题了,那就是之前你给整个网络里就加了一个 Non-local 操作,那这个 Non-local Block 肯定是加的越多越好嘛,因为就相当于你在每一层都做这种远距离的建模。所以作者这里的问题就是说,我到底加多少才好呢?所以他就试了一下加 1 个 Block,加 5 个 Block 和加 10 个 Block。那这里 10 个 Block 的意思就是说在 Res 3 和 Res 4 这两个阶段之中所有的卷积后面都加了一个 Non-local Block。因为我们也知道这个 Res50 这个网络它的层数分别是 3、4、6、3,所以中间这个 Res 3 和 Res 4 对应的是 4 和 6,所以它一共有 10 个卷积层,也就是说对应的 10 个卷积层后面都有一个 Non-local Block,那最后就是有 10 个 Non-local Block。那这个 5 个 Non-local Block 就是隔一个来一个,隔一个来一个,所以说刚好就是 5 个。那对于 Res 101 来说呢,虽然它后面的这个层数更多,但它就是隔的多一点,还是 5 个 Block 和 10 个 Block。那作者就发现,确实是更多的 Non-local Block 带来的效果提升更多,也就意味着自注意力这个操作是真的有用,尤其是在这个视频里面。
  4. 那接下来这个消融实验只要是为了证明作者新提出的这个 Spacetime Non-local 到底有没有用,因为有的人可能会质疑这个 Self Attention 本来提出就是在这个特征图上去做,有可能只用在 Space 上做这个 Self Attention 就可以了,你没必要做这种 Spacetime 上的这个 Self Attention,那作者在这里就把它们拆分开来了,就是说我光在空间上去做自注意力会怎样,光在时间上去做自注意力会怎样,那或者我在这个时空上去做自注意力会怎样。然后作者就发现在时间和空间上去做这个自注意力一样重要,有的时候甚至在时间上去做这种自注意力比在空间上做更有效。如果你在两个上面都做,它的结果是最好的。所以就证明了这篇论文提出的这个时空自注意力才是对视频理解更有效的方法。
  5. 最后我想大概提一下的表格也就是这里的表格 g 了。也就是利用更长的视频输入会怎样。因为他这篇论文从头到尾讲的就是说如果我能有更长的上下文效果会不会更好,那如果你这个 Non-local 的目的就是为了抓住更长的上下文之间的信息,那你的输入只有 16 帧或者 32 帧,那也就是 1 秒的话其实也不长,你也没有什么长距离信息可以抓住的,所以作者这里就是说我一定得找一个更长的时间序列输入来证明一下 Non-local 到底有没有用。而事实上,对于一个 128 帧的输入,也就大概 4 秒多,Non-local 这个方法还是能持续提高这个模型的性能,而且提升的还是非常显著的,也就侧面说明了 Non-local 对这种长距离的这种时序建模是更有好处的。

表 2. 动力学动作分类的消融。我们展示了 top-1 和 top-5 分类准确率 (%)。

 那说完了消融实验,最后我们来看一下结果,因为这个时候已经是 I3D 之后了,所以大家主要的结果都是在 K400 这个数据集上去做比较。那我们可以看到这里这个表 3 其实非常的小,总共对比的方法也就只有 I3D [7] 还有之前的另外一篇论文 [3],为什么呢?因为之前讲过那么多方法,它们的结果全都是在 UCF101 和 HMDB 51 上做的,它们都没有 K400 上的分数,所以作者这里也没法比,总不能把之前所有的方法全部复现一边吧。所以这里能比的就只有这两种方法了。那我们可以看到如果拿 Non-local 的 I3D 去跟这个 I3D 去做对比的话,它有两个区别,一个就是他把这个 Backbone 给换了,是把 Inception Net 换成了 ResNet,这个改变大概带来了 1 个点的提升。然后加上 Non-local 呢,又带来了 2、3 个点的提升,所以最后从 72.1% 到 76.5% 大概就有 4 个多点的提升,提升也是非常显著的。而且我们可以看到用上 Non-local 之后它的这个结果甚至比之前双流 I3D 的结果还要好一点。这其实也就给做 3D 网路的人信心,就说我不用光流我照样效果很好。然后 Non-local Network 如果换成了 Res101 当这个 Backbone,它最后的结果就有 77.7% 那么高。这已经是非常高了,我们可以看到比之前 [3] 里面的方法(它不仅用了 Inception ResNet v2 一个更好更强的结构,而且还用了三个模态,就是说 RGB 图像、Flow 图像和这个音频信息),那全都用的情况下也就是 77.7%。

表 3. 与动力学中最先进的结果的比较,报告了验证集和测试集。 我们包括了 Kinetics 2017 竞赛获胜者的结果 [3],但他们的最佳结果利用了音频信号(以灰色标记),因此不是纯视觉解决方案。 †:“avg”是top-1和top-5精度的平均值; 在提交此手稿时,测试服务器无法提供个别前 1 或前 5 的号码。

 所以说 Non-local 这个操作真的非常有效,那这篇论文的贡献就是把这个自注意力操作引入了视觉领域,而且针对这个视频理解任务它还把这个 Space 自注意力操作变成了 Spacetime 时空上的自注意力操作,而把这个视频理解上的几个任务分都刷的很高,而证明了它的有效性。那在这片论文之后就更少有人去使用 LSTM 了,因为在 NLP 那边大家也是使用 Transformer 而不是使用 LSTM,那在 CV 这边自从有了 Non-local 算子,大家也不用 LSTM 了,那作者的愿望也就实现了。作者最后说他们希望 Non-local 这个层能够成为一个重要的神经网路组成部分,之后的这个网络结构都能用到它。那确实,不管在最后的这个网络设计上,还是在这个下游任务上,Non-local 这个算子是有巨大的影响力的。

2018-CVPR-A Closer Look at Spatiotemporal Convolutions for Action Recognition

论文地址

 那说完了 Non-local 这篇论文,接下来我们讲一篇同期的,也就是 CVPR 2018 的另外一篇论文,就是 R(2+1)D。论文的题目就是说对于这个动作识别来说,他们做了一个详尽的调查,那调查的是什么呢?就是这种时空卷积到底该怎么做最好。到底是用 2D 还是用 3D 还是 2D+3D,还是怎么串联或者并联一下,总之是一篇非常实验性的论文。

 那作者在摘要里其实也说了,他们这篇论文的研究动机是什么,就是说他们发现如果用这种 2D 的网络,然后再视频上一帧一帧去抽特征结果也很好,至少在这个动作识别领域来说他们这个结果还是表现的相当不错的,并没有比 3D 网络低多少。那这篇论文的作者就想,既然 2D 网络表现得也这么好,那如果能用一下 2D 或者部分用一下 2D 卷积其实也是非常不错的,毕竟 2D 卷积比 3D 卷积便宜太多了。

 这篇文章整个就是在测试各种各样的结构,一会我们在这个图里面也可以看到,到底是先 2D 再 3D 还是先 3D 再 2D,还是说把这个 3D 拆分成 1D+2D 的结构。那作者就发现了,把这个 3D 卷积拆分成空间上的 2D 和时间上的 1D 最后能得到更好的效果,而且这个训练也简单了很多。然后在得到一个更优的结构之后,他们在很多数据集上都取得了更好的结果,包括比较大的 Sports-1M 和 K400,以及之前的小一些的 UCF101 和 HMDB51。那具体来说,作者就是在这几个方式上去做了这个消融实验,看看到底哪种组合最好。

  1. 那首先第一种就是纯 2D 的网络 R2D。它的意思就是视频中的每一个帧,一帧一帧这么过去抽特征或者做训练。那完全是一个 2D 网络。
  2. 那对于第二种这个 MCx 方法来说呢就是一个头重脚轻的方法。就是说我先有一个视频剪辑(Clip)进来,然后我通过这个 3D 卷积去做,先是在底层上学一学这个时空特征,然后到上层我换成这个 2D 的,然后把这个计算复杂度降一下,但是因为 2D 比较便宜嘛,所以我说它是头重脚轻。
  3. 那很显然对第三种结构 rMCx 来说呢就肯定是头轻脚重了。那就是说我先刚开始的时候把一个视频 Clip 拆分成每一帧,然后我一帧一帧输入到 2D Conv,得到这些 2D Conv 出来的特征之后我再用这个 3D Conv 去做一些融合,最后出结果。
  4. 那第四种当然就是说全部都使用 3D 网络了,那这一就是 C3D、I3D 这一系列网络的做法,包括 CVPR 2018 还有一篇叫 R3D 的网络就纯粹使用 ResNet 的一个 3D 版本。
  5. 那最后这个 e,这个 R(2+1)D 结构就是这篇论文提出的结构,也就是说他把这个 3D 卷积拆分成了两个卷积,先做一个 2D 上的 Space 上的卷积,然后再做一个 1D 的时间上的卷积。那作者就发现他们的这种效果是最好的。

图 1. 本工作中考虑的视频分类残差网络架构。(a) R2D 是 2D ResNet; (b) MCx 是具有混合卷积的 ResNet(MC3 显示在该图中); (c) rMCx 使用反向混合卷积(此处显示 rMC3); (d) R3D 是 3D ResNet; 和 (e) R(2+1)D 是具有 (2+1)D 卷积的 ResNet。为了可解释性,省略了剩余连接。

 那接下来我们就具体看一下结果,看看到底哪一个设置会更好。

  1. 那首先我们看一下这个参数量,从参数量上来看,如果纯用 2D 的这个网络肯定是更便宜的,所以我们可以看到它的这个参数量都明显小很多。但是其它使用了 3D 网络的明显参数量就上去了。
  2. 第二个呢,就是我们从这个实验结果上来看,实验结果很明显如果只使用 2D 网络的这个结果是最差的,纯用 3D 网络的结果也不咋样。反而是这种 2D、3D 混合用的结果还不错。如果是头重脚轻也有将近 50% 的效果,要好一些。
  3. 那最后就是这篇论文提出的 R(2+1)D,就是这种拆分结构的形式,它的参数量目的是为了和之前的 3D 网络保持一致,但是效果好了非常多。无论是在短一点的视频上还是长一点的视频上,它的效果都比之前所有的这些设计都要好。

表 2. Kinetics 验证集上不同形式卷积的动作识别准确度。所有模型都基于 18 层的 ResNet,并在 8 帧或 16 帧剪辑输入上从头开始训练。R(2+1)D 优于所有其他模型。

 那其实对于网络结构设计的探索也不光是 R(2+1)D 这一篇论文在做,之前也有 R3D 这篇论文在做,然后在它之后也有 P3D 这篇论文在做,然后在它之后也有 S3DECO 这两篇论文也都是用类似的方法在做的,尤其是 S3D 和 ECO,它们都提出了这种头重脚轻或者头轻脚重的方式然后去做消融实验。所以说大家的想法其实也都是差不多的。

 可能读到这里很多同学还是不知道什么是 R(2+1)D,到底什么叫拆分,那作者这里其实在图 2 里画了一个简单的示意图,那意思就是说你用一个 t×d×d 的一个卷积核,当然你可以是 3×3×3,但是你这个时间上和空间上可是不一样的。然后 R(2+1)D 的方式就是说把这个 3D 给拆分了,我现在空间上做这种 2D 的卷积,就是在这里时间维度是 1,什么操作都不做,然后在空间上去做 d×d 的卷积,然后中间做一层特征投射,把这个维度变化一下,这里之所以变化这个维度是想让 R(2+1)D 最后一个网络参数和 R3D 这个纯 3D 网络的参数保持一致,这样子就能做这种公平的对比来显示 R(2+1)D 网络的优越性。那至于这里的维度 M i M_i Mi 是怎么算的,他在论文里也展示出来了,用这个公式( M i = ⌊ t d 2 N ( i − 1 ) N i d 2 N ( i − 1 ) + t N i ⌋ M_i=⌊\frac{td^2 N_(i-1) N_i}{d^2 N_(i−1)+tN_i}⌋ Mi=d2N(i1)+tNitd2N(i1)Ni)去算的。这样能够尽可能的逼近 R3D 的网络参数。那一旦做完这个特征投射之后他接下来就做了一个 t×1×1 的时序上的一个卷积,那这里只在时间上做了一次卷积,后面空间上还是 1×1 没有做什么操作的。就是通过这种方式把一个 3D 的卷积拆分成了一个顺序的、先做空间再做时间的卷积形式。

 作者这里也说了两点这种拆分形式为什么比原来纯使用 3D 的网络好。

  1. 原因一就是增强了网络的非线性,因为你原来如果只有一个 3D Conv 的话,你后面就只接了一个 ReLU 激活层,所以你只做了一次非线性操作,但你现在做了两次卷积,那你每个卷积后面都有一个 ReLU 激活层,你就有两次非线性变换,那它的学习能力也就增加了。
  2. 那第二个好处就是从优化的角度来看如果你直接去学一个 3D 卷积的话是不好学的,那如果你把它拆分成一个 2D 和 1D 来说,它就相对容易优化一些

图 2. (2+1)D 与 3D 卷积。插图是针对简化设置给出的,其中输入由具有单个特征通道的时空体积组成。(a) 使用大小为 t×d×d 的过滤器执行全 3D 卷积,其中 t 表示时间范围,d 是空间宽度和高度。(b) (2+1)D 卷积块将计算拆分为空间 2D 卷积,然后是时间 1D 卷积。我们选择 2D 过滤器 (Mi) 的数量,以便我们的 (2+1)D 块中的参数数量与完整的 3D 卷积块中的参数数量相匹配。

 作者在图 3 里也展示了一下训练和测试的误差,就是拿 R(2+1)D 和 R3D 做了一个对比。我们可以看到,不论是对浅一点的网络,就是 R3D-18 或者 R(2+1)D-18,就是只有 18 层,还是说对于一个深一些的网络 R3D-34 和 R(2+1)D-34 来说,它这个结论都是统一的,就是你用上 R(2+1)D 这种拆分式的结构之后,你不论是训练的误差还是测试的误差都比原来的 R3D 要低一些的,也就证明了这既不是过拟合也不是欠拟合,这就简单的证明了模型是更容易训练的

图 3. R(2+1)D 和 R3D 的训练和测试错误。报告了 18 层(左)和 34 层(右)ResNet 的结果。可以观察到,与 R3D 相比,R(2+1)D 的训练误差(细线)更小,尤其是深度较大的网络(右)。这表明 R(2+1)D 实现的时空分解简化了优化,尤其是随着深度的增加。

 那说完了 R(2+1)D 到底是怎么做拆分的,也做完了消融实验,最后就是看一下结果。

 我们首先看一下 K400 上的结果对比,那同样的因为 R(2+1)D 这篇论文是 CVPR 2018 的,所以在它之前也只有 I3D 这一片工作在 K400 数据集有分数,所以它就只能跟 I3D 去比。这里面还是有一个比较有意思的现象,就是说 R(2+1)D 不论是在 RGB 上还是 Flow 上的结果都比对应的 I3D 要高一些。但是当你做最后的 Late Fusion,就是当你把这两个结加权平均之后,你会发现 I3D 的提升非常明显,反而是这个 R(2+1)D 没什么提升,所以导致双流 R(2+1)D 的结果还不如双流 I3D 的结果,不过这里作者也没有给出解释。

表 5. 与最先进的动力学比较。当在 RGB 上从头开始训练时,R(2+1)D 比 I3D 高出 4.5%。对于 RGB 和光流,在 Sports-1M 上预训练的 R(2+1)D 优于在 ImageNet 上预训练的 I3D。但是,在融合两个流时,它比 I3D (0.3%) 稍差。

 另外我们看一下在 UCF101 和 HMDB51 上的结果,同样我们可以看出 R(2+1)D 的表现还是不错的,但是如果跟 I3D 去比还是有比较奇怪的现象。它索然在 RGB 上比 I3D 的RGB 要高,但是它在 Flow 上就已经比 I3D 的 Flow 要低了,然后再把这两个加起来之后呢,它的结果就更低了。那作者这里可能觉得这样不行,在 K400 上已经比 I3D 低了,那如果在 UCF101 和 HMDB51 上再底就不好跟审稿人交代了。所以他这里还稍微解释了一下,他说我们的模型是光在 K400 上去做预训练的,但是上面的 I3D 模型实在 ImageNet+K400 上去做与训练了,它们比我多用了 ImageNet 的预训练,所以他们比我高是理所当然的。但是事实上这句话可能不太成立,因为我们之前精读过 I3D 这篇论文,我们就会知道 I3D 那片论文里也做了单独用 K400 去预训练模型的结果,而且事实上最后这里的结果应该是 97.8% 和 80.9%。所以丝毫不比用了 ImageNet 要差的,反而有可能再 HMDB51 上是更好的。所以这就意味着 R(2+1)D 这个模型在效果上是不如 I3D 的。当然我觉得这件事是情有可原的,毕竟 R(2+1)D 输入是 112×112 的,比原来 I3D 的 224×224 效果低一点也没什么,而且 R(2+1)D 的这种拆分模式确实有助于模型的训练,确实有助于降低过拟合。而且它不需要借助 ImageNet 的与训练,是可以从头自己开始训练的。而不是像 I3D 一样借助了 2D 模型的与训练参数才导致比较好优化。这个网络本身的结构也是非常值得学习的。

表 6. 与 UCF101 和 HMDB51 上的最新技术的比较。我们从 Kinetics 微调的 R(2+1)D 几乎与 I3D 相当,然而,除了 Kinetics 之外,I3D 还使用 ImageNet 进行预训练。我们发现 Kinetics 在预训练我们的模型方面优于 Sports-1M。

 那在前两年对比学习或者说自监督学习在视频领域里也比较火的时候,很多人都是采用 R(2+1)D 当做这个网络的 Backbone。去做这种视频的自监督训练一个很重要的原因也是因为它比较好优化,而且呢他的一个输入是 112×112,也比较小,对 GPU 内存比较友好。

 接下来我们还会讲到 Timesformer 这篇论文其实也与 R(2+1)D 这篇论文作者的想法上比较类似,就是把一个 Spatial-Temporal 的一个 Transformer 拆分成了在空间上和时间上分别去做这个自注意力操作,这样子就大大简化了对显存的要求,从而在视频上也能训练起一个 Vision Transformer。

总之呢,R(2+1)D 这篇论文当你读完后就会发现它是一个纯实验性的论文,它的主要贡献就在与它的消融实验,以及它给你的各种观察和简介,从而能够帮助你理解视频领域不同架构之间的区别和联系,以及到底该怎么去构建一个适合于视频理解的模型框架。

2019-ICCV-SlowFast Networks for Video Recognition

论文地址

 那 3D 网络最后呢,我们来看一下 SlowFast 这篇论文。那作者又是我们熟悉的一帮人。这篇论文其实是 3D 网络里结合精度和效率比较好的一个工作,它的想法也很简单也非常有意思。其实有点借鉴双流网络的思想,但是并没有用光流作为模型的输入,它还是一个单纯的 3D 网络。

 作者在文章中说他们的研究动机来源于视觉系统有两种细胞,一种叫 P 细胞,另一种叫 M 细胞。P 细胞的数量是比较多的,占到视觉细胞的 80%,它主要处理静态图像,所以说当前这个图像里这个场景是什么信息它要描绘的非常具体,P 细胞是干这个的。M 细胞是处理运动信息的,它能处理这种高频率的运动信息,它占这个视觉细胞的 20%。所以作者就想了想,他觉得这个跟双流系统也有点像,就是有一支是处理动态信息,一支是处理静态信息。那 3D 这边我也可以这么设计一下,所以就有了 SlowFast 这个网络。

SlowFast 顾名思义就是有一支网络是 Slow 的,有一支网络是 Fast 的。具体是怎么个 Slow 和 Fast 法呢?

  1. 那假如说我们现在有一个视频,这个视频有 64 帧。那就差不多 2 秒多,如果我们现在先用很低的帧率,比如说每隔 16 秒取一帧,取出来的 4 帧的这一支就叫慢分支,它就像那个 P 细胞一样主要学习静态图像,主要学习这个场景信息的。那因为 P 细胞它占了整个视觉细胞的 80%,所以这里面作者就觉得这个静态图像的描绘也比较难,所以他也想把大部分模型的参数给这个慢分支,所以说这个慢分支网络结构是比较大的。简单来说其实他就是一个 I3D 网络,但是因为给这个大的 I3D 网络的输入只有 4 帧,所以相对而言它的计算复杂度不是太高。
  2. 然后就到了底下这个快分支,那快分支就是说你有 64 帧,我就用很快的帧率去取样,最后我得到 16 帧输入给这个快分支,那现在因为你这个输入变多了,我为了维持这个模型的计算开销,我就要让这个快分支的网络尽可能的小,这样就模拟了视觉里的 M 细胞,它只占整体的 20%,主要就是描述运动信息,因为你描述运动信息,所以你需要更多的帧,然后这样能快速看出来它们之间的改变。

 所以整体上看 SlowFast 也是一个两分支的结构,跟双流网络一样。然后上面这个是慢分支,下面这个是快分支,慢分支用小输入但是大网络,快分支用大输入和小网络。然后两个分支之间还用这种 Late Connection 把它们都结合起来,所以它们之间的信息是可以交互的,从而能够更好的学习到空间特征。最后达到了一个比较好的精度和速度的结合。

图 1. SlowFast 网络具有低帧率、低时间分辨率的 Slow 通路和高帧率、𝛼× 更高时间分辨率的 Fast 通路。Fast 通路通过使用一小部分(𝛽,例如 1/8)通道实现轻量化。横向连接将它们融合在一起。

 那看完图 1 之后呢,其实大家基本上已经知道 SlowFast 的这个网络到底是什么结构了,那接下来我们就具体来看一下这个表 1,从头到尾走一遍这个前向过程,看一看这个输入输出的大小就能更形象的了解这个网络。首先呢左边这个是慢分支,右边是快分支,这个就是它们输出的大小。

  1. 首先我们来看一下网络,网络我们刚才也说了这个慢分支其实就是一个标准的 I3D 网络,这里就是一个 ResNet,我们也可以看到有 Res 2、3、4、5,4 个 Stage,这里面就是 Res50,所以有 3、4、6、3 这么多个 Residual Block。所以说这个慢分支本身就是个 I3D,非常标准。
  2. 然后对于快分支,作者就是把这几个数字变成黄色了,他之所以变成黄色就是想让你看一下慢分支和快分支这个通道数的对比,我们可以看到快分支的通道数是远远小于慢分支的通道数的,也就意味着这个快分支是非常轻量的。但整体结构快分支跟慢分支也是一样的,也是一个残差网络,也是 3、4、6、3 这么多 Residual Block。

 那看完网络之后我们就来过一下这个前向过程,首先输入是 64 帧,每个帧是 224×224 这么大,那对于慢分支来说每隔 16 帧取一帧,所以这个慢分支的输入只有 4 帧,但是快分支它这里其实是每隔 1 帧就取 1 帧,所以取了 32 帧,比我刚才说的 16 帧还要多一倍。所以说这个快分支的输入是相当大的,这也是为什么作者一定要把这里的通道数减小的原因,否则这个计算开销实在是受不了。然后我们可以看到这个 SlowFast 跟之前 I3D 网络还有 R(2+1)D 网络一样,它们都没有在这个时序上进行下采样,你的输入是 4 帧,那接下来都是 4 帧、4 帧、4 帧,一直到最后也是 4 帧,你的快分支输入是 32 帧到最后还是 32 帧。所以他在这个时间维度上始终不做下采样,因为他想尽可能的保持这么多帧去学习更好的时序信息,因为本身就不多,他这个下采样全都是在这个空间维度做的,从刚开始的 224 然后降到 112、56,然后 24、14,然后到最后的 7,那最后再接一个全局平均池化,然后再接一层 fc 就可以直接做输出了。

 值得一提的就是在每一个 Resdual Block 后面都有一个 Late Connection,其实就是一个简单的链接,能让这两个分支之间进行简单的信息交互,从而更好的学习时空上的特征。

表 1. SlowFast 网络的实例化示例。内核的维度用 {𝑇×𝑆^2, 𝐶} 表示,表示时间、空间和通道大小。步幅表示为 {temporal stride, spatial stride2}。这里速度比为 𝛼=8,通道比为 𝛽=1/8。𝜏 为 16。对于 Fast 通路,绿色标记更高的时间分辨率,橙色标记更少的通道。非退化的时间过滤器带有下划线。剩余块用括号表示。主干是 ResNet-50。

 因为 SlowFast 这篇论文的想法确实比较直接了当,所以我们这里呢就直接看结果了。当然 SlowFast 它还做了这个视频分类、视频检测好几个数据集,它的结果都是非常好的,那我们这里就简单看一下 K400 上的效果就可以了。那到 ICCV 2019 的时候 K400 已经提出有两年时间,所以我们可以看到这里面有很多之前的工作在 K400 上汇报了。

 分数我们首先可以看到作者把最上面的区域给灰色化了,因为作者觉得这些模型全都利用了 ImageNet 预训练,他没办法从头训练,但是对于接下来这些模型,比如说我们刚才讲的 R(2+1)D 还有这篇 SlowFast,它都是可以从头训练的,不需要任何的预训练模型。当然了,它训练的 epoch 数量会非常多,需要 196 个 epoch。训练的时间也非常长,8 卡的机器也需要训练十几天。所以说不用 ImageNet 预训练参数也不见得是一件好事。

 那接下来我们看一下结果,SlowFast 这篇文章不光卖这个精度,他更主要的是想说他们这个模型是非常高效的。他们这里还加了一列专门做 GFLOPs 的,那向他最小的这个 SlowFast 的 G’FLOPs 只有 36.1,如果更上面这些 3D 模型去比的话,可以发现它是非常小的,而且 SlowFast 随着使用的帧数越来越多,用的模型越来越大,或者说也用了 Non-local Block 之后呢,它的性能会一直增长到最后的 79.8%,这个也比之前的方法统统都要高。而且这个也算是 3D 网络在 K400 数据集上最好的表现了。

表 2. 与 Kinetics-400 上的最新技术的比较。在最后一列中,我们报告了单个“视图”(具有空间裁剪的时间剪辑)× 使用的此类视图的数量的推理成本。SlowFast 模型具有不同的输入采样 (𝑇×𝜏) 和主干 (R-50 , R-101, NL). “N/A ”表示我们无法使用这些号码。

3D 网络小结

 那 3D 网络这部分我们就算过完了,当然了,还有很多优秀的 3D 网络的工作我没有时间去设计,而且还有一些有趣的工作,它既不用光流也不用 3D 网络也能比较好的、高效的把这个视频理解做了。比如我(朱毅老师)之前就有一篇论文叫 Hidden Two-Stream Convolutional Networks,就是把光流的学习融入到网络之中了,这样不论是在训练的时候还是在推理的时候我们都不需要去抽取这个光流,抽光流这个步骤就在网络之中,所以是比较高效的。然后要有另外一篇论文 TSM: Temporal Shift Module,ICCV 2019 的一篇论文,他就是把 Shift 这个操作用到了视频理解里,能让一个 2D 网络媲美一个大的 3D 网络,而且在很多任务上效果都非常的好。而且因为是 2D 网络,所以比较方便去部署,作者在官方代码还提供了一些首饰检测的 demo,非常有意思,感兴趣的同学也可以去试一下。总之呢 3D 网络从 17 年 I3D 火了之后呢,就一直霸占这个视频理解领域一直到2020年,然后自从有了 Vision Transformer,大家这个注意力又全都转移到这上面了。

2021-ICML-Is Space-Time Attention All You Need for Video Understanding

论文地址

 所以说,这就到了我们今天要讲的第四个部分,Video Transformer。咱们把在图像上用的比较好的 Vision Transformer讲解视频)能移植到视频领域来做一个视频的 Vision Transformer。那 Video Transformer 我们就准备讲一篇 Timesformer,也是最早的一篇把 Vision Transformer 用到视频理解领域的一篇论文。

 它这个题目也是让人一看就懂,时空注意力是不是 All You Need。这个就跟 2017 年的 Transformer讲解视频)的原文是一样的,自注意力是不是 All You Need。

 这篇论文在我们之前讲 R(2+1)D 时候也说过跟 R(2+1)D 的作者团队差不多也是一篇比较实验性的论文,就是探索了一下怎么把 Vision Transformer 从图像领域迁移到视频领域里来。那具体来说作者就尝试了 5 中种结构。

  1. 那第一种结构 Space Attention,就是只在这个空间特征图上去做这种自注意力,那这个其实就是在图像里 Vision Transformer 用的这个自注意力。意思就是说你一个特征进来,做一次空间自注意力,然后再接一个 MLP,然后通过残差链接最后得到这个输出。
  2. 那这个就是说怎么用在视频上?那首先视频上第一个就是我暴力的去使用对吧,我就是给一个视频,那我就在这个视频三个维度通通去做这个自注意力操作。也就是这里说的这个 Joint Space-Time Attention。那这样一个输入进来过一个时空注意力再过一个 MLP,然后通过残差链接就得到最后的输出了。但这种方式我们肯定就能想到 GPU 内存肯定塞不下。那图像那边 Vision Transformer 都快塞不下了,更别提你现在把这个视频,30 帧、60 帧扔给一个 Vision Transformer,你在三个维度上去算自注意力,它肯定是塞不下的。
  3. 所以你一旦这个 GPU 塞不下那该怎么办呢?那其实就像 R(2+1)D 做的一样,你 3D 塞不下我把你拆成 2D+1D 就行了。那这里了其实还是同样的套路,那既然你一个 3D 的时空注意力你做不动,那我就先在时间上去做自注意力,然后再在空间上再做自注意力不就行了嘛。所以说就按照这个 R(2+1)D 的方式,作者就提出了他们这篇论文里的这个 Divided Space-Time Attention,就是把时空分开来做。这里他没有用 Factorize 而是换了个词成 Divided。但其实都是一个意思,具体做法就是你一个特征进来,那我现在时间维度上给你做一下自注意力,然后残差链接,然后我再在空间上去做一下这个自注意力,然后通过一个 MLP 得到最后的输出。这样这个计算复杂度就大大降低了,因为你每一个序列长度都变得很小。
  4. 当然除了这种时间和空间上的这种拆分之外你还可以有很多别的拆分方式。比如之前大家常用的这种 Local Global 的形式,就是既然你全局的序列长度太长,你没法算,那我就现在局部算,算好了以后我再在这个全局上去算。其实这个就有点 Swin Transformer讲解视频)、Video Swin Transformer 的意思。我在一个局部的一个小窗口里去算自注意力,它的计算复杂度也会变得很低,所以说这里我先一个特征进来,我先算局部特征,然后我再去全局算特征,那这个时间复杂度就会降低。
  5. 最后一种也就是这个 Axial Attention,就是说我只沿着你特定的这个轴去做 Attention,这个之前我们再讲 Vision Transformer 的时候也提到过,就是说我一个特征进来,我先沿着这个时间轴去做自注意力,然后我再沿着这个横轴,就是这个图像的宽去做自注意力,然后再沿着这个图像的高度(竖轴)去做自注意力。那意思就是说把一个三维的问题拆成了三个一维的问题,那这个复杂度一下子也会降的很低很低。

图 1. 我们在这项工作中调查的视频自注意力模块。每个注意力层在帧级补丁的指定时空邻域上实现自注意力(V aswani 等人,2017b)(邻域的可视化请参见图 2)。我们使用残差连接来聚合来自每个块内不同注意力层的信息。在每个块的末尾应用 1 个隐藏层 MLP。最终模型是通过将这些块反复堆叠在一起构建的。

 但总之你一看这个图你就会立马联想起来跟 R(2+1)D 这篇论文的联想。R(2+1)D 也画了 5 个图,分别讲了这个 2D 跟 3D 该怎么融合,到底哪种结构好,那这篇 Timesformer 他们也画了 5 个图,讲了讲 Vision Transformer 怎么用到视频里来,套路是非常相似的。然后反正是实验性论文,可以写的方法部分并不多。这作者为了让这个读者更好理解,所以把刚才的 5 个图又用可视化的方式展现了出来,形象的告诉你这五种自注意力的方式到底是怎么做的。这个图啊确实画的也很好。

  1. 首先我们来看单纯用这种图像上的空间自注意力,那意思就是说我们有前一帧 frame t-1,中间这一帧 fram t,和下一帧 fram t+1 的话,如果我们拿这个蓝色的 patch 当基准点,那其实它会跟谁去算这个自注意力呢?因为它就是一个图像自注意力,它不牵扯这个时间轴上的,所以它看不到前后两帧,它只是跟本帧上的所有别的 patch 去做这个自注意力操作。
  2. 那接下来的四种方法全是跟视频有一些关系了。比如说接下来这个在时空上一起做时空注意力的方式,那这个当然是最好的。因为我们可以看到,如果拿蓝色的 patch 当基准点,前一帧、这一帧和后面一帧所有的这个 patch 它都要去做自注意力。效果肯定是最好的,但是这个复杂度也是你承受不起的。
  3. 那我们就来看看后面三种简化方式是怎么做的。那第三种也就是他们这篇论文种主要提出的方法。这个 Divide Space-Time 自注意力。那同样我们还是以这个蓝色的 patch 作为基准,那先做这个时间上的自注意力,也就是它先做这个 patch 对应的前一帧的 patch(绿色)去做自注意力。然后同样呢,在下一帧的同样位置上这个 patch(绿色) 去做自注意力。也就是它们在做自注意力操作时,它跟前一帧剩下所有 patch 和后一帧剩下的所有 patch 都是不做自注意力的,没有关系。那做完了时间上的自注意力这一步,接下来就该做空间自注意力了。那这个空间自注意力就跟第一个 2D 空间自注意力是一样的,它跟这个图像里的所有别的 patch 都会去算一下自注意力。
  4. 那接下来第四种方式,这种先局部再全局的方式,就是说首先我先去算局部这个小窗口里面的自注意力,那如果我们拿蓝色的 patch 当基准点,那对于当前帧来说,我们就算这个小窗口里(黄色),那前一帧呢也是这个小窗口,后一帧呢也是这个小窗口。那算完了所有这个小窗口之后接下来就该算全局的了,全局的为了减少计算量,它就变得非常稀疏啊,所以也就是这些点(紫色)要去做自注意力操作的。
  5. 那最后呢就到了这个轴自注意力,那也就是说把一个三维问题变成了三个一维的问题。这里也非常形象,就说如果这个是基准 patch的话,它在时间上跟前后这两层绿色的去做自注意力,那它在横轴上是跟这个黄色的去做自注意力,在竖轴上是去跟紫色去做自注意力。那其实这个 Axial Attention 也就是这个 Divided Space-Time Attention 的一个极端情况。就是为了进一步减少消耗,那在当前帧上也不做所有 patch 的自注意力,而是专门选这个轴上去做,但这个效果肯定是会有 Trade Off 的。

 总之呢,作者就是详尽的把这些设计方案全都试了一遍,看看哪个设计方案最后的效果最好。最后就依据中间的这个 Divide Space-Time Attention 提出了他们这个 Timesformer 的架构。

图 2. 本工作中研究的五种时空自我注意方案的可视化。每个视频剪辑都被视为一系列大小为 16×16 像素的帧级补丁。为了便于说明,我们用蓝色表示查询补丁,并以非蓝色显示每个方案下的自注意力时空邻域。没有颜色的补丁不用于蓝色补丁的自注意力计算。方案中的多种颜色表示沿不同维度(例如,(T+S) 的空间和时间)或不同邻域(例如,(L+G))分别应用的注意力。请注意,self-attention 是针对视频剪辑中的每个补丁计算的,即每个补丁都用作查询。我们还注意到,虽然只显示了两个相邻帧的注意力模式,但它以相同的方式扩展到剪辑的所有帧。

 那我们简单来看一下这个消融实验,那这个消融实验的表 1 里就是把刚才说的 5 种设计方案全对比了一下,从结果上来看这个 Divide Space-Time 确实取得的效果是最好的。那在 K400 上单纯用 2D 的这种自注意力效果也不错,或者说 Joint 的这种时空自注意力效果也不错。但是单纯用 2D 的自注意力之所以效果好是因为 K400 这个数据集是一个比较偏重静态图像的,那如果我们换到 SSv2 数据集上,我们就可以看到光用这个 2D 的自注意力效果一下子就下降了很多,我们还是要把这个时间维度考虑上。所以说唯一表现比较好的就剩下这个 Joint Space-Time 和 Divided Space-Time 这两种方式。

表 1. TimeSformer 中不同时空注意力方案的视频级精度。我们在 Kinetics-400 (K400) 和 Something-Something-V2 (SSv2) 的验证集上评估模型。我们观察到,划分的时空注意力在两个数据集上都取得了最好的结果。

 但我们之前也说过这个 Joint 这种时空注意力的内存消耗是非常巨大的。作者也在图 3 里画了一下,就是如果我们把这个视频帧的大小变大,从 224 变成 336、448 或者更大,他们这个 Transformer 的计算量是基本上呈线性增长的。但是这个 Joint 的自注意力就会增长的非常快,尤其是后面这个灰色部分其实就已经是 GPU Out of memory 就已经爆显存了,其实是没办法训练的。那同样的道理,如果我们把这个输入加长,从 8 帧变成 32 帧一直到最后的 96 帧,我们可以看到这个 Joint Space-Time Attention 其实从 32 帧开始就已经爆显存了,你也是没办法训练的。

 所以最后总结下来就是说,即使这个 Joint Space-Time 它这个结果也不错,而且它这个参数量稍微少一点,但是因为它这个占用 GPU 显存实在是太大了,我根本训练不动,那最好的方案就只剩下这个 Divide Space-Time Attention 了。

图 3. 我们比较了联合时空注意力与分时空注意力的视频分类成本(以 TFLOP 为单位)。我们将 TFLOP 的数量绘制为以像素为单位的空间裁剪大小(左)和输入帧数(右)的函数。随着我们增加空间分辨率(左)或视频长度(右),与联合时空注意力方案相比,我们提出的划分时空注意力导致显着的计算节省。

 那最后看一下结果。首先我们来看一下这个表 2,作者这里就是对比一下 Timesformer 和之前的两种 3D 网络,I3D 是最经典的,SlowFast 是最新的,所以他就跟这两种做了一下对比,那其实这里可以发现如果单纯从这个准确度的角度上来说这个 Timesformer 不是太行,所以它这里用黑体 78% 说他们是最高的。但我们也知道这个 Slow-Fast 如果你换成 Res101 或者加 Non-local 之后,它的这个准确度已经到 80% 了。

 那作者这里为了突出使用这个 Vision Transformer 的好处,作者这里就发现他们这个训练时间和这个做推理的 FLOPs 都变低了。比如说训练时间的话,Slow-Fast 一个 Res50 就要训练 6000 多个小时,但是他们这个 Timesformer 只需要 400 个小时,把这个 Vision Transformer 拿来做微调确实效果非常好。那推理上呢,因为 Transformer 需要的这个输入更少,所以他推理的时候用这个 TFLOPs 也更低。也就是说从效率角度而言 Timesformer 是优于之前的 3D 网络的。

表 2. 将 TimeSformer 与 SlowFast 和 I3D 进行比较。我们观察到,尽管 TimeSformer 具有更多参数,但其推理成本更低。此外,与 SlowFast 和 I3D 相比,在视频数据上训练 TimeSformer 的成本要低得多,即使所有模型都在 ImageNet-1K 上进行了预训练。

 但是大家也知道,CV 领域的人一般只认效果不太认这些效率这些东西,所以说作者肯定还是得刷一刷分的。那作者就把这个 Timesformer 变得更大,用了 Timesformer Large,然后又在 ImageNet-21K 上去做预训练,最后还是把 K400 刷到 80% 以上了,那这样子的话别人就无话可说了,这个效果确实是最好的。在 SSv2 上效果也不错。

表 3. 比较 ImageNet-1K 和 ImageNet-21K 在 Kinetics-400 (K400) 和 SomethingSomething-V2 (SSv2) 上的预训练效果。在 K400 上,与 ImageNet-1K 预训练相比,ImageNet-21K 预训练始终带来更好的性能。在 SSv2 上,ImageNet-1K 和 ImageNet-21K 预训练导致相似的精度。

 总之呢作为第一篇把 Vision Transformer 用到视频领域来,本文的结果其实已经算不错了。接下来很快啊,我们(朱毅老师)组也有一篇 VidTr 也是用类似的思想去做 Video Transformer 的;然后 FaceBook 那边还有另外一篇 MViTMViTv2 也是做 Video Teansformer 的,效果会更好;然后 Google 那边还有一个 ViViT 想法都差不多,都是把这种时空自注意力拆分,只不过用了拆分的方式不太一样。所以其他的这些工作我这里就不讲了。

那最后呢我们来总结一下这篇论文,那其实作者在这里也总结说他们的这个 Timesformer 有四个好处。

  1. 第一个就是想法非常的简单。
  2. 第二个呢就是效果非常好,在好几个这个动作识别的这个数据集上都取得了最好的效果。
  3. 第三个呢就是不论是训练还是在做推理的时候,它这个开销呢都是非常小的,这点对于视频理解来说还是非常具有吸引力的。
  4. 然后最后呢其实我并没有讲就是说这个 Timesformer 可以用于处理超过一分钟的视频,也就意味着说我们之后可以做这种长时间的这个视频理解了,这个其实视频理解里非常重要的一个部分,但是之前呢很少有工作做,因为确实这个训练成本各方面都非常的高,这个任务也比较困难,而且也没有合适的一个数据集去做这种测试。

 所以说综合以上这些优点而且 Vision Transformer 们在视觉这方面大杀四方,这个扩展性稳健性都这么的好。我觉得接下来呢 Video Transformer 确实是大有可为。而且更重要的是,视频本身就是一个多模态的信号,它可能会有字幕啊这种文字信息,然后他可能会有这种音频信息,然后你如果从中抽取这种光流或者抽取这种深度图,它就是属于别的这种多模态信息。它自己就是一个非常丰富的输入来源,从中可以设计成各种各样的自监督信号。如果我们再和这个 Transformer 结合起来就有可能达到 CV 领域里面像 NLP 那样 Bert、GPT 时代!

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值