1. 程式人生 > >Caffe與Lasagne使用——人臉關鍵點檢測

Caffe與Lasagne使用——人臉關鍵點檢測

Caffe與Lasagne 使用——人臉關鍵點檢測

一. Caffe求解迴歸問題


在使用Lasagne之前,我嘗試用Caffe做迴歸問題。畢竟Lasagne是基於Theano的,所以訓練速度上Caffe佔優。

1. 嘗試方法

清理掉標籤資料中的NaN值後,嘗試過下述方法:
(1) 輸出資料根據最大值和最小值歸一化到[0,1]區間內;
(2) 輸出資料屬於不同分佈,歸一化至標準正態分佈,均值升為0.5;
(3) 修改網路結構,微調model zoos中的網路。

2. 實驗結果

(1) 訓練發散,方法1可以解決;
(2) 方法1解決後的直接後果是Caffe訓練後收斂並且有一些損失;
(3) 方法2和3會使得網路不會發散,僅僅在一開始快速收斂,後面會在一定範圍內震盪。

3. 聯絡作者

聯絡Balakrishnan Prabhu先生 [1]後,他建議我:
(1) 先清理資料中的NaN,否則收斂時會產生很多問題; (2) 對層檔案使用xavier權重:
    weight_filler{
      type: "xavier"
    }

    bias_filler {
      type: "constant"
      value: 0.1
    }
(3) 學習率太快或太慢?調整它。

二. 相關工作


觀察[1]中給出的效果,Caffe迴歸時最後還是收斂到均值。所以Balakrishnan Prabhu先生選擇了快速收斂的那一時刻的模型。
達聞西在知乎中[3]給的例項是單變量回歸,但輸出變數為有序程度,可以解釋為這張圖片是有序圖片的可能性是多少,雖損失層修改為歐幾里德損失,和分類問題的區別在於把分類的one-hot格式變成了檢測為有序圖片的概率。
陳日偉[4]也給出了人臉關鍵點檢測的操作。卷積層變為LOCAL層,但影象解析度從96*96大幅下滑為39*39,定位精度會受到影響。效果見其部落格和程式碼。
Daniel Nouri[2]給出的結果最好,網路訓練採用Lasagne,同時公佈了原始碼
。由於Journey-Dream[5]已經詳細翻譯了原文,所以細節方面有問題可以再討論。

三. Step by Step


Daniel Nouri的網路模型類似Yann LeCun的經典CNN模型,大致提供了兩個CNN模型:第1個為整體網路模型,第2個為區域性網路模型。

1. 整體網路模型

網路輸出為影象中每個人臉關鍵點的所有座標。整體網路模型的輸入依次發生變化。這裡定義net1為單個隱含層的神經網路,net2為卷積神經網路(cnn),net3為資料增強(增加水平方向對稱的影象)後的cnn,net4為影象增強和學習率可調時的cnn,net5為影象增強,學習率可調和帶Dropout時的cnn。我的訓練和驗證曲線如下(橫座標為訓練次數,縱座標為驗證時畫素座標的均方根誤差(Root Mean Squared Error)):


整體網路模型的測試影象效果如下:

2. 區域性網路模型

人臉關鍵點被劃分為不同的區域,網路輸出為每個區域的關鍵點座標。可以用訓練好的整體網路模型的權重為初始值,微調區域性網路模型時修改整體網路模型的輸出。

3. 提交結果

Kaggle中挑戰賽的Leaderboard更新得很快,過一段時間後反正名次很快也會被刷下去,不如趁熱截圖 ~ ~||。



四. 參考連結


[1] corpocrat.com/2015/02/24/facial-keypoints-extraction-using-deep-learning-with-caffe/
[2] danielnouri.org/notes/2014/12/17/using-convolutional-neural-nets-to-detect-facial-keypoints-tutorial/
[3] www.zhihu.com/question/37351143
[4] blog.csdn.net/chenriwei2/article/details/49706563 [5] blog.csdn.net/tanhongguang1/article/details/46056663