项目简介

本项目以 YOLOv8 目标检测框架为核心,构建了一套完整的人脸表情识别系统,涵盖数据集处理、模型训练与调优、可视化分析以及交互式推理系统的全流程开发。系统能够在图片、视频及摄像头实时画面中同步完成人脸定位表情分类,支持 7 种基础表情类别的端到端识别。


目录


深度学习开发流程

本项目完整复现了深度学习系统从零到部署的标准流程:

数据集构建与预处理
        ↓
预训练模型选型与配置
        ↓
多策略数据增强
        ↓
模型训练与实时监控
        ↓
指标评估与超参调优
        ↓
最优权重导出
        ↓
GUI 推理系统集成

数据集说明

数据集概况

项目 内容
数据集名称 FER(Facial Expression Recognition)YOLO 格式
标注格式 YOLO txt(每行:类别ID cx cy w h,归一化坐标)
训练集图片数 约 10,000 张
测试集图片数 约 3,068 张
总计 约 13,068 张
类别数量 7 类

表情类别

ID 英文标签 中文含义 说明
0 Surprise 惊讶 眉毛上扬、嘴巴张开
1 Fear 恐惧 眉毛皱起、眼神紧张
2 Disgust 厌恶 鼻子皱起、嘴角下撇
3 Happiness 高兴 嘴角上扬、面部舒展
4 Sadness 悲伤 眉毛下垂、嘴角下拉
5 Anger 愤怒 眉毛紧锁、目光锐利
6 Neutral 中性 面部无明显情绪特征

数据集目录结构

fer-dataset-yolo/
├── loopy.yaml              # 数据集配置文件
├── train/
│   ├── images/             # 训练集图片
│   └── labels/             # 训练集标注(YOLO格式)
└── test/
    ├── images/             # 测试集图片
    └── labels/             # 测试集标注

标注格式示例

# 格式:类别ID  中心点x  中心点y  宽度  高度(均为相对图片宽高的归一化值)
4  0.5097  0.3528  0.3948  0.3183

数据预处理与增强策略

训练时采用多种在线数据增强,增强模型对不同场景的鲁棒性:

增强方式 参数 作用
HSV 色调抖动 hsv_h=0.015 模拟不同光源色温
HSV 饱和度抖动 hsv_s=0.7 模拟低/高饱和场景
HSV 明度抖动 hsv_v=0.4 模拟亮度变化
随机水平翻转 fliplr=0.5 增加左右对称样本
Mosaic 拼接 mosaic=1.0 4 图合并,扩充上下文
MixUp 混合 mixup=0.1 提升决策边界平滑性

模型训练

预训练模型

选用 YOLOv8s(Small)作为基础模型,在 COCO 数据集预训练权重上进行迁移学习。该规格在精度与推理速度之间取得最佳平衡,适合表情识别这类细粒度分类任务。

训练流程

  1. 加载 yolov8s.pt 预训练权重,冻结骨干网络初期层
  2. 以小学习率预热(Warmup)3 轮,逐步适应新任务分布
  3. 余弦退火(Cosine Annealing)调度器动态调整学习率
  4. 启用早停(Early Stopping)机制,patience=25,防止过拟合
  5. 每 10 轮保存一次检查点,最优验证 mAP 自动保存为 best.pt

运行训练

python train.py

所有训练产物(权重、曲线图、混淆矩阵等)自动保存至 train_result/fer_yolov8s/


训练参数

参数名 说明
模型 yolov8s Small 规格,兼顾精度与速度
输入分辨率 640 × 640 标准 YOLO 输入尺寸
训练轮次 100(早停于第 93 轮) patience=25 触发早停
批大小 16 适配 12 GB 显存
优化器 AdamW 自适应权重衰减优化
初始学习率 0.001 余弦退火衰减
终止学习率 lr0 × 0.01 衰减至 0.00001
权重衰减 0.0005 L2 正则化,抑制过拟合
预热轮次 3 稳定初期梯度
训练设备 NVIDIA RTX 3060 12G CUDA 加速
数据加载线程 4 DataLoader workers

训练指标与可视化

最终评估指标(测试集)

指标 数值 含义
mAP@50 0.8649 IoU 阈值 0.5 下的平均精度均值
mAP@50-95 0.7177 IoU 从 0.5~0.95 步长 0.05 的综合均值
Precision 0.8316 预测为正类中真正正类的比例
Recall 0.8105 实际正类中被正确预测的比例

损失曲线说明

训练过程中记录三类损失,均保存于 train_result/fer_yolov8s/results.csv

损失类型 含义 正常趋势
Box Loss 预测框与标注框的位置偏差(CIoU Loss) 持续下降并趋于平稳
Cls Loss 表情分类交叉熵损失 快速下降后趋于平稳
DFL Loss 分布式焦点损失,优化边界框回归精度 缓慢下降

验证集损失(val/box_loss、val/cls_loss)与训练损失同步下降且差距不大,说明模型未出现明显过拟合。

