表情識別實驗
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)
示例如下: