Невозможно повысить точность проверки, хотя обучение составляет 100% и как подавать изображения, извлеченные из видео, в модель глубокого обучения - PullRequest
0 голосов
/ 19 ноября 2018

Я строю систему распознавания жестов, используя набор данных шута 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, но тот же результат.

1 Ответ

0 голосов
/ 19 ноября 2018

Ниже приведены несколько предложений

  • Ваш тренировочный n равен 400, я «чувствую», что этот n слишком мал, я рекомендую увеличить набор обучающих данных до, возможно, 500 * 4. не забудьте перетасовать данные при записи данных об обучении и включить случайное перемешивание для каждой партии во время тренировки.
  • нормализованы ли данные (от 0 до 1 или нулевая средняя единица дисперсии)?
  • Вы уверены, что в каждом семпле содержится 22 изображения в обучающем наборе данных, и вы используете нулевую площадку в канале времени для семплов, если у них нет 22 кадров?
  • Вы пробовали разные оптимизаторы, скорость обучения?
  • для обеих архитектур, сегмент горлышка бутылки, я бы рекомендовал как минимум 2 слоя плотных слоев.
  • для 3D-CNN, я рекомендую добавить еще несколько слоев cnn, как вы делали с cnn-lstm.
  • для обеих архитектур, кроме последнего выходного слоя, последовательно используется один и тот же активатор 'relu', нет необходимости смешивать и сопоставлять (у вашего CNN-LSTM есть сигмоид в плотном слое)
  • для обеих архитектур: уменьшите вероятность отсева до 0,2 (если вы используете кера).
  • если вышеуказанные изменения не помогают, добавьте нормализацию для каждого слоя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...