# facial_expression_recognition **Repository Path**: Joynle_konjo/facial_expression_recognition ## Basic Information - **Project Name**: facial_expression_recognition - **Description**: 基于深度学习的7类人脸表情识别系统,使用ResNet18模型和FER-2013数据集。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-25 - **Last Updated**: 2025-12-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 人脸表情识别项目 基于深度学习的7类人脸表情识别系统,使用ResNet18模型和FER-2013数据集。 ## 项目简介 本项目实现了一个完整的人脸表情识别系统,包括: - 7类表情分类(生气、厌恶、恐惧、开心、悲伤、惊讶、中性) - ResNet18深度学习模型 - 完整的训练和测试流程 - 实时摄像头表情识别 - 训练过程可视化(TensorBoard) - 详细的评估报告和可视化结果 ## 环境配置 ### 1. 创建Conda环境 ```bash conda env create -f environment.yml conda activate facial_expression ``` ### 2. 验证安装 ```bash python -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA: {torch.cuda.is_available()}')" ``` ## 数据集准备 ### 配置Kaggle API 1. 登录Kaggle: https://www.kaggle.com 2. 进入Account设置: https://www.kaggle.com/settings 3. 点击"Create New API Token"下载kaggle.json 4. 将kaggle.json放到 `~/.kaggle/` 目录 5. 设置权限(Linux/Mac): `chmod 600 ~/.kaggle/kaggle.json` ### 下载FER-2013数据集 ```bash python download_data.py ``` 数据集信息: - 总样本数: ~35,000张 - 训练集: ~28,000张 - 验证集: ~3,500张 - 测试集: ~3,500张 - 图像尺寸: 48x48灰度图 ## 使用方法 ### 1. 训练模型 ```bash python train.py ``` 训练配置: - Batch Size: 64 - Epochs: 25 - Learning Rate: 0.001 - 优化器: Adam - 预期训练时间: 2-3小时(GPU) / 10-15小时(CPU) 训练过程中会: - 自动保存最佳模型到 `checkpoints/best_model.pth` - 记录 TensorBoard日志到 `logs/` - 显示每个 epoch的loss和accuracy ### 2. 查看训练过程(TensorBoard) ```bash tensorboard --logdir=logs ``` 然后在浏览器打开: http://localhost:6006 ### 3. 测试模型 ```bash python test.py ``` 输出: - 总体准确率 - 每类表情的精确率、召回率、F1分数 - 混淆矩阵 - 测试结果保存到 `results/test_results.npy` ### 4. 生成评估报告 ```bash python evaluate.py ``` 生成内容: - 训练曲线图 (`results/plots/training_curves.png`) - 混淆矩阵 (`results/confusion_matrix/confusion_matrix.png`) - 每类准确率柱状图 (`results/plots/class_accuracy.png`) - 预测示例 (`results/predictions/predictions.png`) - 评估报告 (`results/evaluation_report.md`) ### 5. 实时表情识别 ```bash python realtime_demo.py ``` 功能: - 使用MTCNN检测人脸 - 实时预测表情 - 显示表情标签和置信度 - 显示FPS - 按 'q' 退出 ## 项目结构 ``` Facial_expression_recognition/ ├── data/ # 数据目录 │ ├── raw/ # 原始数据 │ └── fer2013.csv # FER-2013数据集 ├── models/ # 模型定义 │ ├── __init__.py │ ├── resnet.py # ResNet18模型 │ └── face_detector.py # 人脸检测 ├── utils/ # 工具函数 │ ├── __init__.py │ ├── dataset.py # 数据集类 │ ├── transforms.py # 数据增强 │ └── visualization.py # 可视化工具 ├── checkpoints/ # 模型权重 │ └── best_model.pth # 最佳模型 ├── logs/ # TensorBoard日志 ├── results/ # 结果输出 │ ├── plots/ # 训练曲线 │ ├── confusion_matrix/ # 混淆矩阵 │ └── predictions/ # 预测示例 ├── config.py # 全局配置 ├── download_data.py # 数据下载 ├── train.py # 训练脚本 ├── test.py # 测试脚本 ├── evaluate.py # 评估脚本 ├── realtime_demo.py # 实时识别 ├── environment.yml # Conda环境 └── README.md # 项目说明 ``` ## 模型架构 - **基础模型**: ResNet18 (ImageNet预训练) - **输入**: 48x48灰度图像 - **输出**: 7类表情概率 - **修改**: - 第一层卷积: 3通道 → 1通道(灰度图) - 最后FC层: 1000类 → 7类 - 添加Dropout(0.5)防止过拟合 - **参数量**: ~11M ## 预期性能 - 训练准确率: 85-90% - 验证准确率: 65-70% - 测试准确率: 65-70% - 实时识别FPS: 15-25 各类别性能(从高到低): 1. Happy(开心): 80-85% 2. Surprise(惊讶): 75-80% 3. Neutral(中性): 70-75% 4. Sad(悲伤): 65-70% 5. Angry(生气): 60-65% 6. Fear(恐惧): 55-60% 7. Disgust(厌恶): 50-55% ## 技术栈 - **深度学习框架**: PyTorch 2.0.1 - **模型**: ResNet18 - **人脸检测**: MTCNN / OpenCV Haar Cascade - **数据处理**: NumPy, Pandas, PIL - **可视化**: Matplotlib, Seaborn, TensorBoard - **评估**: scikit-learn ## 注意事项 1. **GPU支持**: 强烈建议使用GPU训练,CPU训练会非常慢 2. **数据不平衡**: Disgust类样本较少,可能影响该类准确率 3. **过拟合**: 如果训练准确率远高于验证准确率,可以: - 增加数据增强 - 增加Dropout比例 - 使用Early Stopping 4. **实时识别**: - 需要摄像头 - 光线充足效果更好 - 正面人脸识别率更高 ## 演示视频录制 ### 训练过程 1. 启动TensorBoard: `tensorboard --logdir=logs` 2. 打开浏览器: http://localhost:6006 3. 使用OBS或其他录屏软件录制loss/accuracy变化 ### 实时识别 1. 运行: `python realtime_demo.py` 2. 录制摄像头识别效果 3. 展示不同表情的识别结果 ## 课程设计说明 本项目完全符合课程设计要求: ✅ **任务类型**: 图像分类(7类表情) ✅ **模型选择**: ResNet18 ✅ **数据集**: FER-2013公开数据集 ✅ **数据量**: 35,000+张图像(>3000要求) ✅ **训练过程**: 完整的训练和验证流程 ✅ **可视化**: TensorBoard实时监控 + Matplotlib静态图 ✅ **测试评估**: 准确率、精确率、召回率、F1、混淆矩阵 ✅ **实时演示**: 摄像头实时表情识别 ✅ **代码结构**: 清晰的模块化设计 ✅ **文档完整**: README + 评估报告 ## 常见问题 **Q: 训练时显存不足怎么办?** A: 减小batch_size,例如改为32或16 **Q: 没有GPU可以训练吗?** A: 可以,但会很慢(10-15小时),建议使用Google Colab免费GPU **Q: 实时识别检测不到人脸?** A: 确保光线充足,人脸正对摄像头,距离适中 **Q: 准确率低于预期怎么办?** A: - 增加训练 epochs - 调整学习率 - 增加数据增强 - 检查数据集是否正确加载 ## 作者 Jolyne ## 许可证 MIT License