摘要:本文深入研究了基于YOLOv8/v7/v6/v5等深度学习模型的人脸表情识别系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Streamlit的交互式Web应用界面设计。在Web网页中可以支持图像、视频和实时摄像头进行人脸表情识别,可上传不同训练模型(YOLOv8/v7/v6/v5)进行推理预测,界面可方便修改。本文附带了完整的网页设计、深度学习模型代码和训练数据集的下载链接。
@
目录完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频 :https://www.bilibili.com/video/BV1dM4m1X77Y/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2Xm5tq
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmJhp
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmZ1w
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Xmp5q
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
1. 网页功能与效果
(1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中人脸表情的检测。系统将自动识别并分析画面中的人脸表情,并将检测结果实时显示在用户界面上,为用户提供即时的表情反馈。
(2)选择图片检测:用户可以上传本地的图片文件到系统中进行表情识别。系统会分析上传的图片,识别出图片中人脸的表情,并在界面上展示带有表情标签和置信度的检测结果,让用户能够清晰地了解到每个人脸的表情状态。
(3)选择视频文件检测:系统支持用户上传视频文件进行表情检测。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的人脸表情。用户可以观看带有表情检测标记的视频,了解视频中人物的表情变化。
(4)选择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行表情识别。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。
本系统还集成了一系列高级功能,提高了用户体验和系统的实用性:检测画面和原始画面的显示方式,允许用户选择同时显示检测结果和原始图像,或者单独显示任一种图像,以便于比较和分析;特定目标的单独标记和显示结果,用户可以通过下拉框选择特定的表情类型进行检测,系统将只显示选定表情类型的检测结果,使分析更加专注和高效;检测结果的页面表格显示,所有检测到的表情及其相关信息(如置信度和位置)会在页面上以表格形式展现,便于用户一目了然地查看;动态调整检测算法的阈值,用户可以实时调整置信度阈值和IOU阈值,以获得最佳的检测效果;检测结果导出到CSV文件,为了方便数据分析和记录,用户可以将检测结果以CSV格式导出;最后,导出标记的图像和视频结果功能使用户能将加工后的图像或视频保存为avi格式的文件,方便保存和分享。这些功能的集成使得本系统不仅在人脸表情识别方面表现出色,同时也提供了丰富的数据处理和展示选项,满足了广泛的应用需求。
2. 绪论
2.1 研究背景及意义
在当今社会,随着人工智能技术的飞速发展,机器视觉作为其核心应用之一,正逐步改变我们的生活和工作方式。特别是在人机交互(HCI)领域,表情识别技术因其独特的应用价值而受到了广泛关注。从基本的表情分析到复杂的情绪理解,表情识别不仅能让机器更加“人性化”,而且在提高人机交互效率、理解用户情感等方面发挥着不可或缺的作用。
表情识别的研究背景可以追溯到心理学领域关于人类情感表达的研究。早期,心理学家如Paul Ekman等通过分析人脸肌肉运动的微妙变化,定义了几种基本的人类情感表达。这些基础研究不仅为后来的表情识别技术提供了理论基础,也为机器如何理解和模拟人类情感交流奠定了初步的框架。随着计算能力的不断增强和深度学习技术的突破,表情识别技术在最近几年取得了显著进展。尤其是YOLO(You Only Look Once)系列模型的出现,大幅提高了表情识别的准确性和实时性。YOLO作为一种先进的目标检测算法,通过单次前向传播就能实现快速准确的目标检测,其在表情识别领域的应用,极大地推动了实时情感分析技术的发展。
表情识别技术的意义远不止于提高人机交互的自然性和流畅性。在教育领域,通过分析学生的表情反馈,教师可以更好地理解学生的学习状态和情绪,从而调整教学策略,实现更加个性化的教学。在安全监控领域,表情识别可以辅助判断人员的情绪状态,对于预防突发事件、提高公共安全具有重要意义。此外,随着虚拟现实(VR)和增强现实(AR)技术的发展,表情识别还将在提供更加真实和沉浸式的用户体验中发挥关键作用。
2.2 国内外研究现状
近年来,随着人工智能和机器学习技术的迅速发展,表情识别领域也取得了显著的进步。特别是深度学习方法的引入,极大地提高了表情识别系统的准确性和效率。在这一背景下,多种新的算法和模型被提出,以应对表情识别中的各种挑战,如表情的微妙变化、不同光照条件下的表情识别、以及跨文化背景下的表情理解等问题。
一个显著的趋势是利用卷积神经网络(CNN)和循环神经网络(RNN)的组合来捕获面部表情的空间特征和时间序列信息。例如,一些研究采用三维卷积神经网络(3D-CNN)来分析连续视频帧中的表情动态变化,从而实现更准确的情感状态识别。此外,注意力机制的引入,使得模型能够自动聚焦于面部表情的关键区域,进一步提升了识别的准确性。近期,YOLO系列模型在表情识别领域也显示出了巨大的潜力。YOLOv5和YOLOv6通过优化网络结构和训练策略,不仅提高了检测速度,而且还保持了较高的准确率。随后,YOLOv7和YOLOv8的推出,通过引入更高效的特征提取和分类机制,进一步提升了表情识别的性能。
Transformer[1]架构和注意力机制的引入,是近年来目标检测领域的一大创新。Vision Transformer[2](ViT)首次将Transformer应用于视觉任务中,通过对图像分块处理并利用自注意力机制捕获块间的关系,展示了与CNN相竞争的性能。注意力机制通过赋予模型动态聚焦于图像的关键区域的能力,进一步提升了模型对复杂场景的理解和处理能力,这对于表情识别任务来说尤其重要。
RetinaNet[3]通过其独特的Focal Loss解决了目标检测中的类别不平衡问题,显著提高了小目标的检测性能。Faster R-CNN[4]作为一种经典的目标检测框架,通过引入区域建议网络(RPN),实现了快速而准确的目标检测。DETR则完全摒弃了传统的锚框和NMS步骤,利用Transformer直接在图像中预测目标的位置,开创了目标检测的新范式。
近期的Glod-YOLO和MMDetection[5]等算法和框架,展示了目标检测技术向着更加灵活、高效发展的趋势。这些算法不仅在提升检测性能上取得了显著成果,而且在处理实时视频流、多尺度目标检测等复杂应用场景中展现出了极高的适用性和灵活性。
在表情识别任务中,这些算法的创新点和有效性体现在多个方面。首先,快速而准确的目标检测能力使得系统能够实时处理视频流,捕获和分析用户的面部表情。其次,通过注意力机制和Transformer架构,模型能够更加精准地聚焦于面部关键特征,从而提高表情识别的准确性。此外,针对表情识别中的小目标和细微表情变化,Focal Loss和改进的特征融合技术提供了有效的解决方案。
2.3 要解决的问题及其方案
2.3.1 要解决的问题
-
人脸表情识别的准确性和实时性
人脸表情识别系统面临的首要挑战是如何在各种复杂环境中实现高准确性的表情识别,同时保证足够的处理速度以支持实时应用。鉴于人的面部表情丰富多变,系统需要精确识别出各种微妙的面部动作和表情变化。此外,人脸在不同的光照、角度和部分遮挡情况下的识别,对算法的性能提出了更高要求。因此,构建一个能够快速并准确识别人脸表情的深度学习模型是本项目的关键任务。 -
模型的泛化能力和适应性
由于人脸表情受到个体差异、文化背景和情境环境的影响,表情识别系统需要具备强大的泛化能力和适应性。这意味着系统能够在没有见过的新面孔和新环境中依然保持高准确率,对于不同年龄、性别和种族的面部表情都能有效识别。 -
用户交互界面的直观性和功能性
为了确保用户能够高效地使用人脸表情识别系统,需要开发一个直观且功能丰富的网页界面。该界面不仅要提供实时表情检测功能,还应支持不同来源(如图片、视频、摄像头)的输入,并能让用户轻松切换使用不同的模型文件。此外,界面设计应考虑美观性和用户体验,确保用户能够在不同设备上获得一致的使用体验。 -
深度学习模型的集成和优化
考虑到不同的YOLO版本(如YOLOv8/v7/v6/v5)在表情识别任务上可能表现各异,系统需要能够支持多个模型的集成和比较。这不仅涉及到模型的训练和优化,还包括模型在Web环境中的部署和运行效率优化。此外,使用PyTorch框架的选择要求对模型进行适当的调整和优化,以适应Web环境的性能需求。 -
系统的可维护性和扩展性
随着人脸表情识别技术的进步和应用场景的拓展,系统可能需要支持更多的表情类别识别或集成新的算法来提高识别性能。因此,系统的架构设计需要考虑到未来的可扩展性,使得新功能或模型能够轻松集成。同时,系统的可维护性也至关重要,确保能够持续更新和优化以适应新的技术和用户需求。
2.3.2 解决方案
-
深度学习模型的选择和优化
模型架构:选用YOLOv8/v7/v6/v5作为核心的深度学习模型,考虑到它们在速度和准确度之间的优秀平衡,以及对小目标的良好识别能力,特别适用于实时人脸表情识别任务。
数据增强:为增强模型的泛化能力,将采用多种数据增强技术,如随机裁剪、缩放、旋转、色彩调整等,以模拟多变的环境条件和表情变化。
迁移学习:利用在大规模图像数据集上预训练的YOLO模型作为起点,通过迁移学习技术进行微调,专注于表情识别的细节,以提升训练效率和识别性能。 -
技术框架和开发工具
PyTorch框架:选用PyTorch作为主要的深度学习框架,其灵活的API和强大的GPU加速功能,非常适合于快速开发和迭代深度学习模型。
Streamlit网页设计:基于Streamlit构建用户交互界面,它提供了简单而强大的方式来创建数据应用程序,能够快速从Python脚本创建和共享美观的Web应用。
CSS美化:利用CSS技术对Web界面进行美化和风格定制,以提高用户界面的美观性和用户体验。 -
功能实现和系统设计
多输入源支持:系统将支持多种输入源,包括图片、视频和实时摄像头捕获,以适应不同的应用场景。
模型切换功能:实现动态模型切换功能,允许用户根据需求选择不同版本的YOLO模型(YOLOv8/v7/v6/v5),提高系统的灵活性和适用范围。 -
数据处理和存储策略
高效数据处理:利用PyTorch的高效数据加载和预处理机制,确保数据处理的速度和质量,满足实时表情识别的需求。
智能数据存储:设计合理的数据存储方案,对识别结果和历史数据进行有效组织和索引,以便于用户查询和分析。 -
性能优化和系统测试
性能调优:通过模型和系统性能分析,识别性能瓶颈并进行针对性优化,如模型精简、硬件加速等,以保证系统的高效运行。
全面测试:进行全面的系统测试,包括功能测试、性能测试和用户体验测试,确保系统的稳定性、准确性和可靠性。
通过实施上述策略,我们的目标是开发一个准确、高效且用户友好的人脸表情识别系统,能够在多种使用场景下满足用户的需求,同时提供强大的数据处理能力和良好的用户体验。
2.4 博文贡献与组织结构
本文的主要贡献在于综合探讨了使用YOLOv8/v7/v6/v5等最新深度学习模型在人脸表情识别领域的应用,并开发了一个基于Streamlit的美观且用户友好的人脸表情识别系统。本文的具体贡献如下:
-
文献综述:本文详细回顾了人脸表情识别领域的相关研究,包括不同的深度学习模型、表情识别的技术挑战、以及目前的研究趋势和未解决的问题,为研究者提供了全面的背景知识。
-
数据集处理:详细介绍了人脸表情识别所使用的数据集处理方法,包括数据增强、数据清洗和预处理等步骤,以提高模型的泛化能力和识别准确率。
-
算法选择和优化:深入探讨了YOLOv8/v7/v6/v5等不同版本的算法在人脸表情识别任务上的应用,并对模型进行了针对性的优化,以适应表情识别的特殊需求。
-
Streamlit网页设计:开发了基于Streamlit的人脸表情识别系统,该系统不仅美观且用户友好,还支持多种输入源和模型切换功能,提升了用户体验。
-
算法性能对比:通过实验比较了YOLOv7/v6/v5等不同算法在人脸表情识别任务上的性能,包括识别准确率、处理速度等指标,为选择最合适的模型提供了依据。
-
资源分享:本文提供了完整的数据集和代码资源包,包括预处理和增强后的数据集、训练和预测的代码,以及模型权重文件,方便研究者和开发者复现和进一步研究。
后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在人脸表情识别中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在人脸表情识别任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的人脸表情识别系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。
3. 数据集处理
在构建一个高效的表情识别系统时,数据集的角色至关重要。数据集不仅是模型训练的基础,更是确保模型能够在现实世界中准确识别不同情绪的关键。在本研究中,我们采用了一个包含9900张图片的综合数据集,该数据集专门用于表情识别模型的训练、验证和测试。我们的数据集包含8001张训练图像,999张验证图像以及900张测试图像。训练图像用于模型的学习和参数优化,验证图像用于模型性能的调优和超参数选择,而测试图像则用于评估模型的最终性能。在如此庞大的数据集中,每一个表情类别的样本数相对平均分布,包括愤怒、蔑视、厌恶、恐惧、高兴、中性、悲伤和惊讶,这有助于模型在所有类别上学习到均衡的特征,避免了偏向于任何单一类别的风险。博主使用的类别如下:
Chinese_name = {"Anger": "愤怒", "Contempt": "轻蔑", "Disgust": "厌恶", "Fear": "恐惧", "Happy": "快乐",
"Neutral": "中性", "Sad": "悲伤", "Surprise": "惊讶"}
数据集的预处理流程严格且细致。首先,每张图像都经过了自动方向校正,并剥离了EXIF方向信息,这一步骤确保了所有的图像都以正确的朝向进行处理。其次,所有图像被统一缩放至448x448像素,这不仅创造了一致的输入尺寸,也为模型提供了统一的视觉尺度。虽然使用了拉伸方法来调整图像大小可能会改变原始图像的宽高比,但此举确保了每张图像都能符合网络输入层的要求。
通过对数据集中的边界框分布进行深入分析,我们发现了一些关键的特点。大部分边界框集中在图像的中心区域,表明大多数面部图像位于相似的位置。此外,边界框宽度和高度的分布显示出正相关,暗示面部区域的大小在数据集中相对一致。这些分析结果对于后续的数据增强和模型训练至关重要。它们提示我们,在预处理和增强阶段,应当考虑引入更多的图像变换技术,如随机裁剪、平移和缩放,以减少数据的中心偏置和增加尺寸的多样性。
综上所述,我们精心构建和预处理的数据集为表情识别模型的训练提供了坚实基础。数据集的均衡类别分布有利于模型全面学习,而详尽的图像分布分析则指导我们在数据增强和预处理上做出明智的决策,以便提高模型的泛化能力和实际应用的鲁棒性。接下来,我们将利用这一数据集深入研究表情识别算法,不仅仅追求模型的精度,更要确保其在不同环境和条件下都能保持稳定的表现。
4. 原理与代码介绍
4.1 YOLOv8算法原理
YOLOv8代表了目标检测领域的最新进展,它在保持YOLO系列一贯的实时性的同时,引入了一系列创新技术以提升检测精度。2023年1月由YOLOv5的开发团队UltraLytics公布的这一算法,不仅在标准的测试集上达到了前所未有的准确度,还在处理速度上做出了显著提升。在我们的人脸表情识别系统中,YOLOv8算法起着核心作用。YOLOv8是YOLO(You Only Look Once)系列算法的最新迭代,它是一个高效的实时目标检测算法,旨在实现快速而准确的物体定位和分类。
YOLOv8沿用了CSPNet的设计,同时在C3模块中集成了多尺度特征融合,这些特征融合能够强化网络对小目标的检测能力。这是因为在多尺度特征融合中,网络能够利用不同层次的特征信息,增强对复杂场景中微小或遮挡物体的识别能力。
YOLOv8还引入了一种新颖的损失函数——一种基于概率分布的方法。传统的目标检测算法中,损失函数通常会简单地将每个目标的分类和位置误差相加来计算总损失。而YOLOv8通过这种新颖的损失函数,能够在优化过程中考虑不同任务的权重,避免某一项任务(如分类)的损失对总损失的影响过大,从而达到更加平衡的训练效果。
在算法的训练过程中,YOLOv8引入了Task Aligned Assigner和Distribution Focal Loss来进一步优化性能。Task Aligned Assigner负责为每个预测框分配最合适的目标,它通过考虑任务的特性和目标状态来选择最合适的预测框,而不是简单地根据预测框和目标之间的重叠程度(IoU)。Distribution Focal Loss则是一种新颖的损失函数,它不仅关注于正确分类的损失,还关注于错误分类的概率分布,提供更精细的损失权重调整,以提高模型的识别准确率。
总之,YOLOv8的设计理念是提高算法的准确性和实时性,使其在实时的目标检测任务中表现出色。通过先进的网络结构、损失函数以及标签分配策略,YOLOv8在目标检测领域中实现了快速、准确的检测,特别是在处理复杂场景和小目标检测方面有显著的优势。这些特性使得YOLOv8成为人脸表情识别系统中不可或缺的一部分。
4.2 模型构建
接下来详细介绍构建用于人脸表情识别的深度学习模型的代码结构和功能。这一过程包括模型的初始化、加载、预处理、预测以及结果的后处理等关键步骤。首先,代码通过导入必要的库和模块开始。cv2
是OpenCV库,广泛应用于图像处理和计算机视觉任务。torch
是PyTorch深度学习框架,用于构建和训练模型。Detector
是一个抽象基类,定义了检测器应有的基本功能和结构。YOLO
类专门用于加载和运行YOLO模型,而select_device
函数用于根据是否有可用的CUDA设备来选择运行模型的设备(GPU或CPU)。
import cv2
import torch
from QtFusion.models import Detector
from datasets.EmotionData.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device
接着,设置了模型运行的初始参数ini_params
,这包括设备类型、置信度阈值、IOU阈值等。这些参数对于模型的性能和检测结果的质量至关重要。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
'device': device,
'conf': 0.25,
'iou': 0.5,
'classes': None,
'verbose': False
}
count_classes
函数用于统计每个类别的检测数量。它接受检测信息和类别名称列表作为输入,并返回一个与类别名称列表相对应的计数列表。这个功能对于分析模型在不同类别上的表现非常有用。
def count_classes(det_info, class_names):
count_dict = {name: 0 for name in class_names}
for info in det_info:
class_name = info['class_name']
if class_name in count_dict:
count_dict[class_name] += 1
count_list = [count_dict[name] for name in class_names]
return count_list
YOLOv8v5Detector
类是整个检测流程的核心。该类继承自Detector
基类,提供了加载模型、图像预处理、执行预测和后处理检测结果等方法。在初始化时,该类接受一个参数字典,并用于设置模型的运行参数。load_model
方法负责加载指定路径的预训练YOLO模型,并进行必要的设备选择和模型预热。preprocess
方法对输入图像进行预处理,以适应模型的输入要求。predict
方法执行表情识别的预测过程,而postprocess
方法则处理模型的输出,将其转换为易于理解和使用的格式,例如将检测到的表情标注在图像上。
class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None
self.img = None
self.names = list(Chinese_name.values())
self.params = params if params else ini_params
def load_model(self, model_path):
self.device = select_device(self.params['device'])
self.model = YOLO(model_path)
names_dict = self.model.names
self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
def preprocess(self, img):
self.img = img
return img
def predict(self, img):
results = self.model(img, **ini_params)
return results
def postprocess(self, pred):
results = []
for res in pred[0].boxes:
for box in res:
class_id = int(box.cls.cpu())
bbox = box.xyxy.cpu().squeeze().tolist()
bbox = [int(coord) for coord in bbox]
result = {
"class_name": self.names[class_id],
"bbox": bbox,
"score": box.conf.cpu().squeeze().item(),
"class_id": class_id,
}
results.append(result)
return results
def set_param(self, params):
self.params.update(params)
最后,set_param
方法允许动态更新检测参数,如置信度阈值和IOU阈值,这为用户提供了更大的灵活性和控制能力,以优化检测结果。
这部分代码构建了一个完整的人脸表情识别流程,从加载预训练的YOLO模型到执行表情检测,并处理检测结果,提供了一套完备的解决方案。通过细致的功能设计和参数设置,这个系统能够高效且准确地识别图像或视频中的人脸表情,满足不同场景下的应用需求。
4.3 训练代码
在本篇博客中,我们将探讨如何使用YOLOv8模型来训练一个人脸表情识别系统。这一过程不仅涉及到深度学习模型的加载和初始化,还包括数据集的准备以及训练参数的配置。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) |
0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) |
0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) |
0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) |
0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) |
3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) |
16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) |
640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
环境设置与模型加载:首先,我们的环境设定开始于导入必要的Python库,这为我们后续的步骤打下了基础。os库帮助我们与操作系统交互,进行文件和目录的管理。torch是我们采用的深度学习框架PyTorch的核心库,它提供了构建深度学习模型所需的数据结构和计算功能。yaml库是用于解析和生成YAML文件的,这种文件格式因其易于阅读和书写,常被用来存储配置数据。
import os
import torch
import yaml
from ultralytics import YOLO # 用于加载YOLO模型
from QtFusion.path import abs_path # 用于获取文件的绝对路径
我们使用YOLO类从ultralytics库中引入,它是实现YOLO模型的主要接口。此外,我们从自定义库QtFusion中导入abs_path函数,用于转换文件路径为绝对路径。
确定训练环境是至关重要的步骤。我们将模型训练设备设置为GPU,如果可用的话。这是由于GPU能够提供并行处理的能力,极大地加快了深度学习模型训练的速度。
device = "0" if torch.cuda.is_available() else "cpu"
数据集准备:我们设置了训练过程中的一些关键参数。这里workers变量指的是用于数据加载的工作进程的数量,而batch变量则是每一批次训练中使用的图像数目。在这个例子中,由于我们设定workers为1,这意味着数据加载过程将不会并行处理,而是顺序执行;batch设置为8,即每次训练迭代将处理8张图像。
workers = 1 # 工作进程数
batch = 8 # 每批处理的图像数量
之后,我们专注于数据集的准备,这是模型训练中不可或缺的一环。我们首先定义了数据集的名称,然后使用abs_path函数确定数据集配置文件的绝对路径。这个YAML文件包含了数据集的详细信息,如训练、验证和测试集的图像路径等。
data_name = "EmotionData"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')
在读取和处理YAML配置文件时,我们采用了yaml.load方法,它允许我们以结构化方式加载配置数据。然后,我们对数据中的path项进行了必要的调整,以确保它反映了数据集目录的实际位置。
directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
if 'path' in data:
data['path'] = directory_path
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
训练模型:加载预训练的YOLOv8模型。这里指定了模型权重文件的路径,并将任务类型设置为detect
,表示我们将使用模型进行目标检测:
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')
最后,开始训练模型。在train
方法中,我们详细指定了训练的参数,包括数据集配置文件的路径、训练使用的设备、工作进程数、输入图像的大小、训练周期以及每批次的大小:
results2 = model.train(
data=data_path,
device=device,
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
这段代码的每一步都精心设计,以确保模型能够充分学习表情数据集的特征,并且能够在实际应用中进行准确的情感状态识别。在此过程中,我们充分利用了深度学习和计算机视觉的最新进展,旨在构建一个既高效又可靠的表情识别模型。
5. 实验结果与分析
5.1 训练曲线
采用以上代码进行训练,得到的训练过程曲线如下,展示了使用YOLOv8模型在人脸表情识别任务上的训练过程中各项指标的变化情况。这些指标包括了训练和验证阶段的各种损失函数,以及精确度、召回率和平均精度(mAP)的指标。
首先对于box损失,这一损失反映了模型预测边界框与真实边界框之间的偏差。在训练和验证过程中,box损失都表现出了持续下降的趋势,这指出模型在确定对象的位置上越来越精确。验证损失的曲线在下降到某一点后趋于平稳,这暗示模型可能开始接近其在这一任务上的性能极限。对于类别损失,这个指标衡量的是模型对不同表情类别的分类性能。类似的,类别损失在训练和验证中都逐渐降低,显示出模型对于识别不同表情有了更好的判别力。值得注意的是,验证过程中类别损失的波动稍大,可能是因为验证集中存在一些模型难以正确分类的样本。还有定位损失,其衡量了模型在预测关键点定位方面的精确度。训练和验证的定位损失都随着时间降低,表明模型在识别表情的关键区域方面有显著的改进。
在性能指标方面,精确度的提高表明在模型识别为正类的样本中,真正为正类的比例在增加。随着训练的进行,模型减少了误报的情况。召回率的波动较大,这通常指模型在不同阶段对于实际表情的识别程度变化。初期召回率较低可能是由于模型还在学习中,错过了一些正类别的标签。随着训练的继续,召回率逐渐稳定,并在一定程度上提高,这意味着模型错过的正类标签数量在减少。
最后,我们来看平均精度均值(mAP),尤其是[email protected]和[email protected]:0.95。[email protected]的稳步上升显示了模型对于表情识别的准确性提高,而[email protected]:0.95则提供了模型性能在不同IOU阈值下的整体评估。这个指标随着训练的进展呈现出连续上升的趋势,这表明模型在更为严苛的匹配标准下,依然能够保持其识别的准确性。
5.2 混淆矩阵
混淆矩阵是一种特别在分类问题中广泛使用的工具,它展示了模型预测与实际标签之间的关系。在我们的人脸表情识别模型中,混淆矩阵揭示了模型在不同表情类别上的识别准确性。根据提供的混淆矩阵,可以看到该矩阵涵盖了七种表情类别:愤怒、蔑视、厌恶、恐惧、快乐、中立、悲伤,以及一个“背景”类别,后者可能指的是没有检测到明显表情的情况。
从矩阵中可以观察到,某些表情如“快乐”(Happy)得到了相对较高的自分类正确率,其对应的值为0.77,表明模型能够相对准确地识别出快乐的表情。相对而言,“厌恶”(Disgust)的表现最差,其主要被误分类为“愤怒”(Anger),这可以从两者之间的混淆矩阵值0.63观察得到。这种混淆可能是由于这两种表情在面部表情上有一定的相似性,导致模型难以区分。
进一步分析,“中立”(Neutral)表情也显示出较高的自分类正确率,为0.55。但我们也可以看到有一个显著的误分类,将“中立”误分类为“快乐”,这可能是因为中立表情在不同人群中的表现差异较大,或者在标注数据集时,这两种表情之间的边界不够明确。“悲伤”(Sad)和“恐惧”(Fear)的表情识别表现中等,分别为0.52和0.55。这表明模型在这两种表情上有可靠的识别能力,但仍然存在一定的误识别。例如,“悲伤”被误识别为“中立”和“厌恶”的情况较多,这可能是因为在真实世界的表达中,“悲伤”常常以微妙的面部变化表现,容易与其他情绪混淆。“惊讶”(Surprise)与“背景”的识别则存在明显的混淆,其中“惊讶”有0.52的比例被正确识别,但也有高达0.20和0.14的比例分别被误分类为“快乐”和“恐惧”。这可能是因为“惊讶”在面部表情上与这两种情绪共享了一些特征,如张开的眼睛可能与快乐的笑或恐惧时的警觉表情相混淆。
至于“背景”类别,它似乎在模型中被用作捕捉那些不含明显情绪表达的图像。但模型将许多具有明确情绪的表情误分类为“背景”,这可能指向了数据集中的类别不平衡问题,或者是模型在区分微妙表情和非表情状态时的不足。总体来看,该混淆矩阵提供了对模型性能的深入了解,指出了模型在特定情绪识别上的强项和弱项。这些信息对于未来改进模型,如通过增加样本多样性进行更细致的数据标注、或调整模型结构以更好地捕捉细微的面部特征等,都是至关重要的。尤其是在表情识别中,错误地将一个情绪误分类为另一个,可能在实际应用中产生不良后果。因此,我们需要深入研究误分类的原因,可能是因为数据集标注的不一致、类别间固有的相似性、或者是模型学习特征的不足。在深入模型的表现之后,对于那些表现较好的类别,我们可以分析模型识别它们的关键特征是什么,并尝试将这些特征应用到其他类别的识别中。对于那些表现不佳的类别,可能需要采集更多样化的数据以覆盖更广泛的情绪表达,或者调整模型以便它能学习到更鲁棒的特征。
混淆矩阵也揭示了一个关键问题:即使是最先进的模型也会犯错误,这强调了在实际应用中考虑模型置信度的重要性。在设计人脸表情识别系统时,不仅要追求高准确率,也要确保系统能够在不确定的预测上提供反馈,并让最终用户了解这些预测的潜在不确定性。
5.3 YOLOv8/v7/v6/v5对比实验
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在人脸表情目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含人脸表情的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指标:
- F1-Score:F1得分是一个综合指标,它平衡了模型的精确性和召回率。在这里,精确性表示模型正确预测为正的观测值占预测为正的所有观测值的比例,而召回率则指的是模型正确预测为正的观测值占所有实际正观测值的比例。对于那些类别分布不均或者在评估中精确性和召回率同等重要的情形,F1得分尤为关键。
- mAP(Mean Average Precision):mAP,即平均精度均值,是评价模型在众多类别中整体识别精准性的一项指标。通过对模型在各个类别上精度的平均值进行计算,mAP为目标检测任务中模型性能的综合评估提供了一个标准化的度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.493 | 0.493 | 0.492 | 0.497 |
F1-Score | 0.48 | 0.48 | 0.48 | 0.48 |
(3)实验结果分析:
在本次表情识别任务的实验设计中,我们旨在对比YOLO系列的四个版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在同一数据集上的性能表现。通过这样的对比,我们可以深入理解每个版本在处理相同任务时的优势与不足,为后续的模型选择和优化提供依据。在度量指标上,我们选用了F1-Score和mAP(mean Average Precision)作为评价标准。F1-Score结合了精确率和召回率,是一个反映模型准确性的综合指标。而mAP则是评估模型在各个类别上平均性能的重要标准,它综合了所有查准率和查全率的均值。
从实验结果来看,各个模型的mAP得分非常接近,其中YOLOv8n以0.497的得分略领先于其他模型。这表明YOLOv8n在平均准确度上有轻微的优势,能够在多个类别上保持相对较高的检测性能。同时,所有模型的F1-Score均为0.48,这说明在精确率和召回率的平衡上,四个模型的表现没有显著差异。
进一步分析YOLOv8n的优势,可能与其采用的新颖架构和优化算法有关。YOLOv8n继承了YOLO系列快速检测的特点,并在网络结构、损失函数等方面进行了改进,提升了模型对小目标和复杂背景下的表情的识别能力。此外,YOLOv8n在训练策略和数据预处理上可能也进行了针对性的优化,从而提高了模型对表情特征的捕捉能力。
虽然YOLOv8n在mAP上略有优势,但这种优势并不明显。考虑到实验的复杂性,这种细微的差异可能来源于数据集特征分布、模型内部参数初始化或训练过程中的随机性。而F1-Score的统一表现也提示我们,在精确率和召回率上,四个版本的YOLO模型可能已接近其在当前数据集和任务上的性能极限。
综上所述,尽管YOLOv8n在mAP指标上表现略好,但从整体上看,四个版本的YOLO模型在我们的表情识别任务上表现相近。这可能意味着在这一特定任务上,YOLO模型的改进已趋于饱和,未来的工作可能需要探索更多元的改进方向,如数据增强、网络结构创新或融合其他类型的特征学习方法。此外,我们也应该关注模型的计算效率和部署成本,以在实际应用中实现最佳的性价比。
6. 系统设计与实现
6.1 系统架构设计
本系统旨在提供一个实时的人脸表情识别平台,它能够通过摄像头捕获或上传的文件进行表情检测,并实时显示检测结果。系统架构设计围绕三个主要部分展开:用户界面(UI)、检测引擎、结果展示与记录。这三个部分协同工作,提供一个流畅且互动性强的用户体验。
(一)用户界面(UI)
用户界面是与用户直接交互的前端部分,我们采用Streamlit框架快速搭建。用户界面是系统与用户互动的前线,我们通过Detection_UI
类来搭建和管理。这个类负责初始化UI、设置页面配置(setup_page
方法),以及侧边栏的配置项(setup_sidebar
方法),包括:
- 配置面板:允许用户根据需求调整模型参数(如置信度阈值、IOU阈值),选择模型类型(YOLOv8/v7/v6/v5),以及上传自定义模型权重。
setup_sidebar
方法中,用户可以通过滑块调整conf_threshold
(置信度阈值)和iou_threshold
(IOU阈值),选择model_type
(模型类型),并上传自定义的模型权重文件。 - 输入源选择:用户可以选择实时摄像头捕获或上传图片/视频文件作为检测输入。同样在
setup_sidebar
方法中,用户通过下拉菜单选择selected_camera
(摄像头输入)或上传文件(图片/视频),作为检测的输入源。 - 显示模式切换:提供单画面或双画面显示模式,单画面仅展示检测结果,双画面同时展示原始画面和检测结果,增强了比较和分析的便利性。在
setupMainWindow
方法中,用户可以通过单选按钮切换显示模式,选择“单画面显示”或“双画面显示”。
(二)检测引擎
检测引擎是系统的核心,基于YOLOv8/v7/v6/v5模型构建,通过YOLODetector
类实现。该类封装了YOLO模型的加载、预处理、推理和后处理过程:
- 模型加载:在
Detection_UI
类的初始化方法__init__
中,调用YOLOv8v5Detector
的load_model
方法,根据用户的选择加载相应的模型和权重。 - 图像预处理:在
frame_process
方法中,输入的图像首先被调整大小以适配模型要求,然后进行其他必要的预处理步骤。 - 模型推理:
frame_process
方法中,经过预处理的图像被送入模型进行推理,YOLOv8v5Detector
类的predict
方法被调用来执行这一步骤。 - 后处理:推理完成后,
frame_process
方法利用postprocess
进行后处理,提取并处理模型输出的检测结果。
(三)结果展示与记录
系统通过几个关键的UI元素实现检测结果的实时展示和记录:
- 实时图像显示:在
setupMainWindow
和process_camera_or_file
方法中,根据用户选择的显示模式,使用image_placeholder
和image_placeholder_res
展示原始图像和检测结果图像。 - 结果筛选与导出:用户可以通过侧边栏上传的文件进行检测,并通过
toggle_comboBox
方法筛选特定的检测结果。此外,setupMainWindow
方法中提供了导出检测结果的功能,将结果保存为CSV文件。 - 日志记录:
LogTable
类负责记录每次检测的详细信息,包括时间、输入源、检测结果等。Detection_UI
类中的process_camera_or_file
方法会实时更新日志,并通过log_table_placeholder
在UI上展示日志记录。
通过将代码中的类和方法名嵌入到系统架构的描述中,我们可以提供一个更加明确和详细的系统概览。这样的介绍不仅帮助读者理解系统的工作原理,也展示了我们在设计和实现这一系统时的精细考量和专业技能。
6.2 系统流程
下面是按照程序流程步骤,每一步骤都是根据代码中的类和方法设计的,目的就是为了给大家提供一个清晰、高效的操作流程,以确保用户能够轻松使用系统并获取准确的检测结果。结合代码细节的介绍如下:
-
开始:用户启动基于YOLO的人脸表情识别系统。
-
初始化系统 (
__init__
):- 实例化
Detection_UI
类,负责系统的整体控制和界面布局。 - 通过
setup_page
方法配置Streamlit页面基础设置。 - 使用
setup_sidebar
方法初始化侧边栏,提供模型和输入源配置选项。
- 实例化
-
配置系统参数 (
setup_sidebar
):- 用户在侧边栏选择模型类型(
model_type
),如YOLOv8、YOLOv7等。 - 用户通过滑块调整置信度阈值(
conf_threshold
)和IOU阈值(iou_threshold
)。 - 若需要,用户上传自定义模型权重文件,系统通过
YOLOv8v5Detector.load_model
方法加载该模型。
- 用户在侧边栏选择模型类型(
-
选择输入源 (
setup_sidebar
):- 用户选择使用实时摄像头或上传图片/视频文件作为检测输入。
-
数据处理与检测 (
process_camera_or_file
):- 对于实时摄像头输入,系统循环调用
frame_process
方法处理摄像头捕获的每一帧图像。 - 对于文件上传,系统读取文件内容,并同样通过
frame_process
方法进行处理。 - 在
frame_process
中,系统执行图像预处理、YOLOv8v5Detector.predict
进行模型推理和结果的后处理。
- 对于实时摄像头输入,系统循环调用
-
结果展示 (
frame_process
,setupMainWindow
):- 系统在界面上通过
image_placeholder
和image_placeholder_res
展示原始图像和检测结果图像。 - 检测结果包括在人脸上绘制的边界框以及表情类别和置信度标签。
- 系统在界面上通过
-
记录检测结果 (
LogTable
):- 检测过程中的结果实时记录到
LogTable
类中,包括检测时间、输入源、表情类别等信息。 - 用户可以通过“导出结果”按钮,触发
LogTable.save_to_csv
方法,将检测日志导出为CSV文件。
- 检测过程中的结果实时记录到
-
用户交互:
- 用户可以随时通过侧边栏修改配置参数,并通过
process_camera_or_file
方法立即看到效果。 - 通过
toggle_comboBox
方法,用户可以在界面上筛选和查看特定的检测结果。
- 用户可以随时通过侧边栏修改配置参数,并通过
-
结束:用户完成使用后关闭系统,或通过
close_placeholder
按钮停止摄像头输入处理。
通过将代码中的类和方法名称融入流程描述,我们为读者提供了一个更加明确和详细的系统操作指南。这不仅有助于理解系统的工作原理,还方便开发者和技术爱好者深入研究和定制系统功能。
代码下载链接
如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:
资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷
演示与介绍视频 :https://www.bilibili.com/video/BV1dM4m1X77Y/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2Xm5tq
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmJhp
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmZ1w
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Xmp5q
完整安装运行教程:
这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:
- Pycharm和Anaconda的安装教程:https://deepcode.blog.csdn.net/article/details/136639378;
软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:
- Python环境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
- 离线依赖包的安装指南:https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);
如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。
7. 结论与未来工作
本文通过深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在人脸表情识别领域的应用,成功开发了一个结合了这些先进算法的人脸表情识别系统。通过对多个版本的YOLO模型进行细致的比较和优化,本研究不仅提升了人脸表情识别的准确率和实时性,还通过Streamlit创建了一个直观、美观且易于使用的Web应用,使用户能够轻松地进行表情识别,从而在实际应用中发挥重要作用。
经过一系列实验验证,本文所提出的方法在表情识别的准确性和处理速度上都达到了令人满意的水平。同时,我们还提供了完整的数据集处理流程、模型训练和预测的代码,以及基于Streamlit的系统设计和实现细节,为后续的研究者和开发者复现和参考提供了方便。尽管取得了一定的成果,但人脸表情识别作为一个复杂多变的任务,仍然面临着许多挑战和改进空间。在未来的工作中,我们计划从以下几个方向进行探索:
- 模型优化:继续探索更深层次的网络结构和优化策略,如神经网络架构搜索(NAS)技术,以进一步提升模型的性能和效率。
- 多模态融合:考虑结合语音、文本等其他模态信息,采用多模态学习方法进行表情识别,以更全面地理解人类的情感和意图。
- 跨域适应性:研究跨文化、跨年龄组的表情识别,通过领域自适应技术提高模型在不同人群和环境中的泛化能力。
- 用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。
- 实际应用拓展:探索人脸表情识别在更多实际应用场景中的应用,如在线教育、远程会议、智能客服等,以发挥其最大的社会和经济价值。
总之,人脸表情识别技术正处于快速发展之中,随着技术的不断进步和应用场景的不断拓展,我们相信在不久的将来,基于深度学习的人脸表情识别将在人机交互、社会安全、医疗健康等领域发挥更加重要的作用。
Beltagy I, Peters M E, Cohan A. Longformer: The long-document transformer[J]. arXiv preprint arXiv:2004.05150, 2020. ↩︎
Han K, Wang Y, Chen H, et al. A survey on vision transformer[J]. IEEE transactions on pattern analysis and machine intelligence, 2022, 45(1): 87-110. ↩︎
Wang Y, Wang C, Zhang H, et al. Automatic ship detection based on RetinaNet using multi-resolution Gaofen-3 imagery[J]. Remote Sensing, 2019, 11(5): 531. ↩︎
Jiang H, Learned-Miller E. Face detection with the faster R-CNN[C]//2017 12th IEEE international conference on automatic face & gesture recognition (FG 2017). IEEE, 2017: 650-657. ↩︎
Chen K, Wang J, Pang J, et al. MMDetection: Open mmlab detection toolbox and benchmark[J]. arXiv preprint arXiv:1906.07155, 2019. ↩︎