Предварительная обработка данных - форма ввода для распределенного по времени CNN (LRCN) и ConvLSTM2D для классификации видео - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь сделать двоичную классификацию для помеченных данных для 300+ видео. Цель состоит в том, чтобы извлечь функции с использованием ConvNet и передать их в LSTM для последовательности с двоичным выходом после оценки всех кадров в видео. Я предварительно обработал каждое видео, чтобы оно имело ровно 200 кадров с каждым изображением 256 x 256, чтобы было проще передать его в DNN и разбить набор данных на две папки в качестве меток. (например, собака и кошка)

Однако, после поиска в стеке в течение нескольких часов, я все еще не уверен, как изменить набор данных видеокадров, чтобы модель учитывала количество кадров. Я пытаюсь скормить видеокадры в 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(...). Любой пример кода будет очень признателен.

1 Ответ

0 голосов
/ 04 января 2019

Я думаю, вы могли бы использовать ConvLSTM2D в Керасе для ваших целей. ImageDataGenerator очень хорошо для CNN с изображениями, но может быть не удобно для CRNN с видео.

Вы уже преобразовали свои 300 видеоданных в одну и ту же форму (200, 256, 256, 3), каждое видео 200 кадров, каждый кадр 256x256 rgb. Затем вам нужно загрузить их в виде массива с нулевыми значениями (300, 200, 256, 256, 3). Для чтения видео в массивах numy см. этот ответ .

Затем вы можете передать данные в 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)

Надеюсь, это может быть немного полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...