如何使用限制性数据集在我和其他人之间创建Keras人脸分类器



在过去的两个月里,我一直在尝试创建一个分类模型,以区分我自己和其他患有Keras的人。我从dogs vs cats分类器开始,并替换了数据集。从那以后,我对网络和数据集进行了调整,取得了一些成功。此外,我还尝试用许多不同的组合来增强我的数据集(翻转、旋转、灰度、使伽马变亮和变暗;我的增强将1张图片变成9张)。

在训练中,我使用笔记本电脑的网络摄像头从不同的方向和角度捕捉我的脸,然后将其分成三部分(1/3用于验证,2/3用于训练)。对于负面的例子,我有另一组以同样方式随机划分的人的数据。

  • 验证:
    • 人数:300
    • 其他:300
  • 列车:
    • 人:600
    • 其他:600

为了检查我的模型,我使用了一些家庭照片,这些照片的准确率约为80%,但为此我只使用了60张照片,其中36张是我自己的。

img_width, img_height = 150, 150
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height)
else:
input_shape = (img_width, img_height, 3)
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)

test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
print(train_generator.class_indices)
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
print(validation_generator.class_indices)
model.fit_generator(
train_generator,
steps_per_epoch=train_samples // batch_size,
epochs=epochs,
callbacks=[tensorboard],
validation_data=validation_generator,
validation_steps=validation_samples // batch_size)
model.save('model.h5')

我所有的训练尝试都是一样的。前1-2个时期具有接近的acc和损失值,而以下时期跳到acc:0.9,损失:0.1。

我的假设是问题出在数据集中。我应该怎么做才能通过只使用网络摄像头拍摄的照片来达到合理的程度或准确性?

考虑到您拥有的数据量,更好的方法是使用迁移学习,而不是从头开始训练。你可以从ImageNet的一个预先训练好的模型开始,比如Resnet或Inception。但我怀疑在大型人脸数据集上训练的模型可能会表现得更好。您可以从这里查看facenet的实现。只能训练最后一个完全连接的层权重,并"冻结"早期的层。如何使用Facenet进行分类可以在这里找到。

最新更新