使用深度學習方法實作面部表情包識别
1、動機
人類面部表情豐富,但可以總結歸納為 7 類基本表情: happy, sad, surprise, fear, anger, disgust, and neutral。面部表情是通過面部肌肉活動表達出來,有些比較微妙且複雜,包含了大量内心活動資訊。通過面部表情識别,我們能簡單而低成本地度量出觀衆/使用者對内容和服務的态度。例如,零售商使用這些度量評估客戶的滿意度。健康醫療提供商能在治療的過程根據病人的表情狀态來提高服務。娛樂廠商能夠監控觀衆的喜歡來持續的生産優質的内容。
“2016 is the year when machines learn to grasp human emotions” --Andrew Moore, the dean of computer science at Carnegie Mellon.
訓練過的人類很容易讀懂其他人的情緒。事實上,隻有 14 個月大的嬰兒就可以差別出 happy 和 sad 的差別。但是計算機能夠比人類在識别情緒上做的更好嗎?為了找到答案,我們設計一個深度神經網絡使得機器可以讀懂人類情緒。換句話說,給機器以“眼”識别面部表情。
2、語料資料
訓練模型的資料集使用的是 Kaggle 面部識别挑戰賽的資料集(2013 年)。它由 35887 張面部圖檔組成,48x48像素灰階圖檔,标注為 7 類基本表情: happy, sad, surprise, fear, anger, disgust, and neutral。

