面部表情是人类之间交流的重要方式。
在人工智能研究中,深度学习技术已成为增强人机交互的强大工具。心理学中面部表情和情绪的分析和评估涉及评估预测个人或群体情绪的决定。
本研究旨在开发一种能够使用卷积神经网络(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
此代码使用 pandas 的read_csv()
函数读取名为“fer2013.csv”的 CSV 文件,该文件位于“../input/fer2013/“ 目录,并将生成的数据帧分配给名为data
的变量。
然后,在数据帧上调用shape
属性以检索其维度,这将返回表单的元组。这行代码将输出数据帧data
中的行数和列数(rows, columns)
。
data.isnull().sum()
此代码将返回数据帧data
的每一列中所有缺失值的总和。
数据帧的isnull()
方法返回一个布尔数据帧,该帧指示原始数据帧中的每个元素是否丢失。然后将sum()
方法应用于此布尔数据帧,该帧返回每列中缺失值的总和。
这是检查数据帧中是否存在任何缺失值的快速方法。如果存在缺失值,则可能需要在将数据用于建模之前插补或删除这些值。
data.head()
此代码将返回数据帧data
的前 5 行。
数据帧的head()
方法返回数据帧的前n
行(默认情况下为n=5
)。这是快速浏览数据帧中的数据的有用方法,尤其是在处理大型数据集时。
输出将显示数据帧data
的前 5 行,其中可能包括列名称和前几行数据,具体取决于数据帧的结构。
数据头的输出
数据预处理
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()
此代码使用 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()
方法,以将像素值拆分为字符串列表。然后使用