使用Keras进行视频预测(时间序列)

17
我想用Keras中的CNN或RNN来预测给定N个以前的帧后的(灰度)视频的下一帧 - 大多数关于时间序列预测和Keras的教程和其他信息在其网络中使用1维输入,但我的输入将是3D (N帧x行x列)
我目前真的不确定解决此问题的好方法是什么。我的想法包括:
  • 使用一个或多个LSTM层。问题在于我不确定它们是否适合接受一系列图像而不是标量作为输入。内存消耗不会爆炸吗?如果可以使用它们:如何在Keras中使用它们处理更高维度的数据?

  • 在输入(以前的视频帧堆栈)上使用3D卷积。这引发了其他问题:当我不进行分类而进行预测时,为什么会有帮助?如何将层堆叠在这样的方式,使得网络的输入具有尺寸(N x cols x rows),输出为(1 x cols x rows)

我对CNN / RNN和Keras非常新手,任何指向正确方向的提示都将不胜感激。
2个回答

25
所以基本上每种方法都有其优缺点。让我们先看看你提供的方法,然后再找到最佳方法:
  1. LSTM:它们最大的优点之一是能够学习数据中长期依赖模式,旨在分析长序列,例如语音或文本。但由于参数数量可能非常高,这也可能会导致问题。其他典型的循环网络架构,如GRU,可能会克服这些问题。其主要缺点是,在其标准(顺序实现)中,与密集层不适合处理图像数据的原因相同,无法将其拟合到视频数据上-必须通过完全不适合以有效方式捕获它们的拓扑结构来学习许多时间和空间不变性。将视频向右移动一个像素可能会完全改变您的网络输出。

    值得一提的另一件事是,人们认为训练LSTM类似于在两个竞争过程之间找到平衡-找到用于密集型输出计算的良好权重,并找到在处理序列时具有良好内存动态的平衡。找到这种平衡可能需要很长时间,但一旦找到-通常非常稳定并产生非常好的结果。

  2. Conv3D:它们最大的优点之一是能够以与图像情况下的Conv2D相同的方式捕获空间和时间不变性。这使得维数诅咒变得不那么有害。另一方面-与Conv1D可能无法处理较长序列的结果相同-缺乏任何内存可能会使学习长序列变得更加困难。

当然,您可以使用不同的方法,例如:
3. TimeDistributed + Conv2D: 使用TimeDistributed包装器 - 可以使用一些预训练的convnet,如Inception逐帧分析特征映射。这种方法的真正巨大优势是可以进行迁移学习。作为缺点 - 人们可能会认为它是一个Conv2.5D - 它缺少对数据的时间分析。
4. ConvLSTM: 这种架构目前还不受最新版本的Keras支持(截至2017年3月6日),但是如here所示,将来应该会提供支持。这是LSTMConv2D的混合体,被认为比堆叠Conv2DLSTM更好。
当然,这些并不是解决这个问题的唯一方法,我会提及另外一个可能有用的方法:
  1. 堆叠:可以轻松地将上述方法堆叠起来以构建最终解决方案。例如,可以构建一个网络,在视频经过 TimeDistributed(ResNet) 转换后,输出被送入 Conv3D 进行多次和积极的空间池化,最终由 GRU/LSTM 层转换。

附言:

还有一件值得一提的事情是,视频数据的形状实际上是 4D,具有 (frames, width, height, channels)。

附言2:

如果您的数据实际上是3D,具有(frames, width, height)的形式,您实际上可以使用经典的Conv2D(通过将channels更改为frames)来分析此数据(这实际上可能更具计算效率)。在进行迁移学习时,应添加额外的维度,因为大多数CNN模型是在具有(width,height,3)形状的数据上进行训练的。您可能会注意到,您的数据没有3个通道。在这种情况下,通常使用的技术是将空间矩阵重复三次。 PS3: 这种2.5D方法的一个例子是:
input = Input(shape=input_shape)
base_cnn_model = InceptionV3(include_top=False, ..)
temporal_analysis = TimeDistributed(base_cnn_model)(input)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis)
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis)
output = Flatten()(conv3d_analysis)
output = Dense(nb_of_classes, activation="softmax")(output)

非常有用的信息,特别是TimeDistributed层。我的视频数据形状是3D的,因为只有一个通道,我应该重新调整它吗?此外,您能否提供一些(伪)代码来说明如何连接层的第5种方法?维度仍然让我感到困惑。非常感谢! - Isa
我还有一些额外的问题。伪代码中提到了nb_of_classes,但我不需要分类,而是下一个时间步的帧。没有更简单的解决方案吗?我现在不需要迁移学习,只需要一个简单的网络,它可以获取N个先前的帧并预测下一个帧。 - Isa
1
我明天回答?好吗? - Marcin Możejko
我可以让ConvLSTM2D模型正常工作,但是将InceptionV3转换为TimeDistributed时失败了:“ValueError:输入到“Flatten”的形状未完全定义(得到(None,x,y,z))。确保在模型的第一层中传递完整的“input_shape”或“batch_input_shape”参数。” - Clark Kent

11
在做了大量研究后,我最终发现 Keras Example 中的 ConvLSTM2D 层(已被 Marcin Możejko 提到)正好满足我的需求。
在当前版本的 Keras(v1.2.2)中,该层已经包含在内,可以使用以下方式导入。
from keras.layers.convolutional_recurrent import ConvLSTM2D 

使用此图层,视频数据必须按以下格式进行格式化:
[nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf'
[nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th'

channels的值应该是多少,它代表什么意思? - jameshwart lopez
通道数指的是RGB或灰度图像,分别为3或1个通道。 - Asim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接