数据预处理 - 时分分布CNN(LRCN)的输入形状&用于视频分类的ConvLSTM2D

时间:2018-05-08 22:07:31

标签: tensorflow deep-learning keras computer-vision

我正在为300多个视频的标记数据进行二进制分类。目标是使用ConvNet提取特征,并在评估视频中的所有帧之后输入到LSTM以使用二进制输出进行排序。我已经预处理了每个视频,只有200帧,每个图像都是256 x 256,这样就可以更容易地将数据输入DNN并将数据集拆分为两个文件夹作为标签。 (例如狗和猫)

然而,在搜索stackoverflow几个小时之后,我仍然不确定如何重塑视频帧的数据集,以便模型考虑帧数。我正在尝试将视频帧输入3D ConvNetsTimeDistributed (2DConvNets) + LSTM,(例如(300,200,256,256,3)),但没有运气。我能够执行2D ConvNet分类(数据是4D Tensor,需要添加时间步长维以使其成为5D Tensor )很容易,但现在有问题与时间方面争论。

我一直在使用Keras ImageDataGeneratortrain_datagen.flow_from_directory来阅读图片,并在尝试将其提供给shape mismatch时遇到TimeDistributed ConvNet错误。我假设我有一个X_train数据集,我可以做X_train = X_train.reshape(...)。任何示例代码都将非常感激。

1 个答案:

答案 0 :(得分:0)

我认为您可以在Keras中使用ConvLSTM2DImageDataGenerator对于带有图像的CNN非常有用,但对于带有视频的CRNN可能不方便。

您已经将300个视频数据转换为相同的形状(200、256、256、3),每个视频200帧,每个帧256x256 rgb。接下来,您需要将它们加载到形状为(300,200,256,256,3)的numpy数组中。有关以numpy数组读取视频的信息,请参见this answer

然后,您可以在CRNN中提供数据。它的第一层ConvLSTM2D应该有input_shape = (None, 200, 256, 256, 3)

根据您的数据得出的样本:(仅作了说明,未经测试)

from keras.models import Sequential
from keras.layers import Dense
from keras.layers.convolutional_recurrent import ConvLSTM2D

model = Sequential()
model.add(ConvLSTM2D(filters = 32, kernel_size = (5, 5), input_shape = (None, 200, 256, 256, 3)))
### model.add(...more layers)
model.add(Dense(units = num_of_categories, # num of your vedio categories
                kernel_initializer = 'Orthogonal', activation = 'softmax'))
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

# then train it
model.fit(video_data, # shape (300, 200, 256, 256, 3)
          [list of categories],
          batch_size = 20,
          epochs = 50,
          validation_split = 0.1)

我希望这会有所帮助。