當前位置:
首頁 > 科技 > 使用深度學習方法實現面部表情包識別

使用深度學習方法實現面部表情包識別

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

關於作者

Jostine Ho 是數據科學家和深度學習研究者。她感興趣於計算機視覺和自動化解決現實世界中具體問題。她畢業於德克薩斯大學奧斯汀分校,取得石油系統工程專業碩士學位。

參考

  1. "Dataset: Facial Emotion Recognition (FER2013)" ICML 2013 Workshop in Challenges in Representation Learning, June 21 in Atlanta, GA.

  2. "Andrej Karpathy"s Convolutional Neural Networks (CNNs / ConvNets)" Convolutional Neural Networks for Visual Recognition (CS231n), Stanford University.

  3. Srivastava et al., 2014. "Dropout: A Simple Way to Prevent Neural Networks from Overfitting", Journal of Machine Learning Research, 15:1929-1958.

  4. Duncan, D., Shine, G., English, C., 2016. "Report: Facial Emotion Recognition in Real-time" Convolutional Neural Networks for Visual Recognition (CS231n), Stanford University.

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高可用架構 的精彩文章:

適合創業團隊的必備工具棧
機器學習平台痛點與模型提升方法:基於Spark的機器學習平台在點融網風控應用介紹
基於Elasticsearch構建千億流量日誌搜索平台實戰
分布式系統中的時間和順序——關於Spanner中的Linearizability
美圖HTTPS優化探索與實踐

TAG:高可用架構 |

您可能感興趣

用於檢測未知惡意軟體的深度學習方法
改善學習方法,我想搞點事情
分析美白偏方一次見效果 掌握方法其實並不難
面部精華液的使用方法 這些你清楚嗎
霧燈的正確使用方法
新方法可實現高解析度納米材料磁性測量
這些深度「內向」的人想盡一切方法避免跟別人面對面交流
面部去皺的好方法
如何解決實體店各行各業的流量問題附具體方法
淺談表面功能微納結構及其加工方法
精華液的正確使用方法 這些步驟你學會了嗎
各種狀態餌料對應魚情的使用方法
背部按摩手法介紹 須學習正確方法
簡單粗暴又實用的學習方法
臉部浮腫怎麼辦 找對方法其實很簡單
壓縮面膜用法你知道嗎 方法對了效果會更好
染髮劑怎麼用效果更好 教你正確的使用方法
洗臉的正確方法手勢圖有哪些 如何護理好臉部肌膚
揭秘深度學習的基本理論方法與訓練過程
必知去除面部死皮方法 避免出現肌膚問題