卷积神经网络在图像处理领域中早就是独树一帜的存在,今天正好有时间就想着基于CNN开发构建一个人脸识别系统,首先看下效果图:
数据集来源于LFW数据集,简单看下本文使用的小批量的数据集如下:
一共有12个人的图像数据,随机看下几个如下所示:
【Ariel_Sharon】
【Donald_Rumsfeld】
【Gerhard_Schroeder】
【Jean_Chretien】
【Serena_Williams】
接下来我们需要对原始数据进行解析处理,核心实现如下所示:
# 图片
one_img = cv2.imread(one_path)
one_img = cv2.resize(one_img, (224, 224))
one_img = one_img.transpose((2, 0, 1))
# 标签
one_label = one_path.split("/")[1]
print("one_path: ", one_path, "one_label: ", one_label)
one_pic_classes = one_label
one_y = getY(one_pic_classes)
处理完成后得到了可用于模型训练使用的dataset.h5数据集文件。
模型实现如下所示:
def initModel(h=16, w=10, way=1):"""模型初始化"""input_shape = (h, w, way)model = Sequential()model.add(Conv2D(64,(3, 3),strides=(2, 2),input_shape=input_shape,padding="same",activation="relu",kernel_initializer="uniform",))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(128,(3, 3),strides=(2, 2),padding="same",activation="relu",kernel_initializer="uniform",))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(256,(3, 3),strides=(2, 2),padding="same",activation="relu",kernel_initializer="uniform",))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(256, activation="relu"))model.add(Dropout(0.1))model.add(Dense(512, activation="relu"))model.add(Dropout(0.15))model.add(Dense(numbers, activation="softmax"))model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])print(model.summary())return model
训练完后绘制计算了模型的混淆矩阵,如下所示:
模型训练过程准确率曲线和损失曲线对比如下所示:
从四个指标对模型进行评估计算,结果如下所示:
precision recall f1-score support0 0.80 0.77 0.78 261 0.93 0.96 0.94 702 0.95 0.90 0.92 393 0.90 0.94 0.92 1394 0.72 0.62 0.67 375 0.81 0.77 0.79 226 0.75 0.43 0.55 147 0.92 0.92 0.92 128 0.77 0.77 0.77 139 0.70 0.94 0.80 1710 0.83 0.91 0.87 1111 0.86 0.86 0.86 44accuracy 0.86 444macro avg 0.83 0.82 0.82 444
weighted avg 0.86 0.86 0.86 444
整体来看效果还是很不错的。