视频理解
视频理解的问题:视频太大了
解决方案:在切片上训练,低FPS,低分辨率
测试的时候:在不同的clips上运行模型,取平均预测结果
视频由图片序列组成:
单帧CNN模型
训练普通的2D CNN模型,对每一帧进行分类,通常是视频分类的一个非常强的基线方法。
Late Fusion(FC)
不同的特征使用不同的分类器,得到基于每个特征的分类结果,再对所有结果进行融合(可能是投票、加权平均等),这个融和发生在不同特征分类结果之间的融合
Late Fusion(Pooling)
将每帧的CNN特征池化并送入线性层
问题:难以捕捉帧之间的low-level motion(细微的运动)
Early Fusion
先将不同的特征融合再一起,最后再使用分类器对其进行分类,也称为特征融合
问题:一层卷积处理输入视频可能不够,转向3D卷积
2Dconv:没有时间平移不变性,不同时间都有单独滤波器
3Dconv:有时间平移不变性,使用3D卷积,将时间维度也考虑进去,但计算量较大
视频理解数据集:Sports-1M
100万个带有487种不同运动标签的YouTube视频
衡量运动:光流
光流可以突出局部运动
双流网络:分别处理motion和appearance,一个在空间上(spatial),一个在时间上(temporal),最后将两个分类器的score融合
视频不仅包含空间信息(单一帧的图像信息),还包含时间信息(帧与帧之间的运动信息)
视频理解中建模长时间时序结构
使用循环网络(如LSTM)处理局部特征
- Many to one:最终输出一个结果
- Many to many:为每一帧输出结果
CNN内部:每个特征都是固定时间窗口的函数(局部时间结构)
RNN内部:每个向量都是所有先前向量的函数(全局时间结构)
结合这两个方法,转向多层RNN
多层RNN:
每个输出都取决于两个输入:
- 同一层:前一时间步
- 上一层:相同时间步
在每一层使用不同的权重,跨时间共享权重
问题:RNN对于长序列很慢,即无法并行化
解决方案:self-attention
经典模型:
Spatio-Temporal Self-Attention
先做一个3DCNN,然后经过一个Nonlocal Block
Nonlocal Block:使用自注意力机制,对每个特征图,计算其他特征图上的注意力权重,然后加权求和
I3D(Inflating 2D Networks to 3D)
使用2Dconv的权重来初始化3Dconv,在空间中复制kt次并处以kt,使得两者的预测结果相同。
Temporal Action Localization
给定一个长视频序列,识别与不同动作对应的帧
可以使用类似Faster R-CNN的架构:先生成temporal proposals,然后对每个proposal进行分类