我正在为300多个视频的标记数据进行二进制分类。目标是使用ConvNet提取特征,并在评估视频中的所有帧之后输入到LSTM以使用二进制输出进行排序。我已经预处理了每个视频,只有200帧,每个图像都是256 x 256
,这样就可以更容易地将数据输入DNN并将数据集拆分为两个文件夹作为标签。 (例如狗和猫)
然而,在搜索stackoverflow几个小时之后,我仍然不确定如何重塑视频帧的数据集,以便模型考虑帧数。我正在尝试将视频帧输入3D ConvNets
和TimeDistributed (2DConvNets) + LSTM
,(例如(300,200,256,256,3)),但没有运气。我能够执行2D ConvNet分类(数据是4D Tensor
,需要添加时间步长维以使其成为5D Tensor
)很容易,但现在有问题与时间方面争论。
我一直在使用Keras ImageDataGenerator
和train_datagen.flow_from_directory
来阅读图片,并在尝试将其提供给shape mismatch
时遇到TimeDistributed ConvNet
错误。我假设我有一个X_train
数据集,我可以做X_train = X_train.reshape(...)
。任何示例代码都将非常感激。
答案 0 :(得分:0)
我认为您可以在Keras中使用ConvLSTM2D
。 ImageDataGenerator
对于带有图像的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)
我希望这会有所帮助。