人脸表情识别 | Python+Keras+PyQt5
参考学习文章:
Keras|基于深度学习的人脸表情识别系统
PyQt5+QtDesigner编写摄像头界面程序(一)——pyqt5、qtdesigner安装和环境设置
本次设计参考以上两篇文章,非常感谢博主们的分享,我收获良多!
一、前言
(一)本设计简介
本设计是基于Python的人脸表情识别和情绪分类,在TensorFlow框架下,使用其内部高级API——Keras搭建训练模型,并利用OpenCV库中的相关函数共同实现人脸识别、人脸表情识别、情绪分类的目的,最后借助PyQt5增加界面,通过界面可对输入的画面进行调整颜色、调整曝光度、亮度等操作,还可以通过“开始”、“暂停”、“结束”功能控制识别过程的通断,通过“录像”功能保存所需的画面,从而使整个设计更友好、更加人性化。
(二)语言选择
本设计选用相对简单易上手的Python语言,其具体的介绍可查看
Python百度百科
,此处不做过多陈述。
(三)环境选择
1.TensorFlow简介
具体内容请查看
TensorFlow官网
。TensorFlow是Google开源的基于数据流图的机器学习框架,支持python和c++程序开发语言。TensorFlow支持卷积神经网络(CNN)和循环卷积网络(RNN),以及RNN的一个特例长短期记忆网络(LSTM),以上都是目前在计算机视觉、语音识别、自然语言处理方面最流行的深度神经网络模型。
在TensorFlow官网中介绍了TensorFlow的以下六大优势:
●高度灵活性
●真正的可移植性
●将科研和产品结合在一起
●自动求微分
●多语言支持
●最优化性能
因为本设计仅使用TensorFlow框架作为程序运行环境,主要是使用其高级API——Keras,因此不过多介绍。
2.Keras简介
具体内容请查看
Keras官网
。Keras是一个高级的Python神经网络框架。Keras已经被添加到TensorFlow中,成为其默认的框架,作为TensorFlow高级API之一。Keras作为TensorFlow的高层封装,可以与TensorFlow联合使用,用它快速搭建原型。
Keras是高度封装的,非常适合新手使用,代码更新速度较快,有大量公开示例代码,文档和讨论区也比较完善。
在Keras官网描述了其以下几个有点:
●模块化:模型的各部分,如神经层、成本函数、优化器、初始化、激活函数、规范化都是独立的模块,可以组合在一起来创建模型。
●极简主义:每个模块都保持简短和简单。
●易扩展性:很容易添加新模块,因此Keras更适合做进一步的高级研究。
●使用Python语言:模型使用Python实现,非常易于调试和扩展。
(三)本设计相关知识学习
Python学习笔记(一)
Python+OpenCV(一)——基础操作
Python+Tensorflow学习(二)——初试keras
(四)本设计环境搭建步骤
Win10+Python3.6.5+Anaconda3-5.2.0+Tensorflow安装
二、本设计成果展示
(一)无PyQt5界面:
(二)与PyQt5界面结合:
三、本设计主要代码结构讲解
本设计主要代码结构整体上分为两大部分,在各部分再细分以下几点:
代码主要结构主要分为两大部分:
一、人脸表情识别和情绪分类部分
(一)卷积神经网络模型的训练
1数据集的获取
2.加载pre-model网络与权重;
3.训练模型
4.保存训练模型
(二)面部表情识别
1.打开摄像头
2.人脸识别
3.图像预处理
4.人脸表情识别
5.情绪分类
二、PyQt5界面创建
1.PyQt+QtDesigner及opencv等工具的安装与设置;
2.基于QtDesigner的界面设计;
3.各部分程序的编写;
4.笔记本摄像头的读取、显示和参数控制;
以下逐点介绍。
(一)人脸表情识别和情绪分类部分
在人脸表情识别和情绪分类部分分为过程:卷积神经网络模型的训练与面部表情的识别。
1.卷积神经网络模型的训练
1.1数据集的获取
(1)数据集下载
为了节约素材收集时间,同时也为更公平的评价模型以及人脸表情识别分类器的性能,我们采用使用公开的数据集。
本次设计使用了
kaggle面部表情识别竞赛所使用的fer2013人脸表情数据库
,图片统一以csv的格式存储,利用python可将csv文件转为单通道灰度图片,并根据标签将其分类在不同的文件夹中。
(2)数据集格式转换
首先根据用途label分成三个csv(分别是训练集(train)、测试集(test)、验证集(val));
# -*- coding = utf-8 -*-
# @Time : 2021/8/7 09:12
# @Author : 西兰花
# @File : convert_fer2013.py
# @Software : PyCharm
"""
根据用途label分成三个csv(分别是训练集(train)、测试集(test)、验证集(val));
"""
import csv
database_path = 'F:/test05/表情识别/表情识别/emotion_classifier-master/fer2013/'
datasets_path = './fer2013/'
csv_file = database_path+'fer2013.csv'
train_csv = datasets_path+'train.csv'
val_csv = datasets_path+'val.csv'
test_csv = datasets_path+'test.csv'
with open(csv_file) as f:
csvr = csv.reader(f)
header = next(csvr)
print(header)
rows = [row for row in csvr]
trn = [row[:-1] for row in rows if row[-1] == 'Training']
csv.writer(open(train_csv, 'w+'), lineterminator='\n').writerows([header[:-1]] + trn)
print(len(trn))
val = [row[:-1] for row in rows if row[-1] == 'PublicTest']
csv.writer(open(val_csv, 'w+'), l