Я строю систему распознавания жестов, используя набор данных шута 20 млрд. В настоящее время я работаю только в 4 классах. Набор данных состоит из изображений, извлеченных из видео со скоростью 12 кадров / с. Я построил 2 модели, 3D-CNN и CNN-LSTM, но получая точность около 25-30%, используя только керасы и Tensorflow.
Dataset looks like X_train = (651, 1, 128, 128, 22)
X_valid=(260, 1, 128, 128, 22)
Y_train=(651, 4)
Y_valid = (260, 4)
Размер изображения 128 * 128 с 1 каналом, я добавляю 22 изображения за раз с 651 в качестве общего количества выборок.
Архитектура 3d-CNN
model = Sequential()
model.add(Convolution3D(32, (3, 3, 3), strides=(1, 1, 1), input_shape=(1, img_rows, img_cols, img_depth),
activation='relu', data_format='channels_first'))
model.add(MaxPooling3D((3, 3, 3), data_format='channels_first'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512, activation='sigmoid'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, kernel_initializer='normal'))
model.add(Activation('softmax'))
Архитектура модели CNN-LSTM
(651, 22, 128, 128, 1)
(260, 22, 128, 128, 1)
(651, 4)
(260, 4)
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (7, 7), strides=(2, 2),
activation='relu', padding='same'), input_shape=input_shape))
model.add(TimeDistributed(Conv2D(32, (3, 3),
kernel_initializer="he_normal", activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(64, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(64, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(128, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(128, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(256, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(256, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Conv2D(512, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(Conv2D(512, (3, 3),
padding='same', activation='relu')))
model.add(TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2))))
model.add(TimeDistributed(Flatten()))
model.add(Dropout(0.5))
model.add(LSTM(256, return_sequences=False, dropout=0.5))
model.add(Dense(nb_classes, activation='softmax'))
Набор данных сбалансирован с 100 жестами из каждого класса, и я управлял моделью в течение 100 эпох. Правильна ли архитектура? У меня также есть сомнения относительно подачи изображений. Так как я работаю над видео, мне нужно дополнительное измерение для извлечения временных функций, поэтому сначала добавляем 22 изображения в 1 массив и продолжаем добавляться аналогичным образом, это правильный путь? Сначала я попробовал также с 12 вместо 22, но тот же результат.