目录
摘要
在当今数字化与智能化飞速发展的时代,人脸面部表情识别技术在人机交互、心理健康评估、市场调研等众多领域展现出了巨大的应用潜力。基于 YOLOv8 的人脸面部表情识别系统旨在通过精准识别面部表情,深入挖掘人类情感信息,为各行业提供更具人性化与智能化的解决方案。
本系统以先进的 YOLOv8 深度学习框架为核心,借助大量丰富多样的人脸面部表情图像数据进行模型训练。总共收集了涵盖愤怒、快乐、悲伤、惊讶、恐惧、厌恶和平静等多种基本表情的 8000 张图片,精心划分数据集,其中 6000 张图片作为训练集,用于模型的深度训练,使其能够充分学习不同表情的特征模式;2000 张图片作为验证集,用于评估和优化模型性能,确保模型的准确性与泛化能力。
基于训练好的模型,运用 Python 这一功能强大且应用广泛的编程语言,结合 PyTorch 深度学习库与 OpenCV 计算机视觉库,以及 PyQt5 进行用户界面开发,打造出一款功能完备、界面友好的人脸面部表情识别系统。该系统支持通过摄像头实时捕捉人脸图像,快速准确地识别面部表情,并在界面上直观展示识别结果。同时,也支持对本地图片和视频文件进行表情识别,且能够自动保存识别过程中的关键信息与结果,方便用户后续查看与分析。
此外,为方便研究人员和开发者进一步探索与优化该系统,本文提供了完整详细的 Python 代码,以及全面且易于理解的使用教程。此系统的开发与应用,有望推动人脸面部表情识别技术在多个领域的深入应用,为提升人机交互体验、辅助心理健康诊断、优化市场调研策略等方面提供有力支持,具有显著的实用价值与广阔的发展前景。
功能介绍
-
检测对象:能对 14 种水稻害虫进行目标检测,包括水稻叶卷螟、水稻叶蝉、稻茎蝇等。
-
检测方式:支持图片、视频、摄像头检测,还能批量检测图片。
-
界面展示:实时显示目标位置、总数、置信度及用时。
-
结果保存:可保存图片或视频的检测结果。
开发环境
-
后端: Python 3.9
-
前端: Pyqt5
-
数据集:网络搜集
-
算法:YOLOv8
-
开发平台:Pycharm + vscode
-
运行环境:Windows 10/11
界面展示
初始界面
检测结果
模型的训练、评估与推理
YOLOv8简介
在计算机视觉领域,物体识别至关重要且复杂,应用于安防、自动驾驶等多个方面。物体定位要在图像或视频里找到物体、分类并给出边界框和名称,主要有两阶段和一阶段这两种方法。
两阶段方法,比如 R - CNN 系列,先生成区域建议,再用分类器和回归器细化。单阶段方法像 SSD、YOLO 等,直接预测边界框和物体名称,速度快、更简单,但准确性和稳健性稍弱。
YOLO 是重要的单阶段检测算法,把输入图像分成单元格网络,预测边界框、确定性分数及类别概率来得出检测结果。它检测大中型物体速度快,但有定位粗糙、小物体检测效果差等问题。
自 YOLO 问世,出现了 YOLOv2 到 YOLOv7 等改进版本。它们融入锚框、多尺度预测等技术,提升了 YOLO 的精度、稳定性和效率。不过,在小物体、遮挡物体及复杂背景场景下仍有提升空间。
本文介绍的 YOLOv8,基于以往 YOLO 版本,融入新特性与改进,追求物体定位的高速度、高精度,同时保证稳定性和稳健性。
技术改进
-
注意力机制:运用 ECA、GAM 等,让模型更好聚焦图像关键信息,提升检测精度。
-
卷积层优化:采用可变形卷积、动态卷积,增强模型对不同形状和大小目标的适应能力。
-
主干网络改进:选用 MobileNetV4 等轻量化结构,减少计算量,加快检测速度。
-
特征融合模块:引入 BiFPN、AFPN 等,提高对多尺度目标的检测能力。
-
检测头改进:借助 RT - DETR 技术,改善不同尺寸目标的检测效果。
-
损失函数和 IoU 优化:改进损失函数与 IoU 计算方法,提升回归精度与检测性能。
-
NMS 和其他模块改进:优化非极大值抑制(NMS)等模块,提高检测准确性与效率。
-
轻量化设计:注重轻量化,采用 VanillaNet 等架构,适配资源受限设备。
-
多尺度检测能力:利用 SPD - Conv 技术,增强对小目标和多尺度目标的检测。
-
优化器改进:可能采用 Lion 等新优化器,提升训练效率与模型性能。
算法概述
YOLOv8 是 YOLO 系列目标检测模型的最新成果,基于以速度和性能著称的 YOLO9000 发展而来。YOLOv3 和 YOLOv4 的改进,推动了模型在复杂环境下检测速度与精度的提升。
网络体系结构
YOLOv8 主要由骨干网络和检测头构成。
-
骨干网:
-
基于 EfficientNet:源于以复合扩展思想设计的 EfficientNet,该架构通过平衡扩展网络宽度、深度和分辨率提升性能。以 EfficientNet - b0 为基础网络(29 层卷积神经网络,含挤压和激励模块的改进残差块),经复合缩放系数生成多种变体。YOLOv8 选用 EfficientNet - B4(71 层,1900 万个参数),能在速度与精度间平衡,提取多尺度特征。输入 512×512 像素图片,骨干网输出 5 个不同分辨率和维度特征图(P3 - P7,P3 分辨率最高),用于后续处理。
-
-
增强版 CSPDarknet:将 CSP 网络融入 Darknet 架构,每个阶段特征图分两部分,一部分经密集卷积块处理后与另一部分直接拼接,降低计算复杂度同时保持准确性,由多个含分割、密集块、过渡层和拼接操作的 CSP 块组成。
-
-
Neck:采用 PANet Neck 网络,在 FPN 基础上增加自底向上路径,涵盖自底向上特征提取、自顶向下语义特征传播及额外自底向上路径,改善网络层间信息流与特征融合。
-
检测头:
-
Anchor - Free 点检测 Head:区别于传统依赖预定义 Anchor 框的 YOLO 模型,简化架构、减少计算开销,加快推理,提升检测小型和密集物体能力。
-
基于 NAS - FPN:一种自动生成特征金字塔网络的神经架构搜索方法,用强化学习找最优特征融合技术(含元素运算、池化和连接等操作)。YOLOv8 以 NAS - FPN - Cell(六层 256 通道子网)为检测头,融合 5 个骨干网特征图,输出 5 个同维度特征图(P3' - P7',P3' 比例尺最小),用于生成边界框预测。
-
预测与锚盒:类似 YOLOv3,为每个特征图预测 3 个边界框和置信度分数,每张图片共 15 个。预测边界框类概率并结合置信度得最终结果。使用 9 个经 k - means 聚类确定的锚盒提高精度,按尺度分配到不同特征图。
-
激活函数:使用 SiLU 替代 Leaky ReLU,改善梯度流动、增强特征表现力,降低计算复杂度、减少模型大小,利于边缘部署。
-
新功能和增强
-
增强后处理:改进非最大值抑制(NMS)算法,优化重叠边界框处理和检测选择,减少假阳性,提高检测精确度。
-
训练技术:
-
混合精度训练:结合 16 位和 32 位浮点运算,加快训练、减少内存使用,不影响模型精度,适合边缘设备。
-
超参数优化:自动调整超参数,通过多组实验选最优配置,节省时间,确保模型在不同任务和数据集表现良好。
-
-
新增损失函数:采用 Focal loss,聚焦困难样本,降低简单样本影响,通过调节因子和缩放因子,提高不平衡和噪声数据集检测召回率与精度,减少假阳性和假阴性。
-
新的数据增强方法:运用 Mixup,混合两张图像及其标签生成新数据,提升数据多样性和复杂性,减少过拟合,增强模型泛化能力,扩展至目标检测处理边界框和多类别。
-
新的评价指标:引入跨尺度平均精度 (APAS),衡量不同尺度物体检测精度,是标准平均精度 (AP) 扩展,考虑目标尺度变化,计算不同尺度范围 AP 并平均得最终分数,更全面反映算法在不同大小和形状物体上的性能。
-
其他:
-
C2f 构建块:增强特征提取与融合,提升模型捕获细节和复杂模式能力,提高检测准确性。
-
统一框架:为目标检测、实例分割和姿态估计等多种计算机视觉任务提供统一框架,适用于需多种分析的边缘应用。
-
导出选项:支持导出为 ONNX、CoreML 和 TensorRT 等多种格式,便于在不同平台和硬件加速器部署。
-
模型分析
本文将所提策略与过往 YOLO 变体及其他先进目标检测策略对比,借助 COCO、PASCAL VOC 和 WIDER FACE 等基准数据集,在不同度量标准和场景下评估该策略的性能与效能。
数据集
训练和测试 YOLOv8 模型使用了以下数据集:
-
COCO:这是用于对象检测、分割及图像字幕的大规模数据集,包含 80 个类别和超 20 万张图像,其中 11.8 万张用于训练,5000 张用于验证,40500 张用于测试。该数据集极具挑战性且丰富多样,涵盖广泛的物体大小、形状及类别。因其在目标检测领域的高知名度与广泛应用,成为评估方法的主要数据集。
-
PASCAL VOC:经典的对象检测与分类数据集,有 20 个类别和超 1.1 万张图像,5000 张用于训练和验证,6000 张用于测试。它相对简单且均衡,涵盖常见对象类别,难度适中。作为成熟且广泛使用的目标检测数据集,可作为与其他策略对比的补充数据集。
-
WIDER FACE:大规模人脸检测数据集,含超 3.2 万张图像和 39.3 万张人脸,12800 张用于训练,3200 张用于验证,16000 张用于测试。该数据集颇具挑战性与复杂性,涵盖各种面部尺度、姿势、表情、遮挡及光照情况。用于展示方法在人脸检测这一重要实际任务中的性能。
指标
通过以下指标衡量 YOLOv8 模型的性能与效率:
-
跨尺度平均精度 (APAS):用于衡量不同尺度物体的检测精度,是标准平均精度 (AP) 的扩展。APAS 考虑物体尺度变化,计算小、中、大不同尺度范围的 AP,再对这些 AP 求平均得出最终分数,能全面反映算法在不同物体大小和形状下的性能。作为 COCO 数据集的官方指标,是评估 COCO 数据集上策略的常用指标。
-
平均精度 (Mean Average Precision, mAP):衡量不同类别物体检测的平均精度,通过对每个对象类的 AP 求平均得到最终分数。它简单且应用广泛,能反映算法在不同对象类别上的性能。作为 PASCAL VOC 数据集的官方指标,用于在该数据集上与其他方法对比的补充度量。
-
平均 IoU (AIoU):衡量边界框预测的平均质量,计算方法是对每个边界框预测的交并比 (Intersection over Union, IoU) 分数取平均得出最终分数。IoU 用于衡量预测边界框与真实边界框的重叠程度,范围从 0 到 1,0 表示无重叠,1 表示完全重叠。AIoU 能反映算法在目标定位方面的性能,是 WIDER FACE 数据集的官方度量,用于评估该数据集上的方法。
-
帧数每秒 (FPS):衡量目标定位算法速度,通过算法处理的帧数除以总耗时得出最终分数。在目标检测尤其是实时应用中,FPS 是反映算法有效性和通用性的重要实用指标,用于衡量所有数据集上方法的速度并与其他方法对比。
Coco 数据集上的结果
在 COCO 数据集的官方 train2017、val2017 和 test - dev2017 分割上训练和测试 YOLOv8 模型。依据官方评估协议,使用 APAS 指标评估方法,并通过单个 NVIDIA RTX 3090 GPU,以 FPS 指标衡量方法在 COCO 数据集上的速度。
结果显示,YOLOv8 模型在所有方法中表现最佳,APAS 得分达 52.7,相比之前最佳方法 YOLOv7 提高 2.4 分;同时速度也最优,FPS 为 150,比之前最佳方法 YOLOv5 快 10 帧。这表明 YOLOv8 模型在 COCO 数据集上实现了目标检测速度与精度的最佳平衡,在这两个指标上均超越现有方法。
数据集准备与训练
数据准备
通过网络上搜集关于水稻害虫的各类图片
,并使用LabelMe标注工具对每张图片中的目标边框(Bounding Box)及类别进行标注。一共包含1248张图片
,其中训练集包含1060张图片
,验证集包含188张图片
,部分图像如下图所示。
模型训练
图片数据的存放格式如下,在项目目录中新建datasets
目录,同时将检测的图片分为训练集与验证集放入Data
目录下。
同时我们需要新建一个data.yaml
文件,用于存储训练数据的路径及模型需要进行检测的类别。YOLOv8在进行模型训练时,会读取该文件的信息,用于进行模型的训练与验证。data.yaml
的具体内容如下:
train: E:\MyCVProgram\RiceInsectDetection\datasets\Expressiondata\train
val: E:\MyCVProgram\RiceInsectDetection\datasets\Expressiondata\val
nc: 14
names: ["sadness", "fear", "disgust", "happiness", "anger", "surprise", "neutrality"]
注:train与val后面表示需要训练图片的路径,建议直接写自己文件的绝对路径。
数据准备完成后,通过调用train.py
文件进行模型训练,epochs
参数用于调整训练的轮数,batch
参数用于调整训练的批次大小【根据内存大小调整,最小为1】,代码如下:
# 加载模型
model = YOLO("yolov8n.pt") # 加载预训练模型
# Use the model
if __name__ == '__main__':
# Use the model
results = model.train(data='datasets/RiceInsectData/data.yaml', epochs=250, batch=4) # 训练模型
# 将模型转为onnx格式
# success = model.export(format='onnx')
模型推理
模型训练完成后,我们可以得到一个最佳的训练结果模型best.pt
文件,在runs/train/weights
目录下。我们可以使用该文件进行后续的推理检测。
图片检测代码如下:
# 所需加载的模型目录
path = 'models/best.pt'
# 需要检测的图片地址
img_path = "TestFiles/IP000000674.jpg"
# 加载预训练模型
# conf 0.25 object confidence threshold for detection
# iou 0.7 intersection over union (IoU) threshold for NMS
model = YOLO(path, task='detect')
# model = YOLO(path, task='detect',conf=0.5)
# 检测图片
results = model(img_path)
res = results[0].plot()
cv2.imshow("YOLOv8 Detection", res)
cv2.waitKey(0)
执行上述代码后,会将执行的结果直接标注在图片上,结果如下:
开源代码
链接: https://pan.baidu.com/s/1-3maTK6vTHw-v_HZ8swqpw?pwd=yi4b
提取码: yi4b