基于OpenCV+PyQt5的人脸表情识别系统设计

文末获取完整源码源文件+配套论文报告+说明文件+远程配置等

在这里插入图片描述
在这里插入图片描述


摘 要:随着信息技术的飞速进步,人类对于情感理解与交互的需求日益增长,人脸面部表情识别技术成为了科研界与工业界共同瞩目的焦点。20世纪末至21世纪初,随着计算机视觉和人工智能技术的突破,人脸面部表情识别技术逐渐从实验室走向实际应用,开启了人机交互新篇章。本文研究了基于OpenCV的人脸表情识别系统,旨在通过分析面部特征变化来解读个体情绪状态。系统使用Python语言开发,结合了FER-2013数据集训练的卷积神经网络模型,实现了对图片、视频和实时影像中人脸的检测与表情预测。通过PyQt5库,系统提供了一个用户友好的操作界面,将人脸检测、表情识别等功能集于一体。实验结果表明,深度学习方法在表情识别的准确率上要优于传统机器学习方法。

在这里插入图片描述


1 引言

篇幅有限,详见文末


2 项目目标和内容

2.1 目标和内容
2.1.1 项目目标
开发一个高效、准确且用户友好的人脸表情识别系统。该系统将能够处理静态图片、视频文件以及实时摄像头捕获的影像,实现对多种基本人脸表情(如快乐、悲伤、惊讶、愤怒等)的自动识别。

2.1.2 项目内容
(1)从FER-2013、JAFFE、CK+三个公开人脸表情数据集中选择合适的数据集。
(2)使用Python,借助OpenCV来编写代码对图片、视频、实时影像中的人脸进行检测,并将检测到的人脸通过灰度化等的转换输入到一中保存下来的模型中进行预测;
(3)使用HOG提取人脸的特征,并通过SVM、KNN等机器学习模型进行训练并获取验证准确率。
(4)构建一个简单的卷积神经网络,使用选取的数据集对其进行训练并获取训练过程中的准确率,并与机器学习方法作对比,择优使用;
(5)通过PyQt5构建系统界面,设计并实现一个直观的用户界面,将三个维度的人脸表情识别功能集成到一个统一的系统中并输出预测的可视化结果。

2.2 相关任务
(1)收集并分析FER-2013、JAFFE、CK+三个人脸表情数据集,选择出一个合适的数据集,为模型训练提供数据基础;
(2)使用OpenCV[1]读取数据集中的图片,对其进行灰度化、归一化等处理,供模型训练使用。
(3)通过scikit-learn库提供的API,使用HOG技术提取OpenCV获取到的人脸数据的特征,并分别通过SVM、KNN等机器学习的分类器[2]对这些数据进行训练并获取验证准确率。
(2)使用keras库构建一个卷积神经网络模型[3];
(3)使用获取到的人脸数据对构建好的卷积神经网络进行训练,保存模型权重并获取准确率,将之与机器学习方法进行比较,择优作为后续预测用的模型;
(4)编写通过OpenCV检测图片、视频、实时影像中的人脸,然后框选出人脸区域并预测该人脸表情的代码;
(5)使用PyQt5的Qt Designer编写系统界面;
(6)将识别的功能链接到界面上的控件,并将图片识别的结果输出到界面上;


3 开发环境以及工具和技术的介绍

篇幅有限,详见文末


4 项目分析

4.1 项目概述
本项目名称为基于Python和OpenCV的人脸表情识别系统,在人工智能技术快速发展,人脸表情识别技术应用越来越广泛背景下,旨在开发一个基于Python编程语言和OpenCV库的人脸表情识别系统,该系统能够通过用户界面(UI)实现对图片、视频文件以及实时摄像头视频流中的人脸进行检测和表情识别。本项目的目标是开发一个用户友好的界面,通过该界面用户可以方便地选择图片或视频文件进行人脸表情识别,同时也能够实时地从摄像头获取视频流并进行表情识别。

4.2 项目性能需求
(1)准确性:系统应能够准确识别多种基本人脸表情,如快乐、悲伤、惊讶、愤怒等。
(2)实时性:对于视频流的实时表情识别,系统应能够保持低延迟,以便于实时反馈。
(3)稳定性:系统在处理数据时,应保持稳定,不出现崩溃或异常。
(4)用户界面友好性: 界面应简洁直观,易于用户操作。
(5)扩展性:系统设计应考虑未来可能的功能扩展,如增加新的识别算法或支持更多的表情类型。

