Skip to content

ARS4EVER/Face-Image-Recognition-System-Based-on-Python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 

Repository files navigation

1. 引言

随着人工智能技术的快速发展,人脸识别作为计算机视觉领域的重要研究方向,在安防监控、身份验证、人机交互等领域展现出广泛的应用前景。传统的人脸识别方法主要依赖手工设计的特征提取算法,这些方法在复杂环境下往往表现不佳。近年来,深度学习特别是卷积神经网络的发展为人脸识别提供了新的解决方案。

深度学习方法能够自动学习图像的层次化特征表示,避免了手工设计特征的局限性。卷积神经网络通过其特有的局部连接和权值共享特性,能够有效捕捉图像的空间特征,在保持平移不变性的同时大大减少了模型参数数量。这些优势使得基于CNN的人脸识别系统在准确性和鲁棒性方面都取得了显著进展。

本实验旨在设计一个基于CNN的人脸识别系统,探索深度学习在人脸识别任务中的应用。通过合理的网络架构设计和训练策略,实现高效准确的人脸识别。研究成果不仅对推动人脸识别技术的发展具有重要意义,也为相关应用领域提供了实用的技术支持。

2. 原理

一个基于卷积神经网络(CNN)的人脸识别系统。该系统使用深度学习技术对人脸图像进行特征提取和分类。在图像预处理阶段,系统采用LANCZOS算法对输入的人脸图像进行分辨率调整,将原始57x47像素的图像统一调整为32x30像素,这样的尺寸标准化有助于减少计算复杂度并保持图像的关键特征。

该CNN模型的架构包含两个卷积层和池化层的组合。第一层使用32个3x3的卷积核进行特征提取,第二层使用64个3x3的卷积核进行更深层的特征学习。每个卷积操作后都使用ReLU激活函数引入非线性变换,并通过2x2的最大池化层降低特征图的空间维度,提取最显著的特征。模型的全连接层包含1024个神经元,通过Dropout层以0.5的比例随机丢弃神经元连接,有效防止过拟合。输出层使用Softmax激活函数将结果映射为40个类别的概率分布。

模型的训练过程采用了批量梯度下降算法,每批次处理20个样本,共训练10个周期。训练数据被划分为训练集和验证集,其中20%的数据用于验证。模型使用交叉熵作为损失函数,用Adam优化器自适应调整学习率。通过绘制损失曲线和准确率曲线,可以直观地观察模型的训练过程和性能变化。这种可视化方法有助于诊断模型是否存在过拟合或欠拟合问题,并为模型调优提供依据。

系统的评估采用了混淆矩阵等度量指标,通过比较预测类别和实际类别来评估模型的分类性能。代码还包含了结果可视化部分,将测试图像与预测结果一同展示,使得模型的预测结果更加直观。这种端到端的深度学习方法相比传统的特征工程方法,能够自动学习图像的层次化特征表示,在人脸识别任务中展现出较好的性能。

3. 程序实现

image-20241217225350959

定义了一个名为resize_images的函数,用于处理图像分辨率的调整。函数接收两个参数:images(输入图像)和new_size(目标分辨率大小)。代码通过判断输入图像的维度来区分处理单张图像和批量图像的逻辑。当images.shape的长度为1时,表示处理单张图像,代码会将图像数组重塑为57x47的形状,并将像素值乘以256转换为uint8类型,然后使用PIL库的resize方法配合LANCZOS算法进行分辨率调整,最后将调整后的图像展平并归一化处理。

当输入为批量图像时,代码创建一个空列表resized_images,通过循环遍历每张图像,对每张图像执行与单张图像相同的处理流程:重塑维度、转换类型、调整分辨率、展平和归一化。处理完所有图像后,将结果列表转换为NumPy数组返回。这种设计使得函数能够灵活处理单张和多张图像的分辨率调整需求,同时保证了处理结果的一致性。

image-20241217225403012

定义了一个名为create_model的函数,用于构建卷积神经网络模型。该函数接收input_shape参数,用于指定输入数据的维度。模型采用Sequential顺序模型,通过逐层堆叠的方式构建网络结构。网络的第一层是具有32个卷积核的卷积层,卷积核大小为3x3,使用ReLU激活函数,并采用same填充方式保持特征图大小不变。随后是最大池化层,池化窗口为2x2,同样使用same填充。第二个卷积层包含64个3x3卷积核,配置与第一层相似。

在卷积层之后,使用Flatten层将特征图展平为一维向量,便于后续全连接层处理。模型的全连接部分包括一个具有1024个神经元的Dense层,使用ReLU激活函数,以及一个dropout比率为0.5的Dropout层用于防止过拟合。输出层是具有40个神经元的Dense层,使用softmax激活函数进行多分类。模型使用Adam优化器,损失函数为分类交叉熵,评估指标为准确率。这种架构设计适合处理图像分类任务,特别是在人脸识别等领域表现良好。

image-20241217225413152

定义了图像分辨率为32x30像素,并设置了相应的输入形状。在数据集划分部分,代码将faces数据集分为训练集(X_train)和测试集(X_test),其中除最后一个样本外的所有数据用于训练,最后一个样本作为测试数据。标签数据(labels)也按照相同方式进行划分,得到y_train和y_test。

