使用 CNN 进行面部情绪识别

本文介绍了使用卷积神经网络(CNN)进行面部情绪识别的研究,通过预处理、特征提取和分类,实现了62.66%的预测准确率。文章详细展示了数据预处理、模型设计、训练和评估的全过程,包括数据增强、模型构建、提前停止策略等,并提供了代码资源链接供读者参考和下载。
摘要由CSDN通过智能技术生成

面部表情是人类之间交流的重要方式。

在人工智能研究中,深度学习技术已成为增强人机交互的强大工具。心理学中面部表情和情绪的分析和评估涉及评估预测个人或群体情绪的决定。

本研究旨在开发一种能够使用卷积神经网络(CNN)算法和特征提取技术预测和分类面部情绪的系统。

该过程包括三个主要阶段:数据预处理、面部特征提取和面部情绪分类。通过采用卷积神经网络(CNN)算法,系统准确预测面部表情,成功率为62.66%。

该算法的性能使用FER2013数据库进行评估,该数据库是一个公开可用的数据集,包含35,887张48x48灰度面部图像,每张图像代表一种不同的情绪。

现在让我们从编码开始。

!pip install scikit-plot

此代码使用 pip 安装 scikit-plot 包,pip 是一个 Python 包,提供了一系列有用的工具来可视化机器学习模型的性能。

具体来说,scikit-plot提供了多种函数来生成模型评估中使用的常见图,例如ROC曲线,精度召回率曲线,混淆矩阵等。

在Python环境中执行命令“!pip install scikit-plot”后,你应该能够在代码中导入和使用scikit-plot函数。

import pandas as pd
import numpy as np
import scikitplot
import random
import seaborn as sns
import keras
import os

from matplotlib import pyplot
import matplotlib.pyplot as plt

import tensorflow as tf
from tensorflow.keras.utils import to_categorical
import warnings
from tensorflow.keras.models import Sequential

from keras.callbacks import EarlyStopping
from keras import regularizers
from keras.callbacks import ModelCheckpoint,EarlyStopping

from tensorflow.keras.optimizers import Adam,RMSprop,SGD,Adamax

from keras.preprocessing.image import ImageDataGenerator,load_img
from keras.utils.vis_utils import plot_model
from keras.layers import Conv2D, MaxPool2D, Flatten,Dense,Dropout,BatchNormalization,MaxPooling2D,Activation,Input

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
warnings.simplefilter("ignore")

from keras.models import Model

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

from keras.regularizers import l1, l2
import plotly.express as px
from matplotlib import pyplot as plt

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

该代码导入机器学习和深度学习任务中常用的各种 Python 库和模块。

这些库包括pandas,numpy,scikit-plot,random,seaborn,keras,os,matplotlib,tensorflow和scikit-learn。

每个 import 语句导入一组执行机器学习或深度学习任务所需的特定工具或函数,例如数据操作、数据可视化、模型构建和性能评估。

总体而言,此代码准备了执行各种机器学习和深度学习任务(如数据预处理、模型训练和模型评估)所需的必要工具和模块。

从这里下载代码:http://onepagecode.s3-website-us-east-1.amazonaws.com/

加载数据集

data = pd.read_csv("../input/fer2013/fer2013.csv")
data.shape
fc64e6deddb1b8ae78caba81b5b82bd8.jpeg

此代码使用 pandas 的read_csv()函数读取名为“fer2013.csv”的 CSV 文件,该文件位于“../input/fer2013/“ 目录,并将生成的数据帧分配给名为data的变量。

然后,在数据帧上调用shape属性以检索其维度,这将返回表单的元组。这行代码将输出数据帧data中的行数和列数(rows, columns)

data.isnull().sum()
77870a2268d29adaac89718123e74fce.jpeg

此代码将返回数据帧data的每一列中所有缺失值的总和。

数据帧的isnull()方法返回一个布尔数据帧,该帧指示原始数据帧中的每个元素是否丢失。然后将sum()方法应用于此布尔数据帧,该帧返回每列中缺失值的总和。

这是检查数据帧中是否存在任何缺失值的快速方法。如果存在缺失值,则可能需要在将数据用于建模之前插补或删除这些值。

data.head()

此代码将返回数据帧data的前 5 行。

数据帧的head()方法返回数据帧的前n行(默认情况下为n=5 )。这是快速浏览数据帧中的数据的有用方法,尤其是在处理大型数据集时。

输出将显示数据帧data的前 5 行,其中可能包括列名称和前几行数据,具体取决于数据帧的结构。

0de97532bb0360134d54e27edc3094ce.jpeg

数据头的输出

数据预处理

CLASS_LABELS  = ['Anger', 'Disgust', 'Fear', 'Happy', 'Neutral', 'Sadness', "Surprise"]
fig = px.bar(x = CLASS_LABELS,
             y = [list(data['emotion']).count(i) for i in np.unique(data['emotion'])] , 
             color = np.unique(data['emotion']) ,
             color_continuous_scale="Emrld") 
fig.update_xaxes(title="Emotions")
fig.update_yaxes(title = "Number of Images")
fig.update_layout(showlegend = True,
    title = {
        'text': 'Train Data Distribution ',
        'y':0.95,
        'x':0.5,
        'xanchor': 'center',
        'yanchor': 'top'})
fig.show()
fd66a992f8714264bcc066155603610c.jpeg

此代码使用 Plotly Express 库创建条形图,该条形图显示数据帧data中情绪的分布。

首先,在CLASS_LABELS中定义一个类标签列表,它对应于数据集中的不同情绪。

然后,调用px.bar()函数,其中 x 轴表示类标签,y 轴表示每个情绪的图像数量。颜色参数设置为不同的情感类,color_continuous_scale参数设置为“Emrld”,这是 Plotly Express 中预定义的色阶。

接下来,调用各种update_方法来修改绘图的布局和外观。例如,update_xaxes()update_yaxes()用于分别设置 x 轴和 y 轴标题。 update_layout()用于设置打印标题及其位置。

最后,在图形对象上调用show()方法以显示绘图。

输出将显示一个条形图,该条形图显示数据帧data中每个情绪的图像数,每个情绪根据指定的色阶进行颜色编码。

随机打乱数据

data = data.sample(frac=1)

DataFrame 的sample()方法用于随机采样数据帧中行的一小部分,并指定frac要返回的行部分(在本例中为 frac=1,这意味着将返回所有行)。当frac=1时,sample()方法有效地对数据帧中的行进行洗牌。

这是机器学习和深度学习任务中的常见操作,随机打乱数据以防止在数据具有任何固有顺序或结构时可能引入的任何偏差非常重要。

One Hot编码

labels = to_categorical(data[['emotion']], num_classes=7)

输出是一个形状为(n_samples, n_classes)的 numpy 数组,其中:

  • n_samples是数据帧中的样本数

  • n_classes是数据中唯一类的数量(在本例中为 7)

  • 数组data的每一行表示数据帧中单个样本的One Hot编码标签。

train_pixels = data["pixels"].astype(str).str.split(" ").tolist()
train_pixels = np.uint8(train_pixels)

此代码对数据DataFrame的像素列中的像素值进行预处理。

首先,astype()方法用于将pixels列转换为字符串数据类型,这允许在列的每一行上调用split()方法。

接下来,对pixels列的每一行调用split()方法,以将像素值拆分为字符串列表。然后使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值