基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)

前言

本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统,核心采用CNN卷积神经网络搭建,详述了数据集处理、模型构建、训练代码、以及基于PyQt5的应用界面设计。在应用中可以支持图像、视频和实时摄像头进行人脸表情识别。本文附带了完整的应用界面设计、深度学习模型代码和训练数据集的下载链接。

完整资源下载链接:博主在面包多网站上的完整资源下载页

项目演示视频:

【项目分享】基于深度学习的人脸表情识别系统(含PyQt界面)

一、数据集

1.1 数据集介绍

Fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张,公共验证图(PublicTest)和私有验证图(PrivateTest)各3589张,每张图片是由大小固定为48×48的灰度图像组成,共有7种表情,分别对应于数字标签0-6,具体表情对应的标签和中英文如下:0 anger 生气; 1 disgust 厌恶; 2 fear 恐惧; 3 happy 开心; 4 sad 伤心;5 surprised 惊讶; 6 normal 中性。
在这里插入图片描述

1.2 数据预处理

数据给的是一个csv文件,其中的表情数据并没有直接给图片,而是给了像素值。我们需要在整理的时候顺便转换成图片就好,这里我们使用getpic.py

# getpic.py 生成图像数据
import codecs
import cv2
from tqdm import tqdm
import numpy as np
f = codecs.open('fer2013.csv','r','utf8').readlines()[1:]
labelfile = codecs.open('label.txt','w','utf8')
index = 0
for line in tqdm(f):
    flist = line.split(',')
    label = flist[0]
    img = flist[1].split(' ')
    img = [int(i) for i in img]
    img = np.array(img)
    img = img.reshape((48,48))
    cv2.imwrite('ferpic/'+str(index)+'.png',img)
    labelfile.write(str(index)+'\t'+label+'\n')
    index += 1

将像素值归一化到[0, 1]的范围内有助于训练模型时梯度更加稳定,从而更容易收敛到较好的解。归一化可以避免某些像素值过大或过小导致的梯度爆炸或梯度消失问题。使用utils.py对图像进行预处理,以便在神经网络中使用。根据参数v2的不同取值,可以选择不同的预处理方式。

# utils.py
def preprocess_input(x, v2=True):
    x = x.astype('float32')
    x = x / 255.0
    if v2:
        x = x - 0.5
        x = x * 2.0
    return x

这个预处理方法主要包含两个步骤:归一化和零均值化。归一化:通过将像素值除以255.0,将输入的图像数据归一化到[0, 1]的范围内。这一步可以确保所有的像素值都在相似的数值范围内,有利于模型训练的稳定性。零均值化:如果参数v2为True,那么将对图像进行零均值化。零均值化的过程包括两个操作:将像素值减去0.5,这样可以将像素值平移至以0.5为中心,即像素值的均值为0.5。这一步使得图像数据的中心点在零点附近,有利于模型的收敛速度。将像素值乘以2.0,将像素值缩放到[-1, 1]的范围内。这一步可以确保图像数据的值域适合一些需要对称分布输入数据的模型,同时提高了模型对输入数据的鲁棒性。

最后使用dataset.py文件将处理好的数据集封装成data.hdf5文件方面后面训练模型使用。

# dataset.py
import codecs
import cv2
import numpy as np
from maketwo import Detecttwo
from tqdm import tqdm
datapath = '/unsullied/sharefs/lh/isilon-home/fer2013/ferpic/'
label = '/unsullied/sharefs/lh/isilon-home/fer2013/label.txt'
label = codecs.open(label,'r','utf8').readlines()
label = [i.split('\t') for i in label]
label = [  [i[0] ,int(i[1]) ] for i in label]
#print(label[0:5])
X = []
Y = []
for i in tqdm(label):
    picname = datapath+i[0]+'.png'
    img = cv2.imread(picname,0)
    img = np.expand_dims(img,axis=2)#224*224*1
    img = cv2.resize(img, (48,48), interpolation=cv2.INTER_LINEAR)
    #cv2.imwrite('1.png',img)
    img = np.expand_dims(img,axis=2)#224*224*1
    X.append(img)
    y = [0,0,0,0,0,0,0]
    y[i[1]]=1
    y = np.array(y)
    Y.append(y)
