人脸表情识别和情绪分类 | Python+TensorFlow(框架)+Keras+PyQt5

本设计利用Python、TensorFlow框架下的Keras构建深度学习模型,实现人脸表情识别和情绪分类。通过Fer2013数据集训练卷积神经网络,然后结合OpenCV进行图像预处理和识别。同时,设计了一个PyQt5界面,用于实时摄像头捕捉,提供友好的用户交互体验,包括调整参数、控制识别流程和录像功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人脸表情识别 | 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+'), lineterminator='\n').writerows([header[:-1]] + val)
    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”存放测试集数据;
文件夹“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'
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 os.path.exists(save_path):
        os.makedirs(save_path)

    num = 1
    with open(csv_file) as f:
        csvr = csv.reader(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 os.path.exists(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):
        self.model = Sequential()   # Sequential模型是keras两种模型之一,另一种是model模型
        """构建模型"""
        # 第一层卷积,需要指定input_shape的参数
        self.model.add(Conv2D(32, (1, 1), strides=1, padding='same', input_shape=(img_size, img_size, 1)))
        self.model.add(Activation('relu
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值