圖 1 An overview of FER2013
當作者分析語料資料集時,發現“disgust”分類相對于其它分類不均衡(隻有113 張樣本)。作者将兩類相似的情感(disgust 和 anger)合并起來。為了防止資料傾斜,作者建構一個資料生成器 fer2013datagen.py [1],該生成器很容易分割訓練集和保留資料集。本例使用 28709 張面部圖檔作為訓練集,餘下的圖檔作為測試集和驗證集(每個資料集 3589 張)。這樣我們獲得了 6 類均衡的資料集,見圖2,包含 happy, sad, surprise, fear, anger, and neutral。
圖 2. Training and validation data distribution.
3、算法模型
圖3. Mr. Bean, the model for the model.
深度學習在計算機視覺上是非常流行的技術。本文選擇卷積神經網絡(CNN)層作為建構基礎建立模型架構。CNN 是有名的模仿人腦工作的模型。本文使用憨豆先生的圖檔作為示例來解釋如何将圖像指派給卷積神經網絡模型。
典型的卷積神經網絡包涵輸入層,卷積層,稠密層(比如,全聯接層)和輸出層(見圖4)。這些層按序組合,在 Keras [2] 中,使用 Sequential() 函數建立模型,再把其它層加入進來。
圖 4. Facial Emotion Recognition CNN Architecture (modification from Eindhoven University of Technology-PARsE).
3.1 輸入層
輸入層需要預處理,輸入固定次元的資料。是以圖檔需先預處理再傳入輸入層。作者使用 OpenCV(計算機視覺庫)做圖像面部識别。OpenCV 的 haar-cascade_frontalface_default.xml 檔案包含預訓練的過濾器,使用 Adaboost 算法能快速找到面部并裁剪。
使用 cv2.cvtColor 函數将裁剪面部圖檔轉化為灰階圖,并使用 cv2.resize 改變圖檔大小為 48x48 像素。處理完的面部圖檔,相比于原始的(3,48,48)三色 RGB 格式“瘦身”不少。同時也確定傳入輸入層的圖檔是(1,48,48)的 numpy 數組。
3.2 卷積層
numpy 數組傳入 Convolution2D 層,指定過濾層的數量作為超參數。過濾層(比如,核函數)是随機生成權重。每個過濾層,(3,3)的感受野,采用權值共享與原圖像卷積生成 feature map。
卷積層生成的 feature map 代表像素值的強度。例如,圖5,通過過濾層1 和原始圖像卷積生成一個 feature map,其它過濾層緊接着進行卷積操作生成一系列 feature map。
圖 5. Convolution and 1st max-pooling used in the network
池化(Pooling)是一種降低次元的技術,常用于一個或者多個卷積層之後。池化操作是建構 CNN 的重要步驟,因為增加的多個卷積層會極大的影響計算時間。本文使用流行的池化方法 MaxPooling2D,其使用(2,2)視窗作用于 feature map 求的最大像素值。池化後圖像降低 4 個次元。
3.3 稠密層
稠密層(比如,全聯接層)是模仿人腦傳輸神經元的方式。它輸入大量輸入特征和變換特征,通過聯接層與訓練權重相連。
圖 6. Neural network during training: Forward propagation (left) to Backward propagation (right).
模型訓練時權重前向傳播,而誤差是反向傳播。反向傳播起始與預測值和實際值的內插補點,計算所需的權重調整大小反向傳回到每層。采用超參數調優手段(比如,學習率和網絡密度)控制訓練速度和架構的複雜度。随着灌入更多的訓練資料,神經網絡能夠使得誤差最小化。
一般,神經網絡層/節點數越多,越能捕捉到足夠的信号。但是,也會造成算法模型訓練過拟合。應用 dropout 可以防止訓練模型過拟合。Dropout 随機選擇部分節點(通常,占總節點數的百分比不超過 50%),并将其權重置為 0。該方法能有效的控制模型對噪聲對敏感度,同時也保留架構的複雜度。
3.4 輸出層
本文的輸出層使用 softmax 激勵函數代替 sigmoid 函數,将輸出每類表情的機率。
是以,本文的算法模型能顯示出人臉表情組成的詳細組成機率。随後會發現沒必要将人類表情表示為單個表情。本文采用的是混合表情來精确表示特定情感
注意,沒有特定的公式能建立一個神經網絡保證對各種場景都有效。不同的問題需要不同的模型架構,産生期待的驗證準确度。這也是為什麼說神經網絡是個“黒盒算法”。但是也不要太氣餒,模型訓練的時間會讓你找到最佳模型,獲得最大價值。
3.5 小結
剛開始建立了一個簡單的 CNN 深度學習模型,包括一個輸入層,三個卷積層和一個輸出層。事實證明,簡單的算法模型效果比較差。準确度 0.1500 意味着僅僅是随機猜測的結果(1/6)。簡單的網絡結構導緻不能有效的判别面部表情,那隻能說明要“深挖”。。。
下面稍微修改下三部分的組合,增加模型的複雜度:
- 卷積層的數量和配置
- 稠密層的數量和配置
- 稠密層的 dropout 占比
使用 AWS 的 GPU 計算(g2.2xlarge)訓練和評估組合的算法模型。這次極大的減少了訓練時間和模型調優的效率。最後的網絡模型是九層,每三層卷積層接着一個 max-pooling 層,見圖 7。
圖 7. Final model CNN architecture.
4、模型驗證
4.1 結果
最後的 CNN 模型交叉驗證準确度是 58%,其具有積極意義。因為人類面部表情經常由多個基本表情組合,僅僅用單一表情是很難描述。本例中,當訓練模型預測不準确時,正确的标簽一般是第二相似的表情,見圖 8(淺藍色标簽)。
圖 8. Prediction of 24 example faces randomly selected from test set.
4.2 分析
圖 9. Confusion matrix for true and prediction emotion counts.
仔細看下每個表情的預測結果。圖 9 是測試集的模型預測的混淆矩陣。矩陣給出表情預測的數量和多分類模型的效果展示:
- 該模型很好的鑒别出正表情(happy 和 surprised),預測準确度高。大約 7000 張訓練集中,happy 表情的準确度達到 76.7%。surprised 表情預測準确度為 69.3%。
- 平均意義上講,本例的神經網絡模型對負表情的預測效果較差。sad 表情隻有 39.7% 的準确度,并且該網絡模型頻繁的誤判别 angry、fear 和 neutral 表情。另外,當預測 sad 表情和 neutral 表情時經常搞混,可能是因為這兩個表情很少出現。
- 誤分類預測小于 3 的頻率
圖 10. Correct predictions on 2nd and 3rd highest probable emotion.
4.3 計算機視覺
随着池化層數量的增加,下遊神經網絡管道的 feature map 越來越抽象。圖 11 和圖 12 可視化第二次和第三次 max-pooling 池化層後的 feature map。
分析和可視化卷積神經網絡内層輸出的代碼見 [3]
圖 11. 第二個 max-pooling 池化層後的 CNN (64-filter) feature maps
圖 12. 第三個 max-pooling 池化層後的 CNN (128-filter) feature maps
關于作者
參考
- "Dataset: Facial Emotion Recognition (FER2013)" ICML 2013 Workshop in Challenges in Representation Learning, June 21 in Atlanta, GA.
- "Andrej Karpathy's Convolutional Neural Networks (CNNs / ConvNets)" Convolutional Neural Networks for Visual Recognition (CS231n), Stanford University.
- Srivastava et al., 2014. "Dropout: A Simple Way to Prevent Neural Networks from Overfitting", Journal of Machine Learning Research, 15:1929-1958.
- Duncan, D., Shine, G., English, C., 2016. "Report: Facial Emotion Recognition in Real-time" Convolutional Neural Networks for Visual Recognition (CS231n), Stanford University.
相關連結
- 創業過 5 家大資料公司,Kaggle 競賽冠軍:網際網路深度學習誤區—花大力氣在那些影響力很小的事情上