天天看點

MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)

MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)

這一部分内容總共由下面四篇文章組成:

  • MobileNet 進化史: 從 V1 到 V3(V1篇)
  • MobileNet 進化史: 從 V1 到 V3(V2篇)
  • MobileNet 進化史: 從 V1 到 V3(V3篇)
  • MobileNet實戰:基于 MobileNet 的人臉表情分類

1. 前言

前面我們已經簡要介紹了 MobileNet 的版本演進,這一篇我們将利用 MobileNet 來完成一個簡單的人臉微表情分類項目。說的更具體一點這裡用嘴唇來區分不同的為表情,也就是根據嘴型來做分類———無表情,微笑,大笑和嘟嘴,這四類微表情。

如果說這個項目是在探讨如何進行表情分類,顯然是不合格的。這裡隻是舉一個實戰的例子,依附這個例子來說明是如何一步步思考的,是以也完全可以換成其他的任務。另外這裡用的是 mobilenet V1,主要是 V1 可以找到比較齊全的資料,比如訓練網絡,部署網絡,預訓練好的參數等。

本文的人臉微表情分類項目來源于 言有三 的 《深度學習之圖像識别》一書,在此基礎上進行了補充和完善。本文中的所有代碼都可以在 github 中擷取。

2. 資料集

人臉相關的開源資料集很多,關于表情識别的也有一些,比如 GENKI 等。如果沒有合适的也可以自己錄或者爬,這裡關于資料的搜集就不多說了。

下面我講一下圖檔的特征的提取,因為我們做的是基于嘴唇的微表情(也可以了解為就是嘴唇)的分類任務,是以我們需要從人臉圖檔中提取出嘴唇這個局部特征。這裡基于 opencv 來做這個任務,opencv 中至少有兩個方法可以做這個任務。

  • 用 haarcascade_smile 模型來檢查,但是這個效果不是太好
  • 用 Dlib 關鍵點檢查,找到嘴唇的标記點,用一個矩形畫出 bounding box, 最後将這個 bbox 放大 λ \lambda λ 倍(這裡用的 1.5 ),進行裁剪得到最後的樣本。

這裡采用第二種方法,完整的代碼可以參考 github。下圖中黃色是檢測到的嘴部的 ROI,綠色是最後放大 1.5 倍後的 ROI。

MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)

通過這種辦法,最後得到的 ROI 的圖檔大概都在 100x100 左右,四類表情,總共 15106 張圖檔。然後選取 10%(1510 張) 作為測試集。

另外 caffe 提供的圖像均值計算工具都是針對 lmdb 格式的資料的,如果我們直接采用 list 的形式輸入的話,就需要自己寫代碼計算了。shuffle 資料,分割訓練和測試集,以及計算圖檔均值的代碼都可以在上面的 github 中找到。

3. 模型設計

這裡主要是為了熟悉 MobileNet,是以模型選擇上沒有什麼好說的,就是 MobileNet。但是我們看一下 MobileNet 的網絡結構,從 V1 到 V3 都是輸入 224 ∗ 224 224*224 224∗224 的圖檔,最後得到 7 ∗ 7 7*7 7∗7 的 feature,也就是說 MobileNet 模型的 s t r i d e = 224 / 7 = 32 stride = 224/7 = 32 stride=224/7=32,而我們得到的圖檔大小在 100 ∗ 100 100*100 100∗100 左右,假設我們的圖檔大小為 96 ∗ 96 96*96 96∗96(因為96是32的倍數),那麼我們做後的 feature size 為 3 ∗ 3 3*3 3∗3,顯然這也太小了,而且我們這裡的分類也比較簡單,是以最後綜合考慮,隻借用 MobileNet conv5_5 及之前的結構,這樣最後得到的 feature size 為 6 ∗ 6 6*6 6∗6,與原網絡比較接近。當然直接從全局來修改模型也是可以的,但是顯然采取截取的方法更為簡單。

另外為了得到比較好的結果,我們可以采用已經在 ImageNet 上訓練好的權重來初始化我們的網絡,也就是所謂的遷移學習。其實這個背後就是把已經訓練好的權重 copy 到我們新的網絡上來,然後接着跑,而 copy 的原則就是根據 layer 的名字,是以在我們的網絡中從 data 層開始到 conv5_5 保持不變就可以了,但是從 c o n v 5 5 conv5_5 conv55​ 之後我們需要重新命名。

MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)

4. 資料增強

我們實際輸入模型的圖檔大小在上面已經确定了,就是 96 ∗ 96 96*96 96∗96,但是我們經常會采用圖檔裁剪的方式來對資料進行增強,借鑒很多做法是從256裁剪到224,這裡我們把所有的圖檔 resize 到 128 ∗ 128 128*128 128∗128,然後再裁剪到 96 ∗ 96 96*96 96∗96,最後輸入模型。另外可以用 caffe-augmentation 這個版本的 caffe,裡面有更多的增強設定。

5. 訓練

訓練的時候我們需要儲存好 log,友善後面可視化訓練結果。下面是我訓練後得到的 loss 和 acc 的資料所繪制的圖形,從圖中可以看到,訓練到 3000次疊代時就已經基本穩定了,是以對于分類任務,一般是建議訓練10個左右的 epoch 就可以了。

MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)
MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)MobileNet實戰:基于 MobileNet 的人臉微表情分類(Caffe)

6. 測試

前面我們已經劃分了訓練集和測試集,具體代碼可以參考github。

繼續閱讀