指标曲线说明

曲线 含义
Precision 曲线 随训练轮次提升,代表误检率下降
Recall 曲线 随训练轮次提升,代表漏检率下降
mAP@50 曲线 综合精度指标,早期快速爬升后趋于收敛
mAP@50-95 曲线 更严格的定位精度指标,收敛更慢但更能体现模型质量

系统功能

系统基于 PyQt6 构建可视化交互界面,采用浅色渐变主题,顶部导航栏设计,包含六大功能模块:

图片识别

  • 支持 JPG / PNG / BMP / WebP 格式
  • 一键加载图片,YOLOv8 推理检测人脸区域并输出表情类别
  • 带标注的结果图实时展示(彩色检测框 + 中文标签)
  • 统计摘要:检测人脸总数、表情种类、平均置信度、最高置信度
  • 表情分布可视化(Matplotlib 横向条形图)
  • 支持导出标注图片、导出 CSV 检测明细

视频识别

  • 支持 MP4 / AVI / MOV / MKV 等主流视频格式
  • 可设定每隔 N 帧检测一次,兼顾速度与密度
  • 实时播放标注画面 + 帧进度条
  • 当前帧与累计检测统计同步展示

摄像头实时检测

  • 支持多摄像头设备切换(设备号 0~10)
  • 实时推流 + 表情检测,可随时开启/暂停检测
  • 截图保存功能(保存至 train_result/screenshots/
  • 本次会话累计统计一键存入历史记录

检测历史

  • 自动记录每次图片、视频、摄像头检测结果
  • 支持按类型筛选(图片 / 视频 / 摄像头)及关键词搜索
  • 点击记录查看详细检测信息
  • 支持历史数据导出为 CSV

模型管理

  • 默认加载 train_result/fer_yolov8s/weights/best.pt
  • 支持浏览加载任意 YOLOv8 权重文件
  • 可动态调节置信度阈值(conf)与 IoU 阈值,实时生效
  • 展示模型基本信息、文件大小及全部类别说明

训练指标展示

  • 自动扫描 train_result/ 下所有实验目录
  • 绘制训练/验证损失曲线、mAP 曲线、Precision/Recall 曲线
  • 展示最终轮次四项核心指标的汇总柱状图

技术栈

层次 技术 用途
深度学习框架 PyTorch 模型训练底层计算
目标检测 Ultralytics YOLOv8 人脸定位 + 表情分类
图形界面 PyQt6 桌面 GUI 框架
样式系统 QSS(Qt Style Sheets) 浅色渐变主题
图表绘制 Matplotlib 训练曲线、分布图
图像处理 OpenCV 视频读写、帧处理
中文标注 Pillow 检测框中文标签渲染
数据处理 NumPy 矩阵运算与图像转换
历史存储 JSON 轻量级本地检测历史
编程语言 Python 3.9

项目结构

c166/
│
├── app.py                          # 系统启动入口
├── train.py                        # 模型训练入口
│
├── fer-dataset-yolo/               # 数据集
│   ├── loopy.yaml                  # 数据集配置
│   ├── train/                      # 训练集(图片 + 标注)
│   └── test/                       # 测试集(图片 + 标注)
│
├── config/
│   └── train_config.py             # 训练超参数配置
│
├── core/                           # 核心逻辑层
│   ├── detector.py                 # YOLOv8 推理封装 + 标注绘制
│   ├── workers.py                  # QThread 后台检测线程
│   └── trainer.py                  # 训练器封装
│
├── ui/                             # 界面层
│   ├── main_window.py              # 主窗口(顶部导航 + 页面堆栈)
│   ├── utils/
│   │   ├── styles.py               # 全局 QSS 样式表
│   │   ├── history.py              # 检测历史读写管理
│   │   └── image_utils.py          # 图像格式转换工具
│   └── pages/
│       ├── image_page.py           # 图片识别页
│       ├── video_page.py           # 视频识别页
│       ├── camera_page.py          # 摄像头实时检测页
│       ├── history_page.py         # 检测历史页
│       ├── model_page.py           # 模型管理页
│       └── metrics_page.py         # 训练指标展示页
│
└── train_result/                   # 训练产物(自动生成)
    └── fer_yolov8s/
        ├── weights/
        │   ├── best.pt             # 最优模型权重
        │   └── last.pt             # 最终轮次权重
        ├── results.csv             # 逐轮训练指标
        ├── confusion_matrix.png    # 混淆矩阵
        └── ...                     # PR 曲线、F1 曲线等

快速开始

环境安装

pip install -r requirements.txt

启动训练

python train.py

训练完成后权重自动保存至 train_result/fer_yolov8s/weights/best.pt

启动系统

python app.py

系统会自动加载默认最优权重,若权重不存在,可在【模型管理】页手动选择。


开发信息

  • 作者:Jay
  • 定制联系:vx:Jay8059
  • 开发年份:2026

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