4.3 项目模块和流程
4.3.1 项目模块
(1)用户界面模块(UI):使用PyQt5开发,负责与用户的交互,包括功能按钮、图片显示区域、结果显示区域等。
(2)图像处理模块:利用OpenCV进行图像的读取、处理和显示。
(3)人脸检测模块:负责从图片或视频流中检测出人脸。
(4)表情识别模块:对检测到的人脸进行表情分析,并输出识别结果。
(5)文件操作模块: 负责处理文件的读取和保存。
(6)摄像头控制模块: 负责控制摄像头的开启和关闭,以及视频流的获取。
4.3.2 项目流程
(1)启动程序:用户启动程序,UI界面加载。
(2)选择操作:用户通过UI选择是加载图片、视频文件还是打开摄像头。
(3)图像/视频处理: 根据用户选择,系统调用相应的模块进行图像或视频的处理。
(4)人脸检测: 在图像或视频流中检测出人脸。
(5)表情识别: 对检测到的人脸进行表情识别。
(6)结果显示: 将识别结果通过UI显示给用户。
(7)循环或退出: 用户可以选择继续进行其他操作或退出程序。
4.4 项目进度安排(详见文末)


5 项目实现

5.1 环境搭建
本项目在Windows 11操作系统上进行开发。首先,从Python官网下载并安装了Python 3.8.9版本,并在安装过程中勾选了“Add Python to PATH”选项,以便在命令行中直接使用Python。接着,下载并安装了JetBrains PyCharm 2024作为开发工具,并初始化了一个Pure Python项目。通过PyCharm的Settings创建了一个虚拟环境,并在该环境中安装了项目开发所需的第三方库,包括OpenCV、PyQt5、TensorFlow和tensorflow-gpu等,以确保开发环境的稳定性和依赖管理。为了充分利用GPU加速训练,从NVIDIA官网下载并安装了CUDA Toolkit和cuDNN库。这些工具的安装确保了模型训练的高效率和程序运行的流畅性。

5.2 数据集选取
在Kaggle上搜索人脸表情识别(Facial Expression Recognition)的数据集,最终锁定在三个经典的数据集:FER-2013,JAFFE,CK+。在观察了数据集的结构后,考虑到JAFFE、CK+数据集的图片数量均较少,且JAFFE数据集中均为女性,通过这样的数据集训练出来的模型可能泛化性能较差,因此选择了FER-2013数据集。

5.3 模型搭建与训练
5.3.1 传统机器学习方法
本项目最初采用传统机器学习的方法,通过HOG(Histogram of Oriented Gradients,方向梯度直方图)方法来提取图片中人脸的特征,并通过scikit-learn库来构建分类器,对FER-2013数据集进行训练,包括支持向量机(SVM):正则化参数设置为2,核函数类型为径向基函数(Radial Basis Function, RBF),RBF核的gamma参数设置为10,最终训练准确率约为0.31;K-最近邻算法(K-Nearest Neighbors, KNN):将其关键参数n_neighbors设置为2,最终用训练准确率约为0.48,均不是很理想。具体结果如下。
在这里插入图片描述
在这里插入图片描述
从图5-2可以看出SVM分类器对于表情的识别极易混淆为happy类,可以看到绝大部分的样本都被归类为happy类,且只有小部分为真正类(TP类),其他类别被正确预测只有369个样本;反观KNN模型,各类别的混淆情况相对平均,其中disgust类的分类准确率最低,仅有约0.07的准确率。综上,机器学习方法在FER-2013数据集上的确实较差。

