人臉表情識別項目是一個結合了計算機視覺和深度學習技術的高級應用,主要用于分析和理解人類面部表情所傳達的情感狀態。這樣的系統可以用于多種場景,比如情緒分析、用戶交互、市場調研、醫療診斷以及人機接口等領域。
一個典型的人臉表情識別項目可以分為以下幾個步驟:
-
數據收集: 首先需要一個包含各種表情的大型數據集。這些數據集通常包含成千上萬張標注了不同表情類別的面部圖像。一些常用的公開數據集有FER2013、JAFFE和CK+等。
-
數據預處理: 對收集到的數據進行清洗、標準化和增強。這可能包括調整圖像大小、灰度化、歸一化像素值、數據擴增等步驟。
-
人臉檢測: 在實時視頻流或靜態圖像中檢測出人臉的位置。這通常使用如SSD(Single Shot MultiBox Detector)、MTCNN(Multi-task Cascaded Convolutional Networks)或其他人臉檢測算法來完成。
-
特征提取: 從檢測到的人臉區域中提取有助于表情識別的特征。早期的方法可能使用手工設計的特征,如LBP(Local Binary Patterns)或HOG(Histogram of Oriented Gradients),但現代方法更傾向于使用深度學習模型直接從原始圖像中學習特征。
-
模型訓練: 使用深度學習框架(如TensorFlow或PyTorch)訓練一個神經網絡模型。模型架構可能包括卷積神經網絡(CNNs),如VGG、ResNet或MobileNet等。訓練過程中,模型會學習到如何將輸入的面部圖像映射到特定的表情類別。
-
模型評估: 在獨立的測試集上評估模型的性能,確保它能夠準確地識別未見過的面部表情。
-
部署和優化: 將訓練好的模型部署到實際應用中,可能是在移動設備、服務器或嵌入式系統上。此外,可能還需要進行性能優化,以確保實時性或低功耗需求。
-
UI/UX設計: 如果項目包含用戶界面,則需要設計直觀的UI來展示識別結果,使用戶能夠輕松理解和使用系統。
-
持續監控和更新: 部署后,系統應持續監測其性能,必要時進行重新訓練或參數調優,以適應新的數據或環境變化。
以上步驟構成了一個完整的人臉表情識別項目的生命周期,從概念驗證到產品化,每一階段都需要細致的技術考慮和工程實踐。
本項目簡介:
簡介
使用卷積神經網絡構建整個系統,在嘗試了Gabor、LBP等傳統人臉特征提取方式基礎上,深度模型效果顯著。在FER2013、JAFFE和CK+三個表情識別數據集上進行模型評估。
環境部署
基于Python3和Keras2(TensorFlow后端),具體依賴安裝如下(推薦使用conda虛擬環境)。
git clone https://github.com/luanshiyinyang/FacialExpressionRecognition.git
cd FacialExpressionRecognition
conda create -n FER python=3.6 -y
conda activate FER
conda install cudatoolkit=10.1 -y
conda install cudnn=7.6.5 -y
pip install -r requirements.txt
數據準備
數據集和預訓練模型均已經上傳到百度網盤。下載后將model.zip
移動到根目錄下的models
文件夾下并解壓得到一個*.h5
的模型參數文件,將data.zip
移動到根目錄下的dataset
文件夾下并解壓得到包含多個數據集壓縮文件,均解壓即可得到包含圖像的數據集。
項目說明
傳統方法
- 數據預處理
- 圖片降噪
- 人臉檢測(HAAR分類器檢測(opencv))
- 特征工程
- 人臉特征提取
- LBP
- Gabor
- 人臉特征提取
- 分類器
- SVM
深度方法
- 人臉檢測
- HAAR分類器
- MTCNN(效果更好)
- 卷積神經網絡
- 用于特征提取+分類
網絡設計
使用經典的卷積神經網絡,模型的構建主要參考2018年CVPR幾篇論文以及谷歌的Going Deeper設計如下網絡結構,輸入層后加入(1,1)卷積層增加非線性表示且模型層次較淺,參數較少(大量參數集中在全連接層)。
模型訓練
主要在FER2013、JAFFE、CK+上進行訓練,JAFFE給出的是半身圖因此做了人臉檢測。最后在FER2013上Pub Test和Pri Test均達到67%左右準確率(該數據集爬蟲采集存在標簽錯誤、水印、動畫圖片等問題),JAFFE和CK+5折交叉驗證均達到99%左右準確率(這兩個數據集為實驗室采集,較為準確標準)。
執行下面的命令將在指定的數據集(fer2013或jaffe或ck+)上按照指定的batch_size訓練指定的輪次。訓練會生成對應的可視化訓練過程,下圖為在三個數據集上訓練過程的共同繪圖。
python src/train.py --dataset fer2013 --epochs 300 --batch_size 32
模型應用
與傳統方法相比,卷積神經網絡表現更好,使用該模型構建識別系統,提供GUI界面和攝像頭實時檢測(攝像必須保證補光足夠)。預測時對一張圖片進行水平翻轉、偏轉15度、平移等增廣得到多個概率分布,將這些概率分布加權求和得到最后的概率分布,此時概率最大的作為標簽(也就是使用了推理數據增強)。
GUI界面
注意,GUI界面預測只顯示最可能是人臉的那個臉表情,但是對所有檢測到的人臉都會框定預測結果并在圖片上標記,標記后的圖片在output目錄下。
執行下面的命令即可打開GUI程序,該程序依賴PyQT設計,在一個測試圖片(來源于網絡)上進行測試效果如下圖。
python src/gui.py
?
上圖的GUI反饋的同時,會對圖片上每個人臉進行檢測并表情識別,處理后如下圖。
?
實時檢測
實時檢測基于Opencv進行設計,旨在用攝像頭對實時視頻流進行預測,同時考慮到有些人的反饋,當沒有攝像頭想通過視頻進行測試則修改命令行參數即可。
使用下面的命令會打開攝像頭進行實時檢測(ESC鍵退出),若要指定視頻進行進行檢測,則使用下面的第二個命令。
python src/recognition_camera.py
?
python src/recognition_camera.py --source 1 --video_path 視頻絕對路徑或者相對于該項目的根目錄的相對路徑
下圖是動態演示的在某個視頻的識別結果。?