一個基於深度學習的人臉表情識別項目,使用卷積神經網絡(CNN)來識別七種基本情緒:憤怒、厭惡、恐懼、快樂、中性、悲傷和驚訝。
本項目包含兩個版本的CNN模型實現:
face_cnn_cpu.py- 針對CPU優化的版本,包含學習率調度器face_cnn_gpu.py- 針對GPU優化的版本,使用Adam優化器的decay參數
兩個版本都使用FER2013數據集進行訓練,並提供完整的模型評估和可視化功能。
- 七種情緒識別:憤怒、厭惡、恐懼、快樂、中性、悲傷、驚訝
- 深度CNN架構:包含卷積層、池化層、批量歸一化和Dropout
- 完整評估:提供準確率、混淆矩陣和分類報告
- 訓練可視化:自動生成訓練歷史圖表和混淆矩陣
- 模型保存:訓練完成後自動保存為H5格式
- Python 3.7+
- TensorFlow 2.6.0
- 足夠的內存來處理圖像數據
pip install -r requirements.txt主要依賴包括:
- tensorflow==2.6.0
- keras==2.6.0
- numpy==1.19.5
- matplotlib==3.4.3
- seaborn==0.11.2
- scikit-learn==0.24.2
確保你的數據集按照以下結構組織:
fer2013/
├── train/
│ ├── angry/
│ ├── disgust/
│ ├── fear/
│ ├── happy/
│ ├── neutral/
│ ├── sad/
│ └── surprise/
└── test/
├── angry/
├── disgust/
├── fear/
├── happy/
├── neutral/
├── sad/
└── surprise/
python face_cnn_cpu.py特點:
- 包含學習率調度器 (ReduceLROnPlateau)
- 當驗證損失停止改善時自動降低學習率
- 更穩定的訓練過程
- 適合長時間訓練
python face_cnn_gpu.py特點:
- 使用Adam優化器的decay參數
- 更快的訓練速度(需要GPU支持)
- 適合快速實驗和原型開發
輸入層: (48, 48, 1) 灰度圖像
├── 卷積層1: 32個3x3卷積核
├── 卷積層2: 64個3x3卷積核
├── 批量歸一化 + 最大池化 + Dropout(0.25)
├── 卷積層3: 128個3x3卷積核 (L2正則化)
├── 卷積層4: 256個3x3卷積核 (L2正則化)
├── 批量歸一化 + 最大池化 + Dropout(0.25)
├── 展平層
├── 全連接層: 1024個神經元 + Dropout(0.5)
└── 輸出層: 7個神經元 (softmax激活)
- 圖像大小: 48x48像素
- 批次大小: 64
- 訓練輪數: 60
- 學習率: 0.0001
- 優化器: Adam
- 水平翻轉
- 縮放範圍: 0.3
- 像素值歸一化: 1./255
運行完成後,程序會生成以下文件:
- fer2013_cnn_model.h5 - 訓練好的模型文件
- training_history.png - 訓練過程的準確率和損失曲線
- confusion_matrix.png - 混淆矩陣可視化
- 控制台輸出 - 包含測試準確率和詳細分類報告
程序會自動計算並顯示:
- 測試集準確率
- 每種情緒的精度、召回率和F1分數
- 混淆矩陣可視化
- 訓練和驗證的準確率/損失曲線
- 內存使用: 確保有足夠的RAM來處理圖像數據
- 訓練時間: 完整訓練可能需要數小時,取決於硬件配置
- GPU支持: GPU版本需要安裝CUDA和cuDNN
- 數據路徑: 確保數據集路徑正確設置
Q: 出現內存不足錯誤 A: 嘗試減小BATCH_SIZE或使用更小的圖像尺寸
Q: 訓練速度很慢 A: 檢查是否正確安裝了GPU版本的TensorFlow
Q: 找不到數據集 A: 確保fer2013文件夾在正確的位置,並檢查子文件夾結構
歡迎提交Issue和Pull Request來改進這個項目!
請查看LICENSE文件了解詳細的許可證信息。