1. 程式人生 > >人臉識別之人臉對齊(九)--SDM演算法

人臉識別之人臉對齊(九)--SDM演算法

轉自:http://blog.csdn.net/huneng1991/article/details/51901912

http://blog.csdn.net/qq_14845119/article/details/53520847

略刪改。

 

SDM(Supervised Descent Method)是一種監督下降方法,屬於解決非線性最小化NLS(Non-linear Least Squares)問題的一種方法。

 

解決非線性最優化問題通常有2個難點,

(1)方程不可微,或者計算量太大

(2)Hessian矩陣太大,或者不是正定矩陣

基於這樣的難點,作者提出了自己的SDM方法,可以用於解決上述的問題,併成功的用次方法解決了人臉對齊中關鍵點的迴歸問題,取得了state-of-the-art的效果。

 

一個傳統和奏效的解決最小化二乘問題的方法就是牛頓下山法,正如,上面左圖所示,通過牛頓迭代,最終可以找到一個全域性最小值。這樣的迭代也肯定是效果最好的,但是在實際工程應用中,是不會有足夠的計算資源來將所有樣本一下都計算進去的,於是就有了上面右圖的方法,更新每一個daerta(x),每次都會找到一個最小值,然後不斷迭代,減少最小值之間的誤差距離,最終就會找到全域性最小值,類似深度學習裡的Mini batch SGD,就像吳恩達視訊中講的,雖然沒有理論的證明,區域性最小值就是全域性最小值,但是很多實際的經驗告訴我們,最後,只能收斂到一個最小值,也就是說,很多現實實際問題是隻有一個最小值的。

ps:還是很喜歡這個圖中的牛頓,高斯和拉格朗日。

 

SDM推導:

 

SDM的過程就是最小化上面函式的過程,其中,

d為m*1維,表示有m個畫素,

d(x)為p*1維,表示p個Landmarks,

h為非線性的特徵提取函式,提取的sift特徵h(d(x))為128p維

將上式子進行泰勒展開變為了下面的式子,

 

第一次初始化det(x1)按下式計算,

 

初始化時,第一次對於det(fai)的計算,可以看成det(fai)到R0的投影,因此,也可以近似的將R0看成是梯度方向。

 

由於將R0近似為梯度方向,所以det由上面的非線性問題轉化為下面式子的線性問題,

 

整個的訓練過程就是求一個最佳的R0和b0的過程,來保證det最小。最終也就將遞推公式由下面的第一個式子轉化為下面的第二個式子,也就不需要hession矩陣和Jacobian矩陣的計算了。實現了由2次問題到1次問題的轉化,但是2次問題肯定會收斂,1次的則很難保證,因此,作者引入了fai(k)這個一系列的特徵向量,而不是上式一樣,只有一個fai(0),從而來保證收斂,實驗過程中,迭代4-5次後就會收斂。

 

訓練過程中,採用L2-loss,如下式子,

 

假設x服從正態分佈,採用蒙特卡洛(Monte Carlo)方法取樣,轉化為求下式的最小值,

 

採用多個特徵向量後就轉化為下式,

 

實驗效果:

在人臉對齊中,一個很重要的效能指標就是姿態估計,包括,yaw(左右旋轉),roll(平面內旋轉),pitch(上下旋轉)

 

按作者論文中在Youtube上面的測試,姿態估計可以實現,yaw(-45到+45),roll(-90到+90),pitch(-30到+30),在i5-2400上達到了30fps的速度。

 

github上熱心網友的程式:

https://github.com/patrikhuber/superviseddescent/

https://github.com/RoboPai/sdm

 

reference:

[1]Szabó Z. Supervised Descent Method and its Applications toFace Alignment[J]. 2015.

[2]www.humansensing.cs.cmu.edu/intraface

 方法介紹

       SDM 人臉對齊的核心內容很簡單,就是特徵到偏移量的對映:

                                          Ix = R

I 是特徵,x是對映矩陣,R是偏移量。SDM人臉對齊方法訓練的目的就是得到對映矩陣x,步驟如下:

      1)歸一化樣本,使樣本的尺度統一;

      2)計算均值人臉;

      3)將均值人臉,作為估計人臉放在樣本上,使均值中心和原始人臉形狀中心對齊;

      4)計算基於每一個均值人臉的標記點的特徵,sift,surf或者hog,切記不要基於灰度值的相互特徵;

      5)將所有點的特徵串在一起,形成樣本特徵,所有樣本特徵形成矩陣I;

      6)計算估計人臉和真實人臉之間的偏移量,並形成矩陣R;

      7)解線性方程Ix=R, matlab中可用x = I \ R,lapack中可用函式dgelsd。

估計形狀加上預測偏移量就是結果,在實際情況中,共需要訓練多層,二層以後需要使用上一層對齊的結果作為估計形狀。

 

      實際在運用過程中可能會遇到各種問題,總結下來有以下幾點:

      1)速度太慢,尤其是使用sift,surf特徵;

      2)無效,基於灰度值類的特徵由於在標記點周圍的小視窗內,灰度值基本一致,變化不大,這也是人臉的一個顯著特徵;

      3)效果有待提高,hog特徵有效的解決上述問題,但是始終不理想,尤其是,水平大角度偏轉。

 

 結果介紹

       對齊效果見下面的圖片。訓練資料是手工標記的4000張圖片,經過隨機仿射變換擴充套件至60000(此方法提升效果有限)。一張人臉的對齊速度在3.5GHz CPU上單核是1.8ms,可多核提速,模型大小2.4M左右,併成功運用到人臉標記點追蹤上,追蹤可以解決大角度偏轉,大部分90度偏轉也是有效的