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)):
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN2gjMwIDM3EzMxQDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
整體網絡模型的測試圖像效果如下:
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