Я пытаюсь построить систему проверки лица с использованием моделей keras и resnet50 с весами vggface. Я пытаюсь достичь этого с помощью следующих шагов:
- по двум изображениям я сначала узнаю лицо, используя mtcnn в качестве вложений
- , затем вычисляю косинусное расстояние между двумя векторные вложения. расстояние начинается от 0 до 1 ..... (Здесь следует отметить, что чем меньше расстояние у тех же двух граней)
Используя предварительно обученную модель resnet50, я получаю довольно хороший результат , Но так как модель была обучена в основном на европейских данных, и я хочу, чтобы проверка лица на индийском субконтиненте я не мог положиться на это. Я хочу обучить их на своем собственном наборе данных. У меня есть 10000 классов с каждым классом, содержащим 2 изображения. С помощью увеличения изображения я могу создать 10-15 изображений в классе из этих двух изображений.
Вот пример кода, который я использую для обучения
base_model = VGGFace(model='resnet50',include_top=False,input_shape=(224, 224, 3))
base_model.layers.pop()
base_model.summary()
for layer in base_model.layers:
layer.trainable = False
y=base_model.input
x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.
x=Dense(1024,activation='relu')(x) #dense layer 2
x=Dense(512,activation='relu')(x) #dense layer 3
preds=Dense(8322,activation='softmax')(x) #final layer with softmax activation
model=Model(inputs=base_model.input,outputs=preds)
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
model.summary()
train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input) #included in our dependencies
train_generator=train_datagen.flow_from_directory('/Users/imac/Desktop/Fayed/Facematching/testenv/facenet/Dataset/train', # this is where you specify the path to the main data folder
target_size=(224,224),
color_mode='rgb',
batch_size=32,
class_mode='categorical',
shuffle=True)
step_size_train=train_generator.n/train_generator.batch_size
model.fit_generator(generator=train_generator,
steps_per_epoch=step_size_train,
epochs=10)
model.save('directory')
Что касается кода кода я понимаю, что я отключаю последний слой, затем добавляю 4 слоя, обучаю их и сохраняю их в директории.
Затем загружаю модель, используя
model=load_model('directory of my saved model')
model.summary()
yhat = model.predict(samples)
Я предсказываю вложение двух изображение, а затем рассчитать расстояние косинуса. Но проблема в том, что предсказание ухудшается с моей обученной моделью. Для двух изображений одного человека предварительно обученная модель дает расстояние 0,3, тогда как моя обученная модель показывает расстояние 1,0. Хотя во время тренировок функция потерь уменьшается с каждой эпохой, а точность увеличивается, но это не отражается на моих результатах прогнозирования. Я хочу увеличить результат прогнозирования предварительно обученной модели.
Как мне добиться этого с помощью моих собственных данных?
Примечание: я относительно новичок в машинном обучении и не знаю много о слоях модели