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

news/2024/11/29 9:37:47/

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

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


http://www.ppmy.cn/news/58471.html

相关文章

linux命令之iostat详解

iostat 监视系统输入输出设备和CPU的使用情况 推荐Linux命令在线工具:linux在线查询工具 补充说明 iostat命令 被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,ios…

Spring Boot比Spring多哪些注解?

Spring Boot是建立在 Spring 框架之上的,它的目标是简化 Spring 应用程序的开发和部署。Spring Boot 通过自动配置和约定优于配置的原则,大大简化了 Spring 应用程序的配置和开发过程。 尽管Spring Boot使用了很多Spring的核心功能和注解,但…

(1)QT基础铺垫

目录 1.Qt特性 2. 新建项目 3. 工作目录与构建目录 4. 工作目录 4.1 .pro 项目配置文件 4.2 dialog.h 4.3 dialog.cpp 4.4 main.cpp 5. 帮助文档 6. 调试信息 1.Qt特性 Qt经常被当作是一个基于c语言的gui开发框架,但是这并不是qt的全部,除了开…

微服务知识2

CAP和BASE是分布式必备理论基础 CAP理论 一致性(C):写操作之后进行读操作无论在哪个节点都需要返回写操作的值 可用性(A):非故障的节点在合理的时间内返回合理的响应 分区容错性(P):当出现网络分区后,系统能够继续工作&#x…

【C++】实现两个线程交替打印1-100

文章目录 实现两个线程交替打印1-100 实现两个线程交替打印1-100 尝试用两个线程交替打印1-100的数字,要求一个线程打印奇数,另一个线程打印偶数 该题目主要考察的就是线程的同步和互斥: 互斥:两个线程都在向控制台打印数据,为了保证两个线程的打印数据不会相互影响…

【IoT】嵌入式设计:基于CPLD设计的可调数字时钟

目录 说明 一 总体设计方案 1.2 设计原理 二 各模块说明 2.1设计思路及步骤

【源码解析】流控框架Sentinel源码解析

Sentinel简介 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 核心概念 资源 资源…

高效学习方法和工具推荐,让你事半功倍!

本文介绍了五种高效学习方法,包括制定详细的学习计划、集中注意力、不断复习、采用多种学习方式和利用小休息。同时,还推荐了五个高效学习工具和平台,包括Coursera、Duolingo、Quizlet、Khan Academy和Anki,让你在学习中事半功倍&…