摘要:从之前的表情识别系统升级到现在的v3.0版本,这个系列的博客介绍详细的实现过程。博客介绍了如何处理表情识别项目中的关键数据集,首先介绍了几个公开可用的表情识别数据集,包括JAFFE、KDEF、AffectNet、FERG、Fer2013和CK+,然后选择了Fer2013数据集作为项目基础,介绍了从下载Fer2013数据集的原始CSV文件开始的数据集处理过程。通过编写Python脚本,给出了读取、处理数据,并将像素值转换为图像文件的具体步骤,包括定义情绪标签、确保适当的文件夹结构,以及利用OpenCV库处理保存图像。
最新升级版—人脸表情识别系统v3.0(SSD+MobileNet/Xception,UI界面演示)
前言
随着人工智能技术的持续进步,人脸表情识别领域也是日新月异,许多技术一日千里。四年前,我写了一篇关于利用深度学习算法进行表情识别的博客:人脸表情识别系统介绍——上篇(python实现,含UI界面及完整代码),虽然去年前年也都有更新这个系列,不过还是来一版这个的后续。这篇博客写的是表情识别系统的最新升级版,这一次博主在保留了之前文章中提到的经典mini_XCEPTION架构的同时,引入了基于Pytorch的主流框架,使得模型的性能和灵活性得到了显著提升,最重要的是以前的包比较早,现在升级成最新的版本,兼容性上要更好用了。
在人脸检测环节,从之前使用的效果比较一般的级联分类器升级到了训练更为精细的SSD模型,这大大提高了检测的准确率和效率。对于表情识别部分,博主保留了效果不错的mini_XCEPTION模型,还引入了MobileNet模型进行表情分类。通过对比可以看到MobileNet在处理速度和精度方面都有显著优势,这使得我们的系统能够更加敏锐和准确地识别出细微的表情变化。
1. 常见数据集介绍
为了训练和评估所设计的人脸表情识别系统,我们需要使用表情识别相关的数据集。在本节中,我们介绍几个公开的表情识别数据集。
-
JAFFE (Japanese Female Facial Expression) 数据集:JAFFE数据集是日本女性面部表情数据集,包含了213张由10名日本女性演员表演的7种基本面部表情(愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中性)的灰度图像。每种表情都有3个不同的程度。此数据集较小,但具有较高的标注准确率。官网链接:http://www.kasrl.org/jaffe.html。此数据集虽然较小,但以其高质量的图像和精确的表情标注而闻名,非常适合进行面部表情识别的初始研究和算法验证。
-
KDEF (Karolinska Directed Emotional Faces) 数据集:KDEF数据集提供了4900张由70名瑞典模特(男性和女性)表演的7种基本面部表情的彩色图像。这些图像从五个不同的角度(正面、半侧面、侧面、仰视和俯视)捕捉,增加了数据的多样性和复杂性。这种多角度的方法有助于研究者从不同的视角理解和识别面部表情。官网链接:https://kdef.se/
- AffectNet 数据集:AffectNet是当前最大的面部表情数据集之一,包含约42万张标注了表情类别和面部活动单元(AU)信息的面部表情图像。每张图像都标注了表情类别和面部活动单元(AU)信息。AffectNet适合训练和评估深度学习模型,尤其是用于自然环境中的面部表情识别。官网链接:http://mohammadmahoor.com/affectnet/。
-
FERG (Facial Expression Research Group) 数据集:FERG数据集是一个包含人工生成面部表情的独特数据集,包含6个虚拟角色的6种表情(愤怒、厌恶、恐惧、快乐、悲伤和惊讶)。尽管此数据集不包含真实人脸图像,但它通过渲染技术生成的大量样本对于理解面部表情的动态变化和研究表情的模式化表示非常有价值。官网链接:https://grail.cs.washington.edu/projects/deepexpr/ferg-db.html
-
Fer2013:Fer2013是由Goodfellow等人于2013年发布的广泛使用的表情识别数据集。它包含约35,000张灰度图像,这些图像来自互联网公开资源,涵盖了7种不同的表情类别(愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中性)。Fer2013数据集的多样性和规模使其成为训练深度学习模型的理想选择。官网链接:https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data
CK+:CK+(Cohn-Kanade+)数据集是由Lucey等人于2010年发布的一个面部表情数据集。CK+数据集包含了593个视频序列,涵盖了8种不同的表情类别,包括愤怒、厌恶、恐惧、快乐、悲伤、惊讶、中性和轻蔑。CK+数据集具有较高的标注准确率,提供了动态表情信息。链接:https://paperswithcode.com/dataset/ck
我们选择Fer2013和CK+作为我们的数据集,原因如下:首先,Fer2013具有较大规模和多样性,有利于训练出泛化能力较强的模型;其次,CK+数据集虽然样本量相对较小,但提供了动态表情信息和较高的标注准确率,可以作为补充数据集,提高模型的表现。我们将结合这两个数据集进行神经网络的训练和评估。
2. 下载数据集
基于深度学习技术做表情识别任务,处理数据集是至关重要的一步。这里,我们将深入讨论如何准备和处理Fer2013数据集,这是人脸表情识别领域中一个广泛使用的基准数据集。我们的目标是将这些数据转换成一种格式,便于后续的分析和模型训练。
Fer2013数据集由Pierre-Luc Carrier和Aaron Courville于2013年发布,旨在提供一个公开的基准,以促进人脸表情识别技术的研究。该数据集包含35,000多张灰度图像,这些图像分为7种不同的表情类别:愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中性。图像采集自互联网,展现了各种年龄、种族和情绪状态的面孔,反映了真实世界条件下的多样性。
开始之前,你需要获取Fer2013数据集的原始文件。这个数据集通常以一个CSV文件的形式提供,其中包含了每张图片的像素值和相应的情绪标签。
- 访问数据集页面:
- Fer2013数据集最初是作为Kaggle比赛的一部分发布的。你可以通过访问Kaggle网站或进行网络搜索来找到相关的数据集页面。搜索"Kaggle Fer2013"或直接访问Kaggle的面部表情识别挑战页面。
-
注册和登录:
- 如果你还没有Kaggle账户,你需要创建一个。完成注册并登录后,你就能够访问并下载数据集。
-
下载数据集:
- 在Fer2013数据集页面,找到下载部分。通常,数据集会被打包成一个ZIP文件,里面包含一个名为
fer2013.csv
的文件。点击下载按钮,数据集将开始下载到你的计算机。
- 在Fer2013数据集页面,找到下载部分。通常,数据集会被打包成一个ZIP文件,里面包含一个名为
- 解压文件:
- 下载完成后,解压ZIP文件。确保你可以访问解压后的
fer2013.csv
文件。这个CSV文件包含了所有图像的像素值和它们对应的表情标签。打开csv文件之后可以看到如下:
- 下载完成后,解压ZIP文件。确保你可以访问解压后的
这个csv文件中的数据其实是图片的像素值,接下来,我们将探讨如何将这些原始数据转换成适用于表情识别模型训练的格式,我们将Fer2013数据集原本的csv文件转换成图片格式。
3. 数据处理
在处理Fer2013数据集以进行表情识别研究的过程中,我们需要将原始数据转换成图像文件,以便更好地进行模型训练和测试。下面是如何使用Python代码来完成这一转换过程的详细介绍。
(1)准备工作
首先,确保我们的环境中安装了必要的库:Pandas用于数据处理,OpenCV用于图像处理,Numpy用于数值计算,os用于处理文件和目录。
import pandas as pd
import cv2
import numpy as np
import os
接下来,指定原始数据集的路径和目标图像的尺寸。在这个例子中,我们保持图像的原始尺寸48x48像素。
dataset_path = 'fer2013/fer2013.csv'
image_size = (48, 48)
定义一个字典来映射情绪的数字标签到具体的情绪名称。这将帮助我们在保存图像时以易于理解的方式命名文件夹。
emotion_labels = {
0: "Angry",
1: "Disgust",
2: "Fear",
3: "Happy",
4: "Sad",
5: "Surprise",
6: "Neutral"
}
(2)功能定义
定义一个ensure_folder
函数来检查特定的文件夹是否存在,如果不存在,则创建它。这个函数在保存图像时非常有用,确保我们有地方存放不同类别的表情图像。
def ensure_folder(folder):
if not os.path.exists(folder):
os.makedirs(folder)
(3)主要逻辑
save_faces
函数是处理数据集并保存图像的核心。首先,使用Pandas读取CSV文件,将pixels
列转换为列表,每个元素都是一长串的像素值。
def save_faces():
data = pd.read_csv(dataset_path)
pixels = data['pixels'].tolist()
emotions = data['emotion']
接着,遍历每一行数据,将像素值字符串分割并转换为整数,然后重新排列成48x48的数组。使用OpenCV将这个数组转换为图像。
for idx, (pixel_sequence, emotion) in enumerate(zip(pixels, emotions)):
face = [int(pixel) for pixel in pixel_sequence.split(' ')]
face = np.asarray(face).reshape(48, 48)
face = cv2.resize(face.astype('uint8'), image_size)
根据情绪标签,确定图像应该保存到的目标文件夹,并确保该文件夹存在。
emotion_label = emotion_labels[emotion]
folder_path = os.path.join('fer2013_images', emotion_label)
ensure_folder(folder_path)
最后,构建文件名并将图像保存到相应的文件夹中。文件名包含情绪标签和一个唯一的序号,以确保每个文件都是独一无二的。
file_name = f"{emotion_label}_SIXU_{str(idx).zfill(6)}.jpg"
file_path = os.path.join(folder_path, file_name)
cv2.imwrite(file_path, face)
当你运行这段代码时,它会自动处理整个数据集,将每张图像保存在以情绪名称命名的文件夹中,为后续的分析和模型训练奠定基础。
通过这个过程,我们不仅将原始的像素数据转换成了实际的图像文件,还按情绪类别进行了组织,这对于后续的数据探索和模型训练非常有帮助。
以下是这部分代码的完整代码:
import pandas as pd
import cv2
import numpy as np
import os
dataset_path = 'fer2013/fer2013.csv'
image_size = (48, 48)
# 定义表情类别
emotion_labels = {
0: "Angry",
1: "Disgust",
2: "Fear",
3: "Happy",
4: "Sad",
5: "Surprise",
6: "Neutral"
}
def ensure_folder(folder):
if not os.path.exists(folder):
os.makedirs(folder)
def save_faces():
data = pd.read_csv(dataset_path)
pixels = data['pixels'].tolist()
emotions = data['emotion']
for idx, (pixel_sequence, emotion) in enumerate(zip(pixels, emotions)):
face = [int(pixel) for pixel in pixel_sequence.split(' ')]
face = np.asarray(face).reshape(48, 48)
face = cv2.resize(face.astype('uint8'), image_size)
# 获取对应的表情类别
emotion_label = emotion_labels[emotion]
# 确保对应的文件夹存在
folder_path = os.path.join('fer2013_images', emotion_label)
ensure_folder(folder_path)
file_name = f"{emotion_label}_SIXU_{str(idx).zfill(6)}.jpg"
file_path = os.path.join(folder_path, file_name)
# 写入图像
cv2.imwrite(file_path, face)
if __name__ == "__main__":
save_faces()
运行以上代码之后,我们可以得到下面的文件和图片,每个文件夹中包含了一种表情的所有图片文件,这样方便我们在后续的代码中从类别文件夹中构建Dataloader,以进行深度学习模型的训练。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1fK421v7Rb/
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)