使用resize_images函数对训练集和测试集进行分辨率调整,确保所有图像具有统一的尺寸。模型训练部分设置了关键参数:训练轮数(epochs)为10,批次大小(batch_size)为20,验证集比例(validation_split)为0.2。这些参数的设置对模型的训练效果有直接影响,validation_split=0.2表示将20%的训练数据随机划分出来作为验证集,用于评估模型在训练过程中的泛化能力。

image-20241217225420894

对测试图像进行预处理和预测,其中X_test_resized被重塑为符合模型输入要求的四维张量格式(1, resolution[1], resolution[0], 1),通过model.predict()方法获得预测结果。使用np.argmax()函数分别从预测结果和真实标签中获取类别索引,并将这些结果打印输出。

代码的可视化部分使用matplotlib库创建了一个5x5大小的图形窗口,通过imshow函数显示测试图像。图像被重塑为原始尺寸(57x47),并使用灰度颜色映射显示。图像标题包含了预测类别和实际类别的信息,通过设置axis('off')移除坐标轴,使显示更加清晰。这种可视化方式直观地展示了模型的预测效果,便于评估模型性能。

image-20241217225427742

使用课堂上学习过的Matplotlib库绘制深度学习模型训练过程中的损失函数和准确率变化曲线。代码创建了一个12x4大小的图形窗口,并将其分为左右两个子图。左侧子图用于显示模型训练过程中的损失函数变化,包括训练集损失(Training Loss)和验证集损失(Validation Loss)两条曲线,通过不同颜色进行区分,并添加了相应的图例说明。

右侧子图展示了模型训练过程中的准确率变化情况,包括训练集准确率(Training Accuracy)和验证集准确率(Validation Accuracy)。两个子图都设置了适当的标题、x轴标签(Epoch)和y轴标签(Loss/Accuracy)。最后通过tight_layout()函数自动调整子图之间的间距,确保图形布局美观,通过show()函数将图形显示出来。这种可视化方式能够直观地展示模型在训练过程中的性能变化,帮助我们评估模型的训练效果。

4. 结果分析

image-20241217225452773

图片顶部的标题显示了预测结果和实际类别,两者都是39,表明模型在这个测试样本上实现了准确预测。图像中可以观察到一个正面朝向的人像,尽管图像分辨率不高,但仍能清晰辨识出面部的主要特征。图像的灰度层次较为丰富,显示出良好的明暗对比,这有助于模型提取面部特征进行识别。模型的成功预测说明即使在低分辨率的情况下,所构建的卷积神经网络仍能有效捕捉和识别人脸的关键特征。

image-20241217225501193

从训练过程的积极方面来看,这两张图展示了模型具有比较强大的学习能力。左图中的训练损失曲线(蓝线)呈现出理想的下降趋势,从初始的3.5左右持续下降到接近0,表明模型成功地从训练数据中学习到了有效的特征表示。这种显著的损失下降反映出模型的优化过程运行良好,网络结构设计合理,能够有效捕捉数据中的规律。

右图中的训练准确率(蓝线)更加令人鼓舞,它展现出模型出色的分类能力。准确率从最初的接近0快速上升,在第6个epoch左右就达到了90%以上的高准确率。这表明模型具有充分的容量来学习复杂的人脸特征,并能够准确地将这些特征映射到正确的类别。这种优秀的训练表现为后续的模型优化提供了良好的基础,通过适当的调整和优化,模型有望在保持高分类能力的同时提升其泛化性能。

5. 总结

本文介绍了一个基于卷积神经网络的人脸识别系统,该系统在图像预处理阶段使用LANCZOS算法进行分辨率调整,将57x47像素的原始图像统一调整为32x30像素。系统采用了两层卷积层和池化层的组合架构,配合ReLU激活函数和Dropout层,有效地提取图像特征并防止过拟合现象。

在程序实现方面,系统通过resize_images函数处理图像分辨率调整,create_model函数构建CNN模型结构。训练过程采用批量梯度下降算法,每批次处理20个样本,训练10个周期,其中20%的数据用于验证。系统使用交叉熵损失函数和Adam优化器,通过损失曲线和准确率曲线直观展示训练过程。

实验结果显示,模型在测试样本上实现了准确预测,预测类别与实际类别(39)完全匹配。训练过程中,损失函数呈现理想的下降趋势,从3.5降至接近0;准确率在第6个epoch达到90%以上,表明模型具有良好的特征学习和分类能力。这种基于深度学习的端到端方法相比传统特征工程方法,展现出更强的自动特征提取能力和分类性能。

尽管测试图像分辨率较低,但模型仍能准确识别人脸特征,这证明了所构建的CNN模型具有较强的鲁棒性。通过可视化方法展示预测结果和训练过程,不仅直观呈现了模型的性能,也为后续的模型优化提供了重要参考。这个系统为人脸识别领域提供了一个有效的解决方案,具有良好的实用价值。

About

基于CNN的人脸识别系统

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages