如何基于提取的特征来构建我的视频数据集以构建CNN-LSTM分类模型?

时间:2020-04-09 15:32:48

标签: tensorflow deep-learning dataset lstm cnn

对于我的处理情感识别的项目,我有一个包含多个视频的数据集,范围从0.5s到10s。我有一个应用程序,它遍历每个视频并创建一个.csv文件,其中包含从视频的每个帧中提取的功能,即,每一行代表视频中的每一帧(行数可变)和列表示应用程序已从框架中提取的不同功能(固定的列数)。每个.csv文件名还包含代表视频中表达的情感的代码。

最初,我的计划是从视频中提取每个帧,并将每个帧作为输入传递给我计划使用的以下CNN-LSTM(用于空间特征的CNN和用于时间特征的LSTM)。

    model = Sequential()

    model.add(Input(input_shape))

    model.add(Conv3D(6, (1, 5, 5), (1, 1, 1), activation='relu', name='conv-1'))
    model.add(AveragePooling3D((1, 2, 2), strides=(1, 2, 2), name='avgpool-1'))

    model.add(Conv3D(16, (1, 5, 5), (1, 1, 1), activation='relu', name='conv-2'))
    model.add(AveragePooling3D((1, 2, 2), strides=(1, 2, 2), name='avgpool-2'))

    model.add(Conv3D(32, (1, 5, 5), (1, 1, 1), activation='relu', name='conv-3'))
    model.add(AveragePooling3D((1, 2, 2), strides=(1, 2, 2), name='avgpool-3'))

    model.add(Conv3D(64, (1, 4, 4), (1, 1, 1), activation='relu', name='conv-4'))
    model.add(Reshape((30, 64), name='reshape'))

    model.add(CuDNNLSTM(64, return_sequences=True, name='lstm-1'))
    model.add(CuDNNLSTM(64, name='lstm-2'))

    model.add(Dense(6, activation=tf.nn.softmax, name='result')) 

我仍然计划使用CNN-LSTM模型,但是现在我不知道如何构造数据集。我想到了用相应的情感标签标记每个.csv文件中的每个帧,然后将所有.csv文件组合成一个.csv文件的方法。更改输入形状和其他必要参数后,此组合的.csv文件将传递给上述模型,但是我不知道该模型是否能够区分视频。

因此,总而言之,我需要帮助构造数据集以及如何将此数据集传递到CNN-LSTM模型。

1 个答案:

答案 0 :(得分:0)

通过查看问题陈述,我认为没有必要区分视频。

您可以继续为视频中的每一帧添加标签并将其组合为单个CSV文件的方法。

For可以使用以下代码从CSV文件转换为NumPy数组,以按照以下方法准备要训练的模型。

data = pd.read_csv('input.csv')

width, height = 48, 48

datapoints = data['pixels'].tolist()

#getting features for training
X = []
for xseq in datapoints:
    xx = [int(xp) for xp in xseq.split(' ')]
    xx = np.asarray(xx).reshape(width, height)
    X.append(xx.astype('float32'))

X = np.asarray(X)
X = np.expand_dims(X, -1)

#getting labels for training
y = pd.get_dummies(data['emotion']).as_matrix()

#storing them using numpy
np.save('fdataX', X)
np.save('flabels', y)