5.3.2 深度学习方法
在尝试了传统机器学习方法发现效果不佳后,本项目转而采用深度学习的方法,首先通过keras库参考论文构建了一个简单的卷积神经网络模型[6],模型由一层输入层(指定输入数据的形状),一层卷积层:(使用32个过滤器,大小为1x1,步长为1,激活函数为ReLU),一个包含两个卷积层(分别使用64个过滤器,大小为3x3和5x5,步长为1,激活函数为PreLU)和一个最大池化层(大小为2x2,步长为2,用于降低特征维度)的块,一个结构类似但包含不同大小卷积核的块,三个全连接层(用于学习特征之间的非线性组合)以及一个Dropout层(用于减少过拟合,通过在训练过程中随机丢弃一部分神经元)组成。模型结构示意图如下。
在这里插入图片描述
模型构建完成后,通过tensorflow.keras.preprocessing.image、tqdm库提供的方法来读取FER数据集中的图片并将其灰度化,生成可输入模型中训练的训练集、测试集与验证集的数据。接着初始化该模型,利用keras库定义一个随机梯度下降(SGD)优化器,学习率设置为0.01,学习率衰减率为1e-6,动量为0.9,用于更新神经网络的权重以最小化损失函数;将模型的损失函数设置为分类交叉熵(categorical_crossentropy,适用于多类别分类问题),评估指标为准确率;将模型回调函数设置为在验证集准确率最高时保存模型权重(便于后面直接加载该权重文件进行预测),最后通过keras库提供的model.fit方法进行模型训练,训练前利用tensorflow库显式制定使用GPU进行训练以提高训练效率,最终通过matplotlib绘制训练过程中的accuracy曲线以及loss曲线,结果如下。

在这里插入图片描述
对模型进行了100个epoch的训练,batch size为32。loss曲线图反映了模型在训练过程中损失函数值的变化情况。损失函数是衡量模型预测值与真实值之间差异的指标,其值越小,表示模型的预测越准确。从图5-4中可以看出,训练集上的loss值随着epoch的增加而逐渐减小,这表明模型在训练过程中不断优化,预测误差在减少。同时,验证集上的loss值也呈现出下降趋势,但下降速度稍慢,这可能是由于模型在训练集上过拟合导致的。然而,整体上,验证集的loss值保持相对稳定,表明模型在未见数据上也具有较好的预测性能。accuracy曲线图显示了模型在训练集和验证集上的表现如何随着训练epoch的增加而变化。从图中可以观察到,随着训练的进行,训练集上的准确率稳步提升,这表明模型在不断学习并适应训练数据。同时,验证集上的准确率也呈现上升趋势,尽管提升速度稍慢,但总体上与训练集保持一致。这表明模型具有良好的泛化能力,能够将从训练数据中学到的知识应用到未见过的数据上。最终,模型在验证集上达到了约0.62的准确率,这是一个相对满意的结果,说明该模型的效果要优于传统机器学习的方法,因而后续的表情识别均采用该模型进行。

5.4 人脸检测与识别
本项目原本采用OpenCV库中自带的Haar Cascade进行人脸检测,但结合本项目构建的模型进行预测的效果较为不理想。因此,在查阅资料后,转而采用另一个开源的人脸检测模型BlazeFace,首先通过OpenCV读取图片并将其转为灰度图,然后将转换后的灰度图输入到blazeface[7]的blaze_detect方法中获得检测到的若干个人脸,对获取到的每一个人脸进行遍历,通过前文构建的模型的predict方法进行预测,输出可能性最高的那个类别作为识别的结果。
对于视频和摄像头的实时影像中的人脸识别,采取的方法类似,对于视频,首先通过OpenCV获取打开指定的视频文件,然后读取视频中的每一帧的图像,对该图像进行人脸检测,如果检测到人脸则将该人脸进行一定的处理后通过模型进行预测,将预测到的结果通过OpenCV将人脸的区域框选出来并在方框附近呈现出预测的结果;对于摄像头的实时影像的人脸识别,首先通过OpenCV获取本设备的指定摄像头,然后对摄像头中的实时影像流的每一帧图像进行读取,后续的操作与视频文件的识别一致。

5.5 编写UI界面
通过PyCharm的Setting安装PyQt5-tools库,接着在虚拟环境的site-pakage中找到安装的PyQt5-tools库中的Qt designer.exe程序。Qt designer是一个由Qt框架提供的强大可视化工具,它允许开发者通过拖放的方式设计和构建图形用户界面(GUI),这大大地方便了本项目的UI界面设计。通过拖放控件构建好用户界面后,通过pyuic将Qt designer生成的.ui文件转换为.py的Python代码文件。转换完成后,将已经编写好的人脸表情识别代码与界面上的控件相关联,以形成一个完整的可操作的人脸表情识别系统。系统界面如下。
在这里插入图片描述


6 项目功能展示

(1)人脸表情图片识别:
在这里插入图片描述
(2)视频文件识别:
在这里插入图片描述


点击下方小卡片,那边发送“资源”两个字

获取完整源码源文件+配套论文报告+说明文件+远程配置等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶绿体不忘呼吸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值