Перенос обучения с использованием Keras и vgg16 для небольшого набора данных - PullRequest
1 голос
/ 15 июня 2019

Мне нужно построить нейронную сеть, способную распознавать лицо 15 человек. Я использую керас. Мой набор данных состоит из 300 изображений и состоит из тренинга, валидации и тестирования. Для каждого из 15 человек у меня есть следующее подразделение:

  • Обучение: 13
  • Проверка: 3
  • Тест: 4

Поскольку я не мог построить эффективную нейронную сеть с нуля, я также считаю, что мой набор данных очень мал, поэтому я пытаюсь решить свою проблему, проводя обучение с переносом. Я использовал сеть VGG16. На этапе обучения и проверки я получаю хорошие результаты, но когда я запускаю тесты, результаты катастрофические.

Я не знаю, в чем моя проблема. Вот код, который я использовал:

img_width, img_height = 256, 256
train_data_dir = 'dataset_biometria/face/training_set'
validation_data_dir = 'dataset_biometria/face/validation_set'
nb_train_samples = 20   
nb_validation_samples = 20 
batch_size = 16
epochs = 5

model = applications.VGG19(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))

for layer in model.layers:
    layer.trainable = False

#Adding custom Layers 
x = model.output
x = Flatten()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.4)(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(15, activation="softmax")(x)

# creating the final model 
model_final = Model(input = model.input, output = predictions)

# compile the model 
model_final.compile(loss = "categorical_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"])

# Initiate the train and test generators with data Augumentation 
train_datagen = ImageDataGenerator(
rescale = 1./255,
horizontal_flip = True,
fill_mode = "nearest",
zoom_range = 0.3,
width_shift_range = 0.3,
height_shift_range=0.3,
rotation_range=30)

test_datagen = ImageDataGenerator(
rescale = 1./255,
horizontal_flip = True,
fill_mode = "nearest",
zoom_range = 0.3,
width_shift_range = 0.3,
height_shift_range=0.3,
rotation_range=30)

train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size = (img_height, img_width),
batch_size = batch_size, 
class_mode = "categorical")

validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size = (img_height, img_width),
class_mode = "categorical")

# Save the model according to the conditions  
checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto')


# Train the model 
model_final.fit_generator(
train_generator,
samples_per_epoch = nb_train_samples,
epochs = epochs,
validation_data = validation_generator,
nb_val_samples = nb_validation_samples,
callbacks = [checkpoint, early])

model('model_face_classification.h5')

Я также пытался тренировать некоторые слои, а не тренировать их, как в примере ниже:

for layer in model.layers[:10]:
    layer.trainable = False

Я также пытался изменить количество эпох, размер пакета, nb_validation_samples, nb_validation_sample.

К сожалению, результат не изменился, на этапе тестирования моя сеть не может правильно распознать лица.

1 Ответ

0 голосов
/ 16 июня 2019

Не видя реальных результатов или ошибок, я не могу сказать, в чем здесь проблема.
Определенно, небольшой набор данных является проблемой, но есть много способов обойти это.
Вы можете использовать увеличение изображения для увеличения образцов. Вы можете сослаться augement.py .

Но вместо того, чтобы модифицировать вашу вышеупомянутую сеть, есть действительно классная модель: siamese network/one-shot learning. Для этого не нужно много фотографий, а точность велика.

Поэтому вы можете увидеть ссылки ниже, чтобы получить некоторую помощь:

  1. Распознавание лиц с использованием FaceNet-сиамское обучение одним выстрелом
  2. Face-распознавание, используя глубину обучения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...