1. 视频理解的介绍与光流的概念
1.1 关于视频理解
关于视频理解的应用:
1)基于视频内容的检索
比如利用关键字搜索视频,或者是搜索视频的内容
2)关键片段定位
比如快速定位视频的核心主要内容,或者截取最精彩的内容
3)兴趣分析与推荐
比如根据用户所观看的历史视频来推荐新视频,或者是根据相似用户观看的历史视频来推荐新视频
关于视频理解的基本任务:
1)行为识别(Action Recognition)
行为识别就是视频领域中的分类任务,一般是识别视频片段中出现的动作(通常为短视频)
主要解决的问题的What,比如对这个短视频进行分类,是什么?
2)时序动作检测(Temporal Action Detection)
在长视频中定位特定动作出现的时间段,并对动作进行分类
时序检测就是指要定位动作出现的时间段(when问题),动作检测就是检测是一个什么样的动作(what问题)
3)时空动作检测(Spatio-Temporal Action Detection)
时空检测的目标,不仅仅是关注动作发生在什么时间段哪一帧,还需要判断帧图像的哪个位置上
需要检测的是(what+when+where问题),什么动作+动作发生在哪个时间段+关键人物在哪?动作发生在哪个位置?
识别并定位视频中出现的人和动作
以上三种任务的相互联系如下:
(这幅图的重点可以看见,是需要对动作进行分类,还需要在空间与时序上回归,视频 = 时间 + 空间)
关于视频理解的主要挑战:
1)如何表示视频中的动作
动作(action)=外观(appearance)+运动(motion)
其中:外观appearance包含了空间上的特征(图像帧),而运动motion包含了时间特征、运动特征与光流特征(帧间运动)
解决这个挑战有以下几种思路:
思路1:独立提取图像特征再进行时序建模
先对每一帧提取特征(空间特征),然后对所有帧的特征提取运动信息,也就是进行时序建模
思路2:利用一些人工设计(比如光流)来估计像素的运动信息从而提取运动特征,再与外观特征进行融合
思路3:直接从多帧图像中计算运动特征(比如使用3D卷积)
2)如何高效处理大量的视频数据
因为对视频的数据量远大于图像,一段5s的短视频包含了150+的帧图像,这对计算方面提出了挑战。
3)如何降低视频数据的标注成本
视频数据的标注是昂贵的,网络上有海量的视频数据但是标注得粗糙或者甚至是没有标注,标注的数据集标注准确但是数量相对较少,那么能否有效的利用这些数据训练模型?
1.2 关于光流
光流(Optical Flow)的概念:
光流是视频中物体运动的描述,是图像平面上的向量场
光流通常是基于相邻图像帧进行估计得到的,实际上就是把图像上的每一个点位移表达了出来
如右图,展现了每一个点的位移方向和大小
光流的估计:
光流的估计是基于亮度不变假设来进行的,也就是说一个点其在t0时刻与t1时刻的亮度应该是保持一致的,改变的只是其位置。
光流的可视化:
1)两幅灰度图:分别表示x,y分量,亮度越大幅度越大
2)向量场:常用于稀疏光流
3)单幅彩色图:用亮度表示速度的大小;用色彩表示速度的方向
光流有两种类型:
1)稀疏光流:只跟踪少量的感兴趣点
2)稠密光流:估算所有像素的光流(其中用颜色表示方向,用亮度来表示大小)
2. 手工设计的视频理解方法
这里的手工设计来提取视频的运动特征,是属于深度学习前的视频理解方法
2.1 稠密轨迹(Dense Trajectories,DT)
稠密轨迹(Dense Trajectories)是手工设计的视频特征的代表:其流程图如下所示
可以看见,传统的手工选择视频特征解决办法通过诗歌步骤:
1)多尺度选择兴趣点
在多个空间尺度上,每隔一定的像素选择作为一个兴趣点;而对平滑区域的兴趣点进行移出,因为这些兴趣点没有运动。
2)获取兴趣点的运动轨迹
对于每个兴趣点,利用其光流信息来估计该店在下一帧的位置Pt+1,而这些帧位置Pt构成的序列信息(Pt,Pt+1,Pt+2…)构成了该兴趣点的运动轨迹,也就是轨迹特征。这里会以兴趣点为起点,根据光流来追踪物体在L=15帧内的运动轨迹。
3)利用轨迹获取视频局部特征(轨迹特征)
现在根据光流获取了兴趣点的轨迹,然后取轨迹周围的NxNxL的时空区域,也就是如图所示将兴趣点的轨迹时空区域切分成一个个的局部时空区域,将其称为时空块。然后计算这每个时空块内的局部特征(比如HOG:图像的梯度直方图、HOF:光流的直方图、MBH:光流的梯度直方图)。随后,对所有时空块的局部特征进行拼接(我觉得应该是Concat操作)来作为这个轨迹特征,也就是兴趣点构成的局部特征。
4)利用轨迹特征获取视频运动特征
在每个视频中包含多个轨迹,利用特征空间中的各个聚类中心,依次统计视频中每个轨迹特征属于哪一个视觉词语,然后统计视频中视觉词语的词频来构建一个直方图数据,那么这个直方图数据就可以当作这个视频的运动特征。
5)利用运动特征来进行动作识别
以上过程的最后目的就是为了从视频中提取其运动特征,这与深度学习本质上也是类似的,因为深度学习的模型结构也是为了提取特征而已,只不过这里是人工设计的手动提取。有了特征之后,就是送入一个分类器进行训练即可。在这个人工的手动设计用的是svm分类器,而对于深度学习来说分类器可能就只是一层的全连接层。
2.2 改进的稠密轨迹(improved Dense Trajectories,iDT)
iDT是在DT上面的改进,其增加了相机运动的估计,并在光流和轨迹中移出相机运动的影响
检测人体,只是用人体以外的区域来估计相机运动,然后取出背景的运动轨迹,从而只看人体做行为识别
3. 2D卷积方法
以下是深度学习后的视频理解方法:
3.1 DeepVideo
DeepVideo是2014提出的一种方法。
这个是首次使用深度学习解决视频分类的任务,但是性能不如IDT等手工设计的特征,其基本的思路是使用AlexNet提取图像帧的特征,再通过不同的方法融合不同图像帧的特征。
其不足主要体现在,只关注于每一帧图像上的外观特征,但是这对于动作识别来说,动作的表述是比较重要的,简单的图像特征的融合其实并不能来表述动作方面的特征。
3.2 双流神经网络(Two-Stream Networks)
双流神经网络(Two-Stream Networks)同样是2014年提出的方法。
最大的优点是,其显式的使用了运动信息(光流):
使用了两个神经网络,一个基于图像来计算外观特征,另外一个基于光流来计算运动特征,最后平均两个网络的分类概率来作为最终的结果。所以双流模型将运动建模为单帧图像和多帧光流的函数。
1)Spatial stream convnet:
用卷积神经网络来处理单帧图像提取外观特征(appearance feature)
不过,在训练时会从视频中随机选取一个帧图像来进行训练(针对短视频),而在测试时,或对全部时刻进行预测再平均所有时刻的分类概率来作为帧图像的结果。
2)Temporal stream convnet:
用卷积神经网络作用在光流场上来提取运动特征(motion feature),这里是多帧的光流信息,因为光流是对运动非常有益的表达。
很显然,双流网络是有明显的缺陷与局限性的,因为其只能适用于短视频来进行短时建模,动作由单一时刻的图像和光流所确定,对于长视频的动作识别来说是不准确的。而一个完整的动作视频,应该由整个时间段内的图像和运动信息所确定。
3.3 时序分段网络(Temporal Segment Networks,TSN)
时序分段网络(Temporal Segment Networks,TSN)是2016年的工作。
时序分段网络将动作建模为视频中多个时段的图像与光流的函数
时序分段网络字如其名,将视频按间断分割为多个片段(比如k段),然后每个片段取其中的一个瞬间送入双流网络,进行外观和动作的特征提取,分别进行类别的判断。然后对多个片段结果进行融合来作为最终的结果。也可以看成是多个双流网络分别作用各个小片段的结果融合。
其中的多结果融合Segmental Consensus称为分段共识函数,可以通过平均/最大值/加权平均等方式融合,从而实现对k个空间留给出的类别概率进行最终分类概率的计算。
相比于Two-Stream,TSN探索了更多的输入配置:
空间流输入增加了RGB差值图像;时间流输入参照iDT,增加了去除运动估计的光流图。
TSN的关键:
通过对视频进行分段处理,而不是按一定的频率进行密集采样,使得网络分析的范围时间覆盖得更广。同时,由于相邻的时间点所观测到的物体其实是比较类似的,而在更大的时间层上进行采样的话可以看见更加多元化,更加全面的信息。使得视野更加阔达,信息也更加的综合。所以最后的判断会更加的准确。
4. 3D卷积方法
思想是:能否不使用额外的人工设计的光流信息,而直接从多帧图像中让模型自行学习到运动信息呢?
解决的办法:把传统的提取图像的二维卷积拓展为对于整个视频来说的三维卷积,也就是把时间维度增加到卷积的计算当中。
4.1 C3D(Convolutional 3D)
C3D(Convolutional 3D)是2014的工作。模型的结构上与早期的AlexNet其实是比较相识的,只不过是把其中的二维卷积改为三维卷积
一般情况下,C3D的性能不如双流神经网络,需要额外配合一些技术才可以超过双流网络。其中的原因有,三维的卷积网络参数更多,更难训练;而且由于是自主设计结构需要从头训练,不能利用成功预训练的图像分类模型。
4.2 I3D(Inflated 3D ConvNets)
I3D(2017)中的3D网络由图像分类中的2D网络膨胀而来,从而可以利用现有的图像分类模型。I3D的性能全面的超越C3D以及同时期的2D卷积网络方法,从此3D卷积网络逐渐成为主流。
ps:这里的3D卷积是又2D卷积膨胀而来的,如下图所示
所以,其实可以看见,所谓的2D膨胀成3D,其实就是进行一个2D卷积核的简单堆叠,成为一个3D的卷积核。所谓膨胀,就是重复堆叠。从而可以对时间维度也进行卷积操作。
一些方法的对比:
针对所有的结构,基于ImageNet的预训练有助于提高视频数据集上的训练精度。这里有一个经验就是,当涉及到一个新的领域,如果能够有效的借用之前的一些成熟的领域所获得的成果,其实是有助于快速的获得性能的提升的。
4.3 3D卷积方法的后续改进
对于3D卷积来说,由于多了一个时间的维度,所以3D卷积的参数量和计算量相比于2D卷积有一个成倍的增加的。
因此,需要更多的训练数据,需要更多的计算资源,也需要一个更加高效的3D卷积模型。已有的方法如下所示:
混合2D和3D卷积
一个神经网络可能会有很多的层次,但是其实并不是全部的层次都需要应用3D的卷积网络,所以可以在关键位置使用3D,部分使用2D来进行混合使用。
分解3D卷积核
将3D的卷积核进行分解,分解为一个时间维度的卷积和一个空间维度的卷积。S3D、R(2+1)D就是这种方法的代表。
减少通道的关联
CSN是减少通道的关联方法的代表。
常规卷积参数量正比于通道数的平方,针对大卷积核使用分组或者逐点卷积,可以大幅降低参数量和计算量,典型代表就是分组卷积与可分离卷积。其中DSW卷积被广泛的用于轻量级的网络中,或者说轻量级网络的核心就是是使用可分离卷积来减少计算量。
优化参数分配
SlowFast提出了一个非常重要的归纳偏置:视频的外观和动作的变化速度是不同的,外观的变化通常较慢,运动的变化速度较快,所以针对外观和运动的特点,可以使用不同结构的模型,来优化参数分配。
这里对于高帧率,由于需要输入较多的图像帧,所以需要使用一个相对轻量级的网络来平衡参数,与低帧率的网络达到了一个平衡。
下面再贴一个博主关于视频理解的总结:
1)万字长文漫谈视频理解:https://blog.csdn.net/LoseInVain/article/details/105545703
2)视频分析与多模态融合之一,为什么需要多模态融合:https://fesian.blog.csdn.net/article/details/118256321