首页 文章

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

提问于
浏览
13

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

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

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

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

我对CNN / RNN和Keras很陌生,并且会欣赏任何正确方向的暗示 .

2 回答

  • 8

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

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

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

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

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

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

    • ConvLSTM :最新版本的 Keras (2017年3月6日)尚未支持此架构,但有人可能会看到here将来应提供此架构 . 这是 LSTMConv2D 的混合物,它被认为比堆叠 Conv2DLSTM 更好 .

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

    • 堆叠:可以轻松堆叠上层方法以构建最终解决方案 . 例如 . 一个人可以 Build 一个网络,在开始时使用 TimeDistributed(ResNet) 转换视频,然后输出被送到 Conv3D ,具有多个和激进的空间池,最后由 GRU/LSTM 层转换 .

    PS:

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

    PS2:

    如果您的数据实际上是 3D 并且 (frames, width, hieght) ,您实际上可以使用经典 Conv2D (通过将 channels 更改为 frames )来分析此数据(实际上可能在计算上更有效) . 在转学习的情况下,您应该添加额外的维度,因为大多数 CNN 模型都是使用形状 (width, height, 3) 进行数据训练的 . 您可能会注意到您的数据没有3个 Channels . 在这种情况下,通常使用的技术是重复空间矩阵三次 .

    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)
    
  • 19

    经过大量的研究,我终于偶然发现 ConvLSTM2DConvLSTM2D 层(已经由MarcinMoż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'
    

相关问题