- 1. 项目亮点
- 2. 环境配置与依赖
- 3. 代码结构与功能概览
- 4. PyQt5 界面体验与交互
- 5. 推理流程拆解(检测 + 分类)
- 6. 关键代码解析(含片段)
- 7. 训练流程与超参设置
- 8. 上手运行步骤
- 9. 性能与体验优化
- 一体化桌面端:PyQt5 自定义无边框 + 阴影 + 渐变背景,支持窗口缩放与字体自适应。(@/UI.py#164-754)
- 多输入源:摄像头、图片、视频一键切换,文件选择按钮自动启停。(@/UI.py#844-1112)
- 双模型协同:YOLOv11 人脸检测 + YOLO 分类表情模型,加入历史概率平滑抗抖。(@/UI.py#541-603)
- 实时可视化:帧画布支持缩放/拖拽,中文标签叠加,六类表情概率条实时刷新。(@/UI.py#337-1201)
- 训练脚本现成: 内置 AdamW、余弦退火、Mixup、早停等配置,可直接开训。(@/train.py#1-43)
1.1 写这套系统的动机
表情识别如果只做“模型推理”,展示效果往往很弱;但如果把 摄像头实时推理 + UI 可视化 + 训练脚本 串起来,就能成为一套“拿得出手”的作品。
这套工程的目标是:
- 能跑:一条命令启动 UI,选择摄像头/视频/图片即可识别。
- 能看懂:核心推理逻辑集中在 ,代码清晰可读。
- 能扩展:替换权重、换数据集、调阈值/平滑参数,都能快速迭代。
1.2 效果展示

图片检测

视频检测
- 主要依赖:、、、、。(@/requirements.txt#1-8)
- 中文字体:Windows 自动优先黑体/宋体/微软雅黑,若缺失可放置 。(@/yolo_face_detection.py#18-45)
- :主界面与业务逻辑(输入源、模型加载、阈值滑条、统计面板、截图等)。(@/UI.py#611-1214)
- :人脸检测与中文绘制工具,封装摄像头/图片/视频通用接口。(@/yolo_face_detection.py#11-472)
- :单图片表情识别示例脚本,演示分类模型最小调用。(@/image_emotion_recognition.py#1-145)
- :Ultralytics 训练入口,集中管理超参与输出目录。(@/train.py#1-43)
- :训练/推理产物(权重、日志、结果图/视频)。
- 窗口与视觉:无边框、卡片阴影、渐变背景、呼吸 Logo,字号随窗口缩放动态调整。(@/UI.py#164-364 @/UI.py#618-747)
- 输入源切换:下拉选择摄像头/图片/视频,自动启用文件选择按钮。(@/UI.py#844-1112)
- 操作按钮:启动/停止检测、重置视图(画布缩放复位)、截图保存当前帧。(@/UI.py#884-1213)
- 统计面板:六类表情进度条实时更新,颜**分易于展示。(@/UI.py#939-1201)
- 交互细节:滚轮缩放、拖拽平移、Toast 提示、防抖概率平滑。(@/UI.py#337-603)
- 模型加载:启动时下载人脸检测权重,读取表情分类权重(默认 )。(@/UI.py#1068-1093)
- 视频线程: 独立拉流,输出帧与统计字典。(@/UI.py#495-607)
- 检测与分类:人脸框 → ROI 灰度化 → 转 3 通道 → 表情分类 → 历史概率平滑。(@/UI.py#541-603)
- 绘制展示:中文标签叠加 + 进度条刷新,画布支持缩放/平移。(@/UI.py#584-1201)
片段来源已在行号后标注,方便对照。
6.1 UI 启动与模型加载
(@/UI.py#1224-1232)
(@/UI.py#1068-1093)
6.1.1 这里做了什么?
- 人脸检测模型:通过 返回 。(@/yolo_face_detection.py#11-15)
- 表情分类模型:从 读取路径(默认 )。(@/UI.py#651-653)
- 缓存策略:如果未来你扩展多个表情模型(例如不同数据集训练的权重), 能避免频繁重复加载。
6.2 视频线程:检测 + 分类 + 平滑
这一段是整个工程的“灵魂”,它解决 3 件事:
- 拉流:摄像头/视频文件
- 人脸检测:YOLOv11 face
- 表情分类:YOLO classify
- 抖动抑制:用 对概率做平滑
(@/UI.py#495-607)
6.2.1 为什么要做“概率平滑”?
真实场景里,即使同一个表情,人脸 ROI 的光照/角度每帧都在变,导致分类概率抖动。
这里用 记录每张脸的中心点与上一帧概率分布,然后通过“最近邻匹配 + 指数滑动平均”方式做平滑:
- 匹配策略:取上一帧与当前帧中心点距离最近的人脸作为同一人。
- 平滑公式:,其中 。(@/UI.py#511-574)
这个处理能让 UI 的概率条看起来“更稳”,用户体验更好。
6.3 启动/停止逻辑(线程与阈值传递)
很多同学的 Demo 容易卡死在“线程停不下来 / UI 冻结”,你这份实现相对干净:
(@/UI.py#1138-1169)
- UI 主线程不做推理:推理在 ,UI 只负责接收信号并刷新控件。
- 阈值即时生效:滑条修改时,直接 。(@/UI.py#1131-1137)
6.4 中文绘制与自适应位置
(@/yolo_face_detection.py#48-90)
6.4.1 为什么不用 OpenCV 原生 putText?
- 边界保护:避免文字绘制越界。
- 背景遮罩:半透明黑底提高可读性。
6.5 训练脚本核心
(@/train.py#1-43)
6.5.1 为什么这套训练参数“看起来就很像认真做过”?
- AdamW + weight_decay:对分类任务更稳。
- warmup + cos_lr:能减少早期震荡,后期更细致收敛。
- mixup + dropout:提升泛化,尤其适合表情类这种“类间相似、类内差异大”的任务。
- 启动命令:
- 数据集:默认 ,可替换自定义 YOLO 分类数据集。
- 核心超参:,,,,,,,,,,,。(@/train.py#8-43)
- 输出目录:(可按项目名自动建目录)。
- 安装依赖:
- 权重准备:人脸检测 自动下载;表情权重放到 (可用你自己的权重)。(@/yolo_face_detection.py#11-17 @/UI.py#651-1129)
- 启动 UI:
- 选择输入源:摄像头/图片/视频;非摄像头模式先点“选择文件”。
- 调节阈值:滑条实时生效;阈值高→少误检,阈值低→高召回。(@/UI.py#869-1137)
- 启动/停止检测:点击主按钮;可截图保存当前帧。(@/UI.py#1094-1213)
- 推理性能:确保 GPU 环境;若窗口特别大可减小 以降低绘制开销。(@/UI.py#618-747)
- 稳定性:提高阈值或增大历史平滑 (默认 0.3)可减小抖动。(@/UI.py#511-574)
- 模型精度:小显存可减 ;精度不够可拉长 、增加 Mosaic/CutMix 等增强。
- 界面扩展:可加 FPS 显示、批量文件处理、结果导出 CSV,或做深浅色主题切换。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/232975.html