1. 程式人生 > >表情識別實驗

表情識別實驗

1.實驗資料

    實驗資料採用Kaggle的一個表情分類比賽資料(),該資料集包含三萬多張人臉圖片,每張圖片被標註為“0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral”(7類)的其中一種,分成了train、test和val。資料格式為csv,,參考“扎手的蒼耳”的部落格中指令碼,將資料轉換為圖片,圖片尺寸為48*48。編寫指令碼,根據類別重新命名影象,如下:

    筆者編寫了準備實驗資料指令碼,在筆者提供的資料夾data/fer2013/pre_data.sh。筆者用train檔案和val檔案進行訓練和驗證,用test檔案進行後續的測試精度。

    筆者修改的資料存放至百度網盤,連結:https://pan.baidu.com/s/1F8V6iWQfKdUELR4VihUUkA 密碼:8r63。

2.核心演算法

    經過在網上的各種閱讀資料,筆者大致將表情識別的方法分為兩大類,一類是通過提取面部特徵值,再利用傳統的分類方法,識別出面部表情;另一類則是利用深度網路學習實現端對端的識別。筆者在本次實驗中選擇第二類方式。

    在darknet框架下,參考《Densely Connected Convolutional Networks》的卷積網路結構,製作配置檔案(可實現end_to_end分類識別),進行分類訓練。網路結構如下:

    《Densely Connected Convolutional Networks》是CVPR2017最佳論文,其優點主要有三點:1)減輕了梯度消失問題;2)強化了特徵傳播,鼓勵了特徵再傳播;3)大幅度減少了引數數量。其Densely Connected原理如下圖:

    Densely Connected 在darknet框架中實現的程式碼是體現在route_layer.c。

    在本次實驗的網路配置中,筆者配置了3個dense block ,輸出6*6 feature image,詳細可看筆者提供的資料夾中fer.cfg

3.訓練

    筆者在darknet原始碼上編寫了程式碼,將每次迭代前的avg loss 儲存至txt,等訓練結束後,編寫指令碼,畫出avg loss的變化曲線圖。如下:

4.測試

    筆者編寫了測試demo供使用,demo在windows下開發得到。詳細參照使用說明。

    筆者畫出了不同迭代次數訓練下的分類精度accury(筆者每1000代測試一次)。accury=正確識別的表情圖片數量 / 總表情圖片數量。

論文《A Real-time Facial Expression Recognizer using Deep Neural Network.” International Conference on Ubiquitous Information Management and Communication ACM》在統計了fer2013各類別的識別率,見下圖。筆者也統計了,見下表。

angry

disgust

fear

happy

sad

surprise

neural

angry

58.45

disgust

70.96

fear

50.76

happy

83.5

sad

50

surprise

78.85

neural

66.93

    筆者提供了筆者測試過的weights資源在百度網盤,連結: ,密碼:oofc ;連結:https://pan.baidu.com/s/1lYg4hm5AXHu7u2yVTs5w9w 密碼:iewc。其他的weights可單獨向筆者索要,聯絡QQ:1192090271。

    網路卷積運算使用了openblas(可加速3-5倍),筆者編譯了Windows下x64的,存放至openblas資料夾下。

    darknet依賴了pthread,存放至pre_build資料夾下。

    demo使用了

程式碼說明:demo的程式碼分別存放至fer_module資料夾的include和src中。

demo使用說明:筆者生成exe單獨放置demo資料夾中,可直接點選fer_demo.exe執行,根據提示輸入測試圖片或批量測試圖片的list。(注:demo若缺少依賴,請跟我聯絡!qq:1192090271)

    示例如下: