Classification,Detection
- Classification:给定预先裁剪好的视频片段,预测其所属的行为类别
- Detection:视频是未经过裁剪的,需要先进行人的检测where和行为定位(分析行为的始末时间)when,再进行行为的分类what。
通常所说的行为识别更偏向于对时域预先分割好的序列进行行为动作的分类,即 Trimmed Video Action Classification。
Two-Stream
Two-stream convolutional networks
简介
Two-Stream CNN网络顾名思义分为两个部分,
- 空间流处理RGB图像,得到形状信息;
- 时间流/光流处理光流图像,得到运动信息。
两个流最后经过softmax后,做分类分数的融合,可以采用平均法或者是SVM。不过这两个流都是二维卷积操作。最终联合训练,并分类。

如图所示,其实做法非常的简单,相当于训练两个CNN的分类器。一个是专门对于 RGB 图的, 一个专门对于光流图的, 然后将两者的结果进行一个 fushion 的过程。
-
RGB图的选择:
是对于所给的一段视频随机挑选出视频中的任意一帧; -
光流图的选择:
视频中的任意一帧的时间及其后面的N帧叠合成一个光流栈进入训练。这种光流的训练方式是论文作者认为,这样子的光流叠加可以获得它的运动信息流,但是实际上光流图并不是以motion的信息来得到结果。
那么什么是光流(Optical flow)?
optical flow是由一些位移矢量场(displacement vector fields)(每个矢量用dt表示)组成的,其中dt是一个向量,表示第t帧的displacement vector,是通过第t和第t+1帧图像得到的。dt包含水平部分dtx和竖直部分dty,可以看下图中的(d)和(e)。因此如果一个video有L帧,那么一共可以得到2L个channel的optical flow,然后才能作为Figure1中temporal stream convnet网络的输入。

上图中的(a)和(b)表示连续的两帧图像,(c)表示一个optical flow,(d)和(e)分别表示一个displacement vector field的水平和竖直两部分。
所以如果假设一个video的宽和高分别是w和h,那么Figure1中temporal stream convnet的输入维度应该是\(I_τ ∈ R^{w×h×2L}\)。其中\(τ\)表示任意的一帧。
文章实验了多种多帧画面的光流位移的输入,有:
1、 光流栈(Optical flow stacking)
光流栈(Optical flow stacking),或者叫做光流的简单叠加。简单的来说就是计算每两帧之间的光流,然后简单的stacking。式子1列出了分别得到水平和竖直方向的 \(I_τ\)的计算公式,其中\((u,v)\)表示任意一个点的坐标。因此$ I_τ(u,v,c) \(**存的就是**\)(u,v)$ 这个位置的displacement vector。关于光流算法具体求解,可以看:


2、轨迹叠加(Trajectory stacking):在基于轨迹的描述符的启发下,另一种运动表示法将在多个帧的相同位置采样的光流替换为沿运动轨迹采样的流。
顾名思义,轨迹叠加就是假设第一帧的某个像素点,我们可以通过光流来追踪它在视频中的轨迹,即用来描述一个对应特征点连续的光流变化。



因为这个双流法是训练了两个网络,在最后 softmax 前进行了fushion,显示效果不错。
对于长范围时间结构的建模无能为力
主要因为它仅仅操作一帧(空间网络)或者操作短片段中的单堆帧(时间网络),因此对时间上下文的访问是有限的。视频级框架TSN可以从整段视频中建模动作。
TSN
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卷积得到的是二维输出。

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

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种代表性模型结构

(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看上去是一种很自然的方法,能够直接对于时空数据创建高层表征
但这个模型有两个问题:
💡 相比于2D,参数更多,也就更难训练(因为数据量不足),所以之前3D ConvNet用的都是浅层的架构
由于都是三维的核,无法直接用在ImageNet上预训练过的网络,因此只能在video数据集上train from scratch。由于之前的数据集量都太小,因此效果不是太有竞争力。但这种方法可能会比较适用于大数据集 -
模型细节:是原论文中C3D的变种。8层卷积、5层pooling、2层全连接。与C3D的区别在于这里的卷积和全连接层后面加BN;且在第一个pooling层使用stride=2,这样使得batch_size可以更大。输入是16帧,每帧112112。
(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) New*: 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),还有最后的一个77的average-pooling层。在本文的实验中,作者发现:在前两个max-pooling层上,时间维度上的stride取1;而在别的max-pooling层上使用对称的stride(即时间维度上的stride和空间上的一致);最后的average pooling使用27*7的核
(e) Two 3D Streams
- 作者发现双流还是有价值的,可能因为3D ConvNet只有纯前馈计算,而光流提供了迭代的思想在里面
- 训练时,分别训练这两个网络,测试的时候在最后把两个流的预测结果做平均
实验对比

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(模块),所以可以用于各种任务,泛化性好。在视频分类、物体检测、物体分割、姿态估计等任务也都取得了不错的效果。