X = np.array(X)
Y = np.array(Y)
print(X.shape,Y.shape)
print(X[0],Y[0:5])

import h5py
f = h5py.File("Data.hdf5",'w')
f.create_dataset('X',data=X)
f.create_dataset('Y',data=Y)
f.close()
#np.save('X.npy',X)
#np.save('Y.npy',Y)

二、模型搭建

我们使用的是基于CNN实现的网络模型mini_XCEPTION。Xception网络模型是由Google提出的,它在Inception v3的基础上进行了进一步的优化。主要是采用深度可分离的卷积(depthwise separable convolution)来替换原来Inception v3中的卷积操作。XCEPTION的网络结构在ImageNet数据集(Inception v3的设计解决目标)上略优于Inception v3,并且在包含3.5亿个图像甚至更大的图像分类数据集上明显优于Inception v3,而两个结构保持了相同数目的参数,性能增益来自于更加有效地使用模型参数,详细可参考论文:Real-time Convolutional Neural Networks for Emotion and Gender Classification–O Arriaga。网络结构图,如下图所示:

基于CNN的模型实现代码如下:

# 模型实现代码
def mini_XCEPTION(input_shape, num_classes, l2_regularization=0.01):
    regularization = l2(l2_regularization)

    # base
    img_input = Input(input_shape)
    x = Conv2D(8
在PyCharm中使用Mini-Xception模型(一种轻量级版本的Xception网络)对FER2013数据集进行情感分类(通常用于表情识别)时,你需要先安装必要的库,如Keras、TensorFlow或PyTorch(取决于你选择的深度学习框架),然后加载数据、预处理、定义模型、编译并训练模型。以下是一个基本的示例,假设你在使用Keras: ```python # 导入所需库 from keras.applications import MiniXception from keras.models import Sequential, Model from keras.layers import Dense, GlobalAveragePooling2D from keras.optimizers import Adam from keras.preprocessing.image import ImageDataGenerator import numpy as np import os # 数据目录路径 data_dir = "path/to/fer2013" # 图像尺寸和类别数量 img_size = (48, 48) num_classes = 7 # FER2013有7种表情 # 数据增强 datagen = ImageDataGenerator(rescale=1./255) # 预处理像素值到0-1之间 train_generator = datagen.flow_from_directory( os.path.join(data_dir, 'train'), # 训练集目录 target_size=img_size, batch_size=32, class_mode='categorical') # 输出为one-hot编码 # 加载预训练Mini-Xception模型,去掉顶部的全连接层 base_model = MiniXception(weights='imagenet', include_top=False, input_shape=(img_size[0], img_size[1], 3)) # 添加自定义全连接层 x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(num_classes, activation='softmax')(x) # 创建新的模型 model = Model(inputs=base_model.input, outputs=predictions) # 冻结预训练层 for layer in base_model.layers: layer.trainable = False # 编译模型 model.compile(optimizer=Adam(lr=0.0001), loss='categorical_crossentropy', metrics=['accuracy']) # 定义训练步骤 history = model.fit(train_generator, epochs=10, # 可根据实际情况调整 validation_data=val_generator) # 如果有验证集,添加这里 # 训练曲线图 import matplotlib.pyplot as plt plt.plot(history.history['loss'], label='Training Loss') plt.plot(history.history['val_loss'], label='Validation Loss') plt.plot(history.history['accuracy'], label='Training Accuracy') plt.plot(history.history['val_accuracy'], label='Validation Accuracy') plt.xlabel('Epochs') plt.ylabel('Loss/Accuracy') plt.legend() plt.show() ``` 别忘了替换`"path/to/fer2013"`为你实际的FER2013数据集路径,并确保你的环境已经正确设置好Keras及其后端。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值