⼈脸表情识别和情绪分类Python+TensorFlow(框架)+Keras+PyQt5
⼈脸表情识别 | Python+Keras+PyQt5
参考学习⽂章:
本次设计参考以上两篇⽂章,⾮常感谢博主们的分享,我收获良多!学习心得怎么写
⽬录
⼀、前⾔
(⼀)本设计简介
本设计是基于Python的⼈脸表情识别和情绪分类,在TensorFlow框架下,使⽤其内部⾼级API——Keras搭建训练模型,并利⽤OpenCV 库中的相关函数共同实现⼈脸识别、⼈脸表情识别、情绪分类的⽬的,最后借助PyQt5增加界⾯,通过界⾯可对输⼊的画⾯进⾏调整颜⾊、调整曝光度、亮度等操作,还可以通过“开始”、“暂停”、“结束”功能控制识别过程的通断,通过“录像”功能保存所需的画⾯,从⽽使整个设计更友好、更加⼈性化。
(⼆)语⾔选择
本设计选⽤相对简单易上⼿的Python语⾔,其具体的介绍可查看,此处不做过多陈述。
(三)环境选择
1.TensorFlow简介
具体内容请查看。TensorFlow是Google开源的基于数据流图的机器学习框架,⽀持python和c++程序开发语⾔。TensorFlow⽀持卷积神经⽹络(CNN)和循环卷积⽹络(RNN),以及RNN的⼀个特例长短期记忆⽹络(LSTM),以上都是⽬前在计算机视觉、语⾳识别、⾃然语⾔处理⽅⾯最流⾏的深度神经⽹络模型。
在TensorFlow官⽹中介绍了TensorFlow的以下六⼤优势:
●⾼度灵活性
●真正的可移植性
●将科研和产品结合在⼀起
●⾃动求微分
●多语⾔⽀持
●最优化性能
因为本设计仅使⽤TensorFlow框架作为程序运⾏环境,主要是使⽤其⾼级API——Keras,因此不过多介绍。
2.Keras简介
具体内容请查看。Keras是⼀个⾼级的Python神经⽹络框架。Keras已经被添加到TensorFlow中,成为其默认的框架,作为TensorFlow ⾼级API之⼀。Keras作为TensorFlow的⾼层封装,可以与TensorFlow联合使⽤,⽤它快速搭建原型。
Keras是⾼度封装的,⾮常适合新⼿使⽤,代码更新速度较快,有⼤量公开⽰例代码,⽂档和讨论区也⽐较完善。
在Keras官⽹描述了其以下⼏个有点:
●模块化:模型的各部分,如神经层、成本函数、优化器、初始化、激活函数、规范化都是独⽴的模块,可以组合在⼀起来创建模型。
●极简主义:每个模块都保持简短和简单。
●易扩展性:很容易添加新模块,因此Keras更适合做进⼀步的⾼级研究。
●使⽤Python语⾔:模型使⽤Python实现,⾮常易于调试和扩展。
(三)本设计相关知识学习
(四)本设计环境搭建步骤
⼆、本设计成果展⽰
(⼀)⽆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)数据集下载
为了节约素材收集时间,同时也为更公平的评价模型以及⼈脸表情识别分类器的性能,我们采⽤使⽤公开的数据集。
本次设计使⽤了,图⽚统⼀以csv的格式存储,利⽤python可将csv⽂件转为单通道灰度图⽚,并根据标签将其分类在不同的⽂件夹中。
极简python快速入门教程
(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 = ader(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+'), lineterminator='\n').writerows([header[:-1]] + val)
sql数据库学习方法print(len(val))
tst = [row[:-1] for row in rows if row[-1] == 'PrivateTest']
csv.writer(open(test_csv, 'w+'), lineterminator='\n').writerows([header[:-1]] + tst)
print(len(tst))
⽂件夹“test”存放测试集数据;51虚拟机
⽂件夹“train”存放训练集数据;
⽂件夹“valt”存放验证集数据;
各⽂件夹中将图⽚分为七种,并存放在相应标签(label)中,标签“0”⾄“7”分别对应情绪“angry”、 “disgust”、“fear”、“happy”、“sad”、“surprise”、“neutral”。
将图像转换为单通道灰度图:
# -*- coding = utf-8 -*-
# @Time : 2021/8/7 09:18
# @Author : 西兰花
# @File : convert_csv2gray.py
# @Software : PyCharm
"""
将图像转换为单通道灰度图
"""
import csv
import os
from PIL import Image
import numpy as np
datasets_path = r'.\fer2013'
volume是什么意思飞机上train_csv = os.path.join(datasets_path, 'train.csv')
val_csv = os.path.join(datasets_path, 'val.csv')
test_csv = os.path.join(datasets_path, 'test.csv')
train_set = os.path.join(datasets_path, 'train')
val_set = os.path.join(datasets_path, 'val')
test_set = os.path.join(datasets_path, 'test')
for save_path, csv_file in [(train_set, train_csv), (val_set, val_csv), (test_set, test_csv)]:
if not ists(save_path):
os.makedirs(save_path)
num = 1
with open(csv_file) as f:
csvr = ader(f)
header = next(csvr)
for i, (label, pixel) in enumerate(csvr):
pixel = np.asarray([float(p) for p in pixel.split()]).reshape(48, 48)
subfolder = os.path.join(save_path, label)
if not ists(subfolder):
os.makedirs(subfolder)
im = Image.fromarray(pixel).convert('L')
image_name = os.path.join(subfolder, '{:05d}.jpg'.format(i))
# print(image_name)
im.save(image_name)
单通道灰度图:
1.2搭建卷积神经⽹络模型
数据集已成功获取,并按照label进⾏分类,第⼆步是建⽴卷积神经⽹络模型(CNN),本步骤是实现⼈脸表情识别关键⼀步。
在前⼈的基础上,本设计在输⼊层后加⼊了1*1的卷积层,使输⼊增加了⾮线性的表⽰、加深了⽹络、提升了模型的表达能⼒,同时基本不增加计算量。
模型代码如下:
def build_model(self):
"""构建模型"""
# 第⼀层卷积,需要指定input_shape的参数
slice会不会改变原数组
通过 del.summary() 函数查看训练模型结构;训练模型结构如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。