使用卷积神经网络和循环神经网络进行图像序列训练

5

我正在学习深度学习的第一步。我试图从视频的图像序列(帧)中进行活动识别。结果我在训练过程中遇到了问题。

首先,我需要确定我的图像文件夹的架构:

Making Food -> p1 -> rgb_frame1.png,rgb_frame2.png ... rgb_frame200.png
Making Food -> p2 -> rgb_frame1.png,rgb_frame2.png ... rgb_frame280.png
                      ...
                      ...
                      ...
Taking  Medicine -> p1 -> rgb_frame1.png,rgb_frame2.png...rgbframe500.png

                      etc..
      

问题在于每个文件夹中的帧数可能不同,因此我会对模型的输入形状和应该使用的时间步长感到困惑。

我正在创建一个模型(如下所示),其中包含经过预训练的VGG16的时序分布CNN和LSTM,该模型以所有类的所有帧及其相应的标签(在上面的示例中,“制作食物”将是与p1_rgb_frame1等相应的标签)作为输入,并且最终的x_train的形状为(9000,200,200,3),其中9000对应于来自所有类别的所有帧,200是图像的高度和宽度,3是通道数。我正在将此数据重塑为(9000,1,200,200,3),以便用作模型的输入。

我担心没有传递正确的时间步长,导致错误的训练结果。虽然val_acc约为98%,但在使用不同数据集进行测试时,准确率要低得多。您能否提出更有效的解决方案?

  x = base_model.output
  x = Flatten()(x)
  features = Dense(64, activation='relu')(x)
  conv_model = Model(inputs=base_model.input, outputs=features)    
  for layer in base_model.layers:
      layer.trainable = False
       
  model = Sequential()
  model.add(TimeDistributed(conv_model, input_shape=(None,200,200,3)))
  model.add(LSTM(32, return_sequences=True))
  model.add(LSTM(16))
1个回答

2
在我看来,你的模型结构并没有明显的问题。对于不同帧数的问题,解决方法就是不要这样做。预处理数据以从每个动作中取相同数量的帧。
更深层次的问题更可能只是简单的过度拟合。虽然你没有说明,但基于你在谈论将训练数据托管在单台计算机上的事实,我想你可能没有太多的训练数据,并且你的网络并没有学习活动,而只是学习了识别训练数据。考虑到VGG16大约有120万个不同的训练示例,并在顶尖GPU上进行了数周的训练,仅用于区分1000个静态图像类。可以说,学习时间方面和活动方面需要类似的训练数据量。你有一个不错的想法,以VGG为基础并在其上添加,因此你的网络不必重新学习静态图像识别功能,但从静态图像到动态视频的概念跨越仍然很大!

如何在不取出最有用的帧的情况下,以相同的方式获得相同数量的帧数,如果不这样做会有问题吗?关于您的第二个陈述,确实我没有太多的训练数据,您建议将它们训练成经典的“Timedistirbuted Conv2d”层,而不是VGG吗? - jvario
1
你不应该依赖于知道哪些帧最“有用”。这正是你的神经网络应该学习的内容。只需将帧间隔足够分开,比如说50或100毫秒。至于你的第二个问题,不幸的是,改变网络类型并不能消除潜在的问题。你需要更多的训练数据,而不是一个更高级的网络。 - mCoding

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