# Facial-Expression-Recognition **Repository Path**: memoryQZY/Facial-Expression-Recognition ## Basic Information - **Project Name**: Facial-Expression-Recognition - **Description**: 本项目是一个基于深度学习的人脸检测与表情识别系统,使用YOLOv11进行人脸检测,并使用自定义训练的YOLO模型进行表情识别。系统支持图像、视频文件和实时摄像头输入,具有直观的图形用户界面,可以轻松进行人脸检测和表情分析。 - **Primary Language**: Python - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 6 - **Created**: 2025-06-24 - **Last Updated**: 2025-11-28 ## Categories & Tags **Categories**: cv **Tags**: None ## README 1. ## 引言 在人机交互和情感计算领域,人脸表情识别一直是一个备受关注的研究方向。随着深度学习技术的快速发展,特别是目标检测和图像分类算法的进步,实时、高精度的人脸表情识别系统已经成为可能。本文将详细介绍一个基于YOLOv11的人脸表情识别系统,该系统不仅能够实现实时人脸检测,还能准确识别多种表情状态,具有广泛的应用前景。 ## 系统概述 本文介绍的人脸表情识别系统是一个完整的端到端解决方案,主要包含以下核心功能: 1. **多输入源支持**:系统可以处理静态图像、视频文件和实时摄像头输入 2. **实时人脸检测**:采用YOLOv11人脸检测模型,实现高效准确的人脸定位 3. **多种表情识别**:能够识别6种基本表情(愤怒、厌恶、高兴、中性、悲伤、惊讶) 4. **友好的图形界面**:基于PyQt5开发的现代化界面,支持暗色主题 5. **多模型支持**:集成了多个训练模型,包括综合数据集模型、FER2013增强模型等 6. **结果可视化与保存**:处理结果可以实时显示并保存为图像或视频文件 ## 系统截图(部分) ![在这里插入图片描述](ad0ebb3031e84da8a89cef865a1edf9b.png) ## 技术原理 ### 1. 人脸检测 本系统采用YOLOv11(You Only Look Once)作为人脸检测的核心算法。YOLO系列算法是目前最先进的目标检测算法之一,具有速度快、精度高的特点,特别适合实时应用场景。 YOLOv11相比早期版本,在网络结构和训练策略上都有显著改进: - 使用更高效的骨干网络 - 优化的特征金字塔结构 - 改进的损失函数 - 更强大的数据增强策略 在本系统中,我们使用专门针对人脸检测任务微调的YOLOv11模型(yolov11n-face.pt),该模型能够在各种光照条件和角度下准确检测人脸。 ### 2. 表情识别 表情识别采用基于YOLO架构的分类模型。我们训练了多个模型以适应不同场景: 1. **综合数据集模型**:使用多个数据集联合训练,具有较好的泛化能力 2. **FER2013增强模型**:基于增强的FER2013数据集训练,该数据集包含约35,000张带标注的人脸表情图像 3. **AffectNet模型**:使用AffectNet数据集训练,该数据集是目前最大的面部表情数据集之一 4. **自定义数据集模型**:使用自定义收集和标注的数据集训练,更适合特定应用场景 训练过程中采用了多种先进技术以提高模型性能: - **优化器选择**:使用AdamW优化器,结合自适应学习率和权重衰减 - **学习率调度**:采用余弦退火策略,有效避免局部最优 - **正则化技术**:使用权重衰减和Dropout防止过拟合 - **数据增强**:应用多种增强方法,包括内置增强和Mixup技术 - **早停策略**:设置耐心值为20,避免过度训练 ## 系统架构 系统采用模块化设计,主要包含以下几个核心模块: ### 1. UI模块 (UI.py) 图形用户界面是系统的交互入口,基于PyQt5开发,主要功能包括: - 输入源选择(摄像头、图像文件、视频文件) - 模型选择和参数调整 - 结果显示和保存 - 多线程处理避免UI卡顿 核心类: - `VideoThread`:视频处理线程,负责实时视频流的处理 - `FaceDetectionApp`:主应用窗口,提供用户界面和控制功能 ### 2. 人脸检测模块 (yolo_face_detection.py) 负责人脸检测的核心功能,包括: - 人脸检测模型加载和管理 - 实时视频人脸检测 - 图像人脸检测 - 视频文件人脸检测 主要函数: - `download_face_model()`:下载YOLOv11人脸检测模型 - `detect_faces_video()`:视频人脸检测(摄像头) - `detect_faces_image()`:图像人脸检测 - `detect_faces_video_file()`:视频文件人脸检测 ### 3. 表情识别模块 (image_emotion_recognition.py) 负责表情识别的核心功能,包括: - 静态图像中的人脸检测 - 表情识别与分析 - 结果可视化与保存 主要函数: - `recognize_emotion()`:识别图片中的人脸表情 ### 4. 模型训练模块 (train.py) 负责训练表情识别模型,主要特点: - 支持多种数据集(FER2013Plus、AffectNet、自定义数据集) - 高级优化器设置(AdamW) - 学习率调度(余弦退火) - 正则化技术(权重衰减、Dropout) - 数据增强(内置增强、Mixup) ## 实现细节 ### 1. 人脸检测与预处理 人脸检测是表情识别的第一步,系统使用YOLOv11模型检测图像或视频中的人脸: ```python # 使用YOLOv11检测人脸 results = face_model(frame, conf=0.8) # 处理检测结果 for result in results: boxes = result.boxes for box in boxes: # 获取边界框坐标 x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int) # 扩大边界框(调整人脸框大小) frame_height, frame_width = frame.shape[:2] # 计算边界框的扩展量(框的20%) expand_x = int((x2 - x1) * 0.2) expand_y = int((y2 - y1) * 0.2) # 应用扩展,但确保不超出图像边界 x1_expanded = max(0, x1 - expand_x) y1_expanded = max(0, y1 - expand_y) x2_expanded = min(frame_width, x2 + expand_x) y2_expanded = min(frame_height, y2 + expand_y) # 绘制扩大后的人脸框 cv2.rectangle(frame, (x1_expanded, y1_expanded), (x2_expanded, y2_expanded), (0, 255, 0), 2) ``` 值得注意的是,系统对检测到的人脸区域进行了扩展(约20%),这有助于捕获更完整的面部特征,提高表情识别的准确率。 ### 2. 表情识别流程 表情识别采用以下步骤: 1. **提取人脸区域**:从原始图像中裁剪出人脸区域 2. **预处理**:将人脸区域转换为灰度图像,以与训练数据保持一致 3. **模型推理**:使用YOLO分类模型进行表情识别 4. **结果处理**:获取预测结果,包括表情类别和置信度 5. **可视化**:在图像上显示预测结果 ```python # 提取扩大后的人脸区域 face_roi = frame[y1_expanded:y2_expanded, x1_expanded:x2_expanded] # 将人脸区域转换为灰度图像,与训练数据保持一致 face_roi_gray = cv2.cvtColor(face_roi, cv2.COLOR_BGR2GRAY) # 将灰度图像转换为3通道,因为YOLO模型需要3通道输入 face_roi_gray_3ch = cv2.cvtColor(face_roi_gray, cv2.COLOR_GRAY2BGR) # 使用YOLO模型进行表情识别 emotion_results = emotion_model(face_roi_gray_3ch) # 获取预测结果 probs = emotion_results[0].probs.data.tolist() class_id = probs.index(max(probs)) confidence = max(probs) # 获取表情标签 emotion = emotion_labels[class_id] # 在图像上显示预测结果 text = f"{emotion}: {confidence:.2f}" ``` ### 3. 多线程处理 为了避免UI卡顿,系统使用多线程处理视频流: ```python class VideoThread(QThread): """视频处理线程,避免UI卡顿""" change_pixmap_signal = pyqtSignal(np.ndarray) progress_signal = pyqtSignal(int) def __init__(self, mode='camera', file_path=None): super().__init__() self.mode = mode self.file_path = file_path self.running = True self.face_model = None self.emotion_model = None self.conf_threshold = 0.5 ``` 这种设计使得UI保持响应,同时后台进行计算密集型的视频处理任务。 ### 4. 模型训练 表情识别模型的训练采用ultralytics库,配置了一系列高级参数以优化模型性能: ```python results = model.train( data="fer2013plus", epochs=200, batch=256, imgsz=224, workers=6, # 优化器设置 optimizer="AdamW", # 使用具有自适应动量的现代优化器 lr0=0.001, # 初始学习率 lrf=0.001, # 最终学习率因子 warmup_epochs=5, # 逐渐预热以防止早期不稳定 cos_lr=True, # 余弦退火学习率调度 # 正则化 weight_decay=0.0005, # L2正则化 dropout=0.2, # 添加dropout以提高泛化能力 # 数据增强 augment=True, # 启用内置增强 mixup=0.1, # 应用mixup增强 # 训练管理 patience=20, # 早停耐心值 save_period=10, # 每10个epoch保存一次检查点 ) ``` ## 系统优势与创新点 1. **高效的实时处理**:采用YOLOv11算法,实现了高效的实时人脸检测和表情识别 2. **多模型集成**:提供多个预训练模型,适应不同场景需求 3. **友好的用户界面**:直观的图形界面,支持暗色主题,操作简便 4. **多线程架构**:采用多线程设计,保证UI响应性能 5. **中文支持**:完善的中文界面和文本渲染 6. **模块化设计**:系统各组件高度模块化,便于扩展和维护 ## 应用场景 该系统可应用于多种场景: 1. **人机交互**:提升智能设备对用户情绪的感知能力 2. **教育领域**:分析学生在学习过程中的情绪变化 3. **安防监控**:识别异常情绪状态,提前预警 4. **医疗健康**:辅助心理健康评估和情绪障碍诊断 5. **市场调研**:分析消费者对产品的情感反应 6. **娱乐游戏**:根据玩家情绪调整游戏难度或剧情 ## 系统使用指南 ### 1. 环境配置 系统需要以下环境: - Python 3.8+ - PyQt5 - OpenCV - PyTorch - Ultralytics - Pillow - NumPy 可以使用以下命令安装依赖: ```bash pip install ultralytics opencv-python PyQt5 pillow numpy torch torchvision ``` ### 2. 运行系统 启动图形界面: ```bash python UI.py ``` 命令行使用(单张图片表情识别): ```bash python image_emotion_recognition.py 图片路径 ``` 命令行使用(人脸检测): ```bash python yolo_face_detection.py --image 图片路径 # 图片模式 python yolo_face_detection.py --video 视频路径 # 视频模式 python yolo_face_detection.py --camera # 摄像头模式 ``` ### 3. 界面操作 1. 选择输入源(摄像头、图像文件或视频文件) 2. 选择表情识别模型 3. 调整置信度阈值(影响检测灵敏度) 4. 点击"开始检测"按钮 5. 查看实时结果 6. 点击"保存结果"保存处理后的图像或视频 ## 性能优化技巧 1. **预处理优化**:将人脸区域转换为灰度图像,减少计算量 2. **边界框扩展**:扩展人脸检测边界框,捕获更完整的面部特征 3. **多线程处理**:使用QThread处理视频流,避免UI卡顿 4. **置信度阈值**:提供可调整的置信度阈值,平衡检测速度和准确率 5. **模型选择**:提供多个预训练模型,可根据需要选择轻量级或高精度模型 ## 未来展望 该系统还有很大的改进和扩展空间: 1. **更多表情类别**:增加更细粒度的表情分类,如困惑、专注等 2. **跨平台支持**:开发移动端和Web版本 3. **情绪变化分析**:实现对情绪变化趋势的追踪和分析 4. **多模态融合**:结合语音、文本等多模态信息进行更全面的情绪分析 5. **边缘设备部署**:优化模型以适应边缘计算设备 6. **个性化适应**:根据用户特点自适应调整模型参数 ## 结论 本文介绍的基于YOLOv11的人脸表情识别系统,通过深度学习技术实现了高效准确的人脸检测和表情识别。系统采用模块化设计,提供友好的用户界面,支持多种输入源和多个预训练模型,具有广泛的应用前景。 随着人工智能技术的不断发展,人脸表情识别将在人机交互、情感计算等领域发挥越来越重要的作用。我们期待这个系统能为相关研究和应用提供有价值的参考。 ## 参考资料 1. YOLOv11: https://github.com/ultralytics/ultralytics 2. FER2013数据集: https://www.kaggle.com/datasets/msambare/fer2013 3. AffectNet数据集: http://mohammadmahoor.com/affectnet/ 4. PyQt5文档: https://doc.qt.io/qtforpython/ 5. OpenCV文档: https://docs.opencv.org/ ## 联系方式 qq:1830699248 --- 以上就是基于YOLOv11的实时人脸表情识别系统的详细介绍。如果您对该系统有任何疑问或建议,欢迎在评论区留言交流!