python开发构建基于CNN的人脸识别系统

卷积神经网络在图像处理领域中早就是独树一帜的存在,今天正好有时间就想着基于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

整体来看效果还是很不错的。

猜你喜欢

转载自blog.csdn.net/Together_CZ/article/details/130381624