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

Isa*_*Isa 16 machine-learning time-series neural-network lstm keras

我想预测给定N前一帧的(灰度)视频的下一帧 - 使用Keras中的CNN或RNN.关于时间序列预测和Keras的大多数教程和其他信息在他们的网络中使用1维输入,但我的是3D(N frames x rows x cols)

我现在真的不确定这个问题的好方法是什么.我的想法包括:

  • 使用一个或多个LSTM图层.这里的问题是我不确定他们是否适合拍摄一系列图像而不是一系列标量作为输入.内存消耗不会爆炸吗?如果可以使用它们:我如何在Keras中使用它们以获得更高的尺寸?

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

我对CNN/RNN和Keras很陌生,并希望能够向正确的方向发出任何暗示.

Mar*_*jko 22

所以基本上每种方法都有其优点和缺点.让我们来看看你提供的那些,然后找到最好的方法:

  1. LSTM:他们最大的优势之一是能够在数据中学习长期的依赖模式.它们的设计是为了能够分析长序列,例如语音或文本.这也可能导致问题,因为数字参数可能非常高.其他典型的经常性网络架构GRU可能会克服这个问题.主要的缺点是,在它们的标准(顺序实现)中,由于密集层对图像数据不利的原因,将其拟合到视频数据上是不可行的 - 必须通过完全拓扑来学习时间和空间不变性的负载.不适合以有效的方式捕捉它们.将视频向右移动一个像素可能会完全改变网络的输出.

    另外值得一提的是,训练被认为类似于LSTM在两个竞争过程之间找到平衡 - 为类似密集的输出计算找到好的权重,并在处理序列中找到良好的内存动态.找到这种平衡可能会持续很长时间,但一旦找到它 - 它通常非常稳定并产生非常好的结果.

  2. Conv3D:在他们最大的优势中,人们可以很容易地找到以与Conv2D图像情况相同的方式捕捉空间和时间不变性的能力.这使得维度的诅咒的危害性大大降低.另一方面 - Conv1D与以较长序列可能无法产生良好结果的方式相同 - 以同样的方式 - 缺乏任何记忆可能会使学习更长的序列更难.

当然可以使用不同的方法,如:

  1. TimeDistributed + Conv2D:使用TimeDistributed包装器 - 可以使用一些预先训练的卷轴,例如Inceptionframewise,然后按顺序分析要素图.这种方法的一个非常巨大的优势是转移学习的可能性.作为一个缺点 - 人们可能会认为它Conv2.5D- 它缺乏对数据的时间分析.

  2. ConvLSTM:这个架构尚未得到最新版本Keras(2017年3月6日)的支持,但正如人们可能会在这里看到的那样,它将来会提供.这是一个混合物,LSTMConv2D和它的belived是更好,然后堆叠Conv2DLSTM.

当然这些并不是解决这个问题的唯一方法,我再提一个可能有用的方法:

  1. 堆叠:可以轻松堆叠上层方法以构建最终解决方案.例如,可以构建一个网络,其中在开始时使用TimeDistributed(ResNet)随后的输出来转换视频,其Conv3D具有多个且具有侵略性的空间池并最终由GRU/LSTM层转换.

PS:

还有一个,这也是值得一提的是,视频数据的形状实际上是4D(frames, width, height, channels).

PS2:

如果您的数据实际上3D(frames, width, hieght)您实际上在一起,您实际上可以使用经典Conv2D(通过更改channelsframes)来分析此数据(实际上可能在计算上更有效).在转学习的情况下,您应该添加额外的维度,因为大多数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)
Run Code Online (Sandbox Code Playgroud)


Isa*_*Isa 10

经过大量的研究,我终于偶然发现了该层的Keras 示例ConvLSTM2D(MarcinMożejko已经提到过),这正是我所需要的.

在当前版本的Keras(v1.2.2)中,此图层已包含在内,可以使用导入

from keras.layers.convolutional_recurrent import ConvLSTM2D 
Run Code Online (Sandbox Code Playgroud)

要使用此图层,视频数据必须格式如下:

[nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf'
[nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th'
Run Code Online (Sandbox Code Playgroud)