卷积神经网络在图像处理领域中早就是独树一帜的存在,今天正好有时间就想着基于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 support
0 0.80 0.77 0.78 26
1 0.93 0.96 0.94 70
2 0.95 0.90 0.92 39
3 0.90 0.94 0.92 139
4 0.72 0.62 0.67 37
5 0.81 0.77 0.79 22
6 0.75 0.43 0.55 14
7 0.92 0.92 0.92 12
8 0.77 0.77 0.77 13
9 0.70 0.94 0.80 17
10 0.83 0.91 0.87 11
11 0.86 0.86 0.86 44
accuracy 0.86 444
macro avg 0.83 0.82 0.82 444
weighted avg 0.86 0.86 0.86 444
整体来看效果还是很不错的。