目录
2.1.1 时空关键点(space-time interest points)
2.1.2 密集轨迹(dense-trajectories)
1 背景介绍
近几十年来,随着神经网络的兴起,发展出了很多处理行为识别问题的方法。不同于目标识别,行为识别除了需要分析目标的空间依赖关系,还需要分析目标变化的时间顺序信息。这就为行为识别的问题增加了难度。视频分类/行为识别是计算机视觉领域中难度高、挑战性大的课题之一,因为其不仅仅要分析检测目标的空间信息,还要分析其时间维度上的信息,如何更好的提取出时空特征是解决此类问题的关键。本文总结了该领域的技术方法,技术方法从传统特征法到深度学习中较为著名的C3D、LSTM、Two-Stream、GCN以及基于Transformer的行为识别方法,其次有很多方法是在上述方法上演变而来,精力有限,故不能逐一介绍,内容参考部分网络内容,仅用于学习交流。
2 方法
2.1 传统有监督特征提取方法
传统的方法通过提取关键点的特征来对视频进行描述,以时空关键点,密集轨迹方法等为代表。
2.1.1 时空关键点(space-time interest points)
首先,时空关键点方法的核心思想是:视频图像中的关键点通常是在时空维度上发生强烈变化的数据,这些数据反应了目标运动的重要信息。比如一个人走路,腿一定会在前后帧中发生最大移动,其周围图像数据发生变化最大。而这个人的身体其他部位却变化很小,数据几乎保持不变。如果能将这个变化数据提取出来,并且进一步分析其位置信息,那么可以用于区分其他动作。
时空关键点的提取方法是对空间关键点方法的扩展,空间关键点的提取则是基于多尺度的图像表达,这里的时空关键点就是将2D Harris角点的检测方法拓展到了3D,具体方法及计算较为复杂,本文对此不做过多介绍。
除了harris,经典的2D描述子SIFT被拓展到3D空间,示意图如下:
上图从左至右分别展示了2D SIFT特征,多个时间片的2D SIFT特征,以及3D SIFT特征,后两者的区别在于计算区域的不同,3D SIFT的每一个关键点包含3个值,幅度和两个角度 :
统计关键点时空周围的梯度直方图就可以形成特征描述子,然后对所有的特征描述子进行k-means聚类,划分类别,形成词汇“word”。所有不同word就构成了一个vocabulary,每个视频就可以通过出现在这个vocabulary中词汇的数量来进行描述,最后训练一个SVM或者感知器来进行动作识别,除了以上的两种特征,还有HOG3D等。
2.1.2 密集轨迹(dense-trajectories)
时空关键点是编码时空坐标中的视频信息,而密集轨迹法iDT(improved Dense Trajectories)是另一种非常经典的方法,它追踪给定坐标图像沿时间的变化。
先简单介绍DT(Dense Trajectories)方法:利用光流场来获得视频序列中的轨迹,在沿着轨迹提取轨迹形状特征和HOF,HOG,MBH特征,然后利用BoF(Bag of Features)方法对特征进行编码,最后基于编码结果训练SVM分类器。
iDT算法主要思想:
(1)提升的密集轨迹算法主要考虑到相机运动,在帧与帧之间使用 SURF关键点描述子和密集光流进行特征点匹配,从而消除或者减轻相机运动带来的影响。在求得匹配点对之后,就可以利用RANSAC算法估计投影变换矩阵。
(2)人在视频帧中占主导地位,由于人的运动和相机运动不同,人身上的匹配点对使得投影矩阵的估计不准确,因此iDT算法采用human detector 检测人的位置框,进一步消除内部的匹配点对,从而使得人的运动不影响投影矩阵的估计。
iDT包含三个步骤:密集采样特征点,特征轨迹跟踪和基于轨迹的特征提取。
密集采样是对不同尺度下的图像进行规则采样,不过真正被用于跟踪等不是所有点,因为平滑区域的点没有跟踪意义,通过计算每个像素点自相关矩阵的特征值,并设置阈值去除低于阈值的特征点来实现这个选择。
对轨迹的追踪是通过光流,首先计算图像光流速率(ut, vt),然后通过这个速率来描述图像运动轨迹:
wt是密集光流场,M是中值滤波器,得到的一系列点形成了一个轨迹。由于轨迹会随着时间漂移,可能会从初始位置移动到很远的地方。所以论文对轨迹追踪距离做了限制,首先将帧数限制在L内,而且轨迹空间范围限制在WxW范围,如果被追踪点不在这个范围,就重新采样进行追踪,这样可以保证轨迹的密度不会稀疏。
除了轨迹形状特征,还提取了HOG,HOF(histogram of flow)以及MBH(motion boundary histogram)等特征。其中HOG特征计算的是灰度图像梯度的直方图,HOF计算的是光流的直方图,MBH计算的是光流梯度的直方图,也可以理解为在光流图像上计算的HOG特征,它反应了不同像素之间的相对运动。
提取出HOG等信息后,接下来的方法与时空关键点相似,不做过多赘述。
2.2 基于深度学习的方法
2.2.1 双流网络
其实在之前,DeepVideo已经将深度学习的卷积神经网络运用到了视频分类领域,但是相较于人工特征提取进行分类,效果还没有人格特征提取的效果好,所以slowfast——双流神经网络的提出就是为了改变这个现状。 它的主要成就就是让深度学习在视频分类这一块站稳了脚跟,它可以和当时最好的人工特征提取方法达成平手。
双流网络的论文《Two-Stream Convolutional Nets for Action Recognition in Videos》。
2.2.1.1 主要思想
在最开始的时候,也就是DeepVideo那个时代,我们常常使用的是将一个视频:
(1)抽取关键帧数,将这些帧图片一个一个通过卷积神经网络;
(2)要么就是将这些帧图片叠起来,当作一个整体输入然后扔给神经网络。
但是这些工作的效果都不非常好。
双流网络的作者认为,以往的卷积神经网络更容易学习局部的特征,但是对于时空上的物体的动作运动信息,它不能够很好地处理。
那么双流网络的作者就想:那就干脆再设计一条神经网络让其学习从“输入光流(Temporal Stream)”到“动作类别”的一个映射,也就是说这里的输入贯穿了整个时间序,现在就需要两条神经网络分别学习“空间上的信息”到“种类”的映射和“时间上的信息”到“种类”的映射。通过 Spatial stream ConvNet 和 Temporal stream ConvNets 分别抽取视频的空间和时序特征,最后通过 late fusion 对两个网络进行融合,这里作者考虑了两种融合方法:(1) 直接对两个网络的 softmax 得分进行平均;(2) 将 stacked L2-normalised softmax scores 作为特征训练一个多分类线性 SVM。
这里的空间信息我们用Spatial stream——空间流来表示,时间信息则使用光流这个概念来定义。两条神经网络的前向传播的输出有两个概率,那么只需要将这两个概率取得加权平均值就可以得到一个汇总的概率值了。
可以看到,双流神经网络就是把最重要的“时序”信息给补上了,让CNN也能够学习到时间变化时,物体的变化特征。
事实上,作者也在双流网络原论文中讲到了:双流网络提出的启发主要来自元人类的视觉中枢的工作原理——也是有两条路的:dorsal stream and ventral stream,前者完成对运动信息的处理,后者完成对空间信息的识别。
2.2.1.2 关于光流(Optical flow)
所谓的光流,就是描述光的流动规律,具体一些就是描述视频中物体的运动状态变化规律。
例如,上面的的图片是由两张帧图片叠加在一起形成的,所以有些“残影”,论文中具体解释如下图。
(a) (b) 为视频中的两张连续帧;(c) 就显示了视频中拿箭右手 (蓝色矩形框) 的光流图,记录了图中每个像素点的运动方向 (文中称 “dense” optical flow,因为每个像素点都会记录其运动信息),可以用 表示第 t 帧时点 (u,v) 处的位移向量;而在实际表示中,一张光流图会被拆成两张图,分别表示水平分量 和竖直分量 ,如 (d) (e) 所示,这两张图可以看作一张光流图的两个通道。因此,每两张视频帧可以生成一张两通道的光流图 (水平分量和竖直分量)。
2.2.1.3 网络结构
(1)空间流神经网络
这个网络分支就是完成一个普通的图像分类,从静止的图片中提取出空间特征并利用全连接层映射为一个预测的特征向量。
(2)时间流神经网络
输入为多张光流帧,光流的加入弥补了神经网络难以捕捉时序运动信息的缺陷,直接提供给了模型帧之间的运动信息,使得识别任务更加容易。
Multi-frame optical flow (作者实验了两种输入光流帧的方式):
第一种就是对应位置的相叠加,第二种方式就是移动点的对应位置寻找,具体计算请另行查阅,本文只做简要介绍。
论文中采用的是一种使用了GPU计算的光流计算方法,计算一帧光流图大概需要0.06秒。但是,对于大型的数据集,耗时间是非常大的,将近一个月。并且,光流表示是密集数据,也就是对于一对图片,光流需要表示每个像素的变化,因此存储空间也是非常大。针对于这个存储空间需求大的问题,作者类别图像分类的归一化,将光流图的像素值也进行归一化到了[0,255]这个区间内部,并存储为JPEG格式图片,让存储空间从1.5TB缩减为27GB,但是光流对于大型数据所需的存储空间还是非常大。
因此,后续的工作主要是针对于光流的改进或者是直接另寻方法——3D卷积神经网络。
2.2.2 3D卷积网络(C3D)
TranD等提出3D卷积网络,其中Facebook提出的C3D卷积神经网络占据重要地位,即在卷积层使用3D卷积核对连续的视频帧进行特征提取。相对于图片,视频具有时间维度,因此,可以采用包含时间维度信息的3D卷积直接进行卷积,将时间维度的信息直接加入到卷积网络中进行学习。这种3D卷积的网络能同时提取到视频的时空特征,卷积层之后包含全连接层,利用softmax层进行分类。
以下是3D CNN对图像序列(视频)采用3D卷积核进行卷积操作:
上面进行卷积操作的时间维度为3,即对连续的三帧图像进行卷积操作,上面的 3D卷积是通过堆叠多个连续的帧组成一个立方体,然后在立方体中运用3D卷积核。在这个结构中,卷积层中每一个特征map都会与上一层中多个邻近的连续帧相连,因此捕捉运动信息。例如上面左图,一个卷积map的某一位置的值是通过卷积上一层的三个连续的帧的同一个位置的局部感受野得到的。
3D卷积如何计算请自行查阅相关资料,以下为简要示意图。
以下部分根据论文《Learning Spatiotemporal Features with 3D Convolutional Networks》编写,点击即可查看论文,译文可见C3D:使用3D卷积网络学习时空特征 - 简书 (jianshu.com)。
3D ConvNets 更适合学习时空特征,通过3D卷积和3D池化,可以对时间信息建模,而2D卷积只能在空间上学习特征。3D和2D的区别如下:
2D卷积网络输入图像会产生图像,输入视频输出的也是图像,3D卷积网络输入视频会输出另外一个视频,保留输入的时间信息。
2D和3D卷积运算
a)在一个图像上应用2D卷积会产生一个图像。b)在视频卷上应用2D卷积(多个帧作为多个通道)也会产生一个图像。c)在视频卷上应用3D卷积可产生另一个卷,保留输入信号的时间信息。
C3D卷积网络将完整的视频帧作为输入,并不依赖于任何处理,可以轻松地扩展到大数据集。
Notations:
video clips size: c*l*h*w 其中,c是通道数量,l是帧长度,h是帧高,w是帧宽;
3D kernel size: d*k*k d是核时域深度(d<l),k是核空间尺寸。
Common network settings:
输入:UCF101的视频片段 视频帧调整大小为128*171 为原始视频分辨率的一半,视频分割为不重叠的16帧视频片段,作为网络输入,输入维度为3*16*128*171,训练时通过抖动,维度调整为3*16*112*112。
通用的网络包括5个卷积层和5个池化层(一个卷积层后面跟着一个池化层),2个全连接层,1个softmax分类层来预测行为标签,卷积层的滤波器数量依次为:64、128、256、256、256。所有的卷积核的时域深度都是d,改变d来寻找最好的3D架构。池化核尺寸为2*2*2(除第一层),第一层为1*2*2,步长为1。两个全连接层有2048个输出,使用30个剪辑的迷你批次训练网络,初始的学习率为0.003,每4个epochs学习率除以10,训练16个epochs后停止。通过实验得出depth-3是最好的,卷积核最好的尺寸是3*3*3。
C3D网络结构:
网络有8个卷积层(filter:3×3×3,stride: 1×1×1),5个池化层(filter:2×2×2,stride: 2×2×2,除了第一个filter:1×2×2,stride: 1×2×2),2个全链接层(4096),和1个softmax分类层,最终的网络结构如下图所示。
2.2.3 LSTM(长短期记忆网络)
LSTM网络是一种重要的目前使用最多的时间序列算法,是一种特殊的RNN(Recurrent Neural Network,循环神经网络),能够学习长期的依赖关系。主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
2.2.3.1 网络结构
所有RNN都具有神经网络的重复模块链的形式。 在标准的RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。
标准的RNN网络如下图所示:
LSTM也具有神经网络的重复模块链的形式。只是在CNN的基础上,每个重复模块增加了三个神经网络层,如下图所示:
图中的绿色大框代表单元模块;黄色方框代表神经网络层;粉色圆圈代表逐点操作,例如矢量加法;箭头表示向量转换,从一个节点输出到另一个节点输入;合并的行表示串联,而分叉的行表示要复制的内容,并且副本将到达不同的位置。
和RNN不同的是: RNN中,就是个简单的线性求和的过程。而LSTM可以通过“门”结构来去除或者增加“细胞状态”的信息,实现了对重要内容的保留和对不重要内容的丢弃。 通过Sigmoid层输出一个0到1之间的概率值,描述每个部分有多少量可以通过,0表示“不允许任务变量通过”,1表示“运行所有变量通过 ”。
2.2.3.2 核心思想
首先CNN的主线就是这条顶部水平贯穿的线,也就是长期记忆C线(细胞状态),达到了序列学习的目的。而h可以看做是短期记忆,x代表事件信息,也就是输入。LSTM也是以这一条水平贯穿的C线为主线,在此基础上添加三个门,以保护控制单元状态。所以LSTM有删除或向单元状态添加信息的能力,都是由这门的结构来调节控制的。这个门(gate)是一种选择性的让信息通过的方式。它是由Sigmoid神经网络和矩阵逐点乘运算组成。
LSTM增加的三个神经网络层就代表LSTM的三个门(遗忘门、记忆门、输出门)。
2.2.3.3 信息流动
接下来基于三个门介绍LSTM中信息流动方向。
注:图中*为对应元素乘,下同。
一个LSTM cell有3个门,分别叫做遗忘门(f门),输入门(i门)和输出门(o门)。要注意的是输出门的输出并不是LSTM cell最终的输出,LSTM cell最终的输出是和。
这三个门就是上图中三个标着σ的黄色的框。sigmoid层输出0-1的值,表示让多少信息通过,1表示让所有的信息都通过。
LSTM的输入: ,和;
LSTM的输出: ,。
(1)忘记门:扔掉信息(细胞状态)
第一步是决定从细胞状态里遗忘(丢弃)什么信息。将上一步细胞状态中的信息选择性的遗忘 。
实现方式:通过sigmoid层实现的“忘记门”。以上一步的和这一步的 作为输入,然后为里的每个数字输出一个0-1间的值,记为,表示保留多少信息(1代表完全保留,0表示完全舍弃)
例如,“我今天下午有个会,你......”当处理到“你”的时候选择性的忘记前面的“我”,或者说减小这个词对后面词的影响。
(2)输入层门:存储信息(细胞状态)
第二步是决定在细胞状态里存什么。将新的信息选择性的记录到细胞状态中。
实现方式:包含两部分,
1)sigmoid层(输入门层)决定我们要更新什么值,这个概率表示为
2)tanh层创建一个候选值向量,将会被增加到细胞状态中。 我们将会在下一步把这两个结合起来更新细胞状态。
例子:在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。 例如:“我今天下午有个会,你......”当处理到“你”这个词的时候,就会把主语“我”更新到细胞中去。
更新细胞状态(细胞状态)
更新旧的细胞状态
实现方式: 表示忘记上一次的信息的程度,表示要将候选值加入的程度, 这一步我们真正实现了移除哪些旧的信息(比如上一句的主语),增加哪些新信息,最后得到了本细胞的状态 。
(3)输出层门:输出(隐藏状态)
最后,我们要决定作出什么样的预测。 实现方式:
1)我们通过sigmoid层(输出层门)来决定输出的本细胞状态 的哪些部分;
2)然后我们将细胞状态通过tanh层(使值在-1~1之间),然后与sigmoid层的输出相乘得到最终的输出 。
所以我们只输出我们想输出的部分。
例如:上面的例子,当处理到“你”这个词的时候,可以预测下一个词,是动词的可能性较大,会把前面的信息保存到隐层中去。
具体内容传送门:
(9条消息) LSTM模型结构讲解_Sophia$的博客-CSDN博客_lstm模型结构https://blog.csdn.net/sophicchen/article/details/103306545
9.2. 长短期记忆网络(LSTM) — 动手学深度学习 2.0.0-beta1 documentation (d2l.ai)https://zh.d2l.ai/chapter_recurrent-modern/lstm.html
2.2.4 GCN
基于图的模型得到广泛关注,因为其在图结构数据上非常好的表达效果。图神经网络有两种结构,一种是图和RNN的结合,另外一种是图和CNN的结合(GCN)。GCN有两种类型,一种是空间GCN,另外一种是谱GCN。其中谱GCN是将图像数据转换到谱空间表达。为了在行为识别中应用GCN,首先需要对视频进行图表达。一张图可以表示为(Vt, et),其中vt是定点,et是边。可以利用姿态估测方法获得目标的关节坐标,然后将这些关节点作为图的点,并按照空间或者时间将这些点连接起来。一个结点的临近节点可以这样表示:
D是定义的节点距离。这样定义之后,就可以将每个节点以及它临近节点划分到同一个组。为这些节点标识后,就想当于一个张量了。那么就可以进行卷积运算了。图卷积通常就表示为:
其中l(v_tj)是节点被标识的序号。X是图表示,W为权重。
论文《An Attention Enhanced Graph Convolutional LSTM Network for Skeleton-Based Action Recognition》中提出了AGC-LSTM网络用于行为识别,其将图卷积和LSTM结合。网络整体上看是LSTM,也有输入门,记忆门和输出门等。只不过这些门的是进行的图卷积运算,处理的是图数据。同时将注意力机制引入到网络中,使得网络具备自动检测重要节点的能力。
上图中g表示进行图卷积计算,fatt是注意力网络。由于Ht中包含了大量的空间和时间信息,对其应用注意力网络有效提高对有效节点的追踪。
2.2.5 视觉Transformer(ViT)
最近,Dosovitskiy等人提出了一种纯Transformer,即视觉Transformer(ViT),当直接应用于图像块序列时,它在图像分类任务中表现良好。他们尽可能地遵循原始Transformer的设计。下图展示了视觉Transformer的框架。
2.2.5.1 图片分块和降维
因为transformer的输入需要序列,所以最简单做法就是把图片切分为patch,然后拉成序列即可。 假设输入图片大小是256x256,打算分成64个patch,每个patch是32x32像素。具体来说:假设输入是b,3,256,256,使用rearrange操作是先变成(b,3,8x32,8x32),最后变成(b,8x8,32x32x3)即(b,64,3072),将每张图片切分成64个小块,每个小块长度是32x32x3=3072,也就是说输入长度为64的图像序列,每个元素采用3072长度进行编码。由于3072有点长,可以用nn.linear进行降维到1024。
2.2.5.2 位置embedding
每个patch的位置编码也是1024维的向量,这里作者尝试了不加位置embedding,发现效果会变差不少,但如果加了位置embedding,无论采用的编码方式简单的1D位置编码,还是2D感知的位置编码,效果都差不多。并且设置为可学习,从最后训练好的pos_embedding进行可视化结果来看,相邻位置有相近的位置编码向量,整体呈现2d空间位置排布一样。说明transformer可以学习到各个patch的位置信息。
将patch嵌入向量和位置编码向量相加即可作为编码器输入。
2.2.5.3 增加解码标志
从论文图中可以看到2010.11929.pdf (arxiv.org)https://arxiv.org/pdf/2010.11929.pdf 假设切成9个块,但是最终到transfomer输入是10个向量,额外追加了一个0。原因是我们现在没有解码器了,而是编码后直接就进行分类预测,那么该编码器就要负责一点点解码器功能,那就是:需要一个类似开启解码标志,非常类似于标准transformer解码器中输入的目标嵌入向量右移一位操作。就是这里可以理解额外增加的这个向量即解码的Query请求向量。自此现在就是变成10个向量输出,输出也是10个编码向量,然后取第0个编码输出进行分类预测即可。从这个角度看可以认为编码器多了一点点解码器功能。具体做法超级简单,0就是位置编码向量,patch是可学习的嵌入向量。
2.2.5.4 编码器前向过程
与transformer一样,假设输入是(b,65,1024),那么transformer输出也是(b,65,1024)。
2.2.5.5 分类head
在编码器后接fc分类器head即可。
2.2.5.6 实验结果
作者表示,在中小型数据集上同等训练ViT和基于resnet的网络,ViT的性能要差几个点。但一旦数据量上来了,例如在JFT数据集(18k classes and 303M high-resolution images)上做预训练,再在ImageNet上做finetune,ViT的性能可以很轻松的超过CNN。并且ViT的模型参数量也是要少于CNN的。
文中解释是:transformer缺少CNN对于图像平移不变性和局部感知的能力,作者称之为inductive bias:归纳偏置。这个概念实际就是先验,图像任务中的先验在于局部一致性和平移不变性,这也是这也是为什么CNN如此有效。在中小型数据集中,这种强烈的先验可以让CNN快速收敛,而transformer却不行;当数据量足够大时,先验带来的收益将越发不明显,此时transformer自注意力机制寻找数据内在特征的能力就体现出来了,这种能力会随着数据量的增加而越发明显。并且使用transformer的另一个有点就是可解释性更强,通过解析训练后的注意力权重,可以发现网络的注意力分布在图像中位置。
总结
无论是图像分类还是基于视频的行为识别,关键问题是对图像内容特征的提取。行为是时空中的行为,具有时间和空间两种特性。与传统图像识别不同的是,行为识别还具有时间特性,行为识别的关键问题在于如何同时提取时间和空间特征,如何描述其时间空间特征。基于此,研究人员通过分别提取时间和空间特点,然后融合(two-stream),或者采用3D卷积同时提取时空特征。其次,越来越多得基于Transformer的行为识别方法所取得成绩也是很好的。相关论文研究发现这些方法在视频内容较为简单的情况下已经取得了不错的成绩,但是在内容复杂的视频中准确率仍然有待提升,基于视频的行为识别任务仍然任重道远。