廣播說明:
進入深度學習時代,如下的方法已經失去可比性,且我們的代碼實現地很粗糙,如果堅持要用,推薦如下代碼
https://github.com/wanglin193/SupervisedDescentMethod (看起來作者對sdm實現的不錯)
另外一篇基于深度學習的基于回歸的方法,也是使用的基于SDM的相同的思路,但是全部深度學習化,
更加魯棒。 見:《Stacked Hourglass Network for Robust Facial Landmark Localisation》
本方法是當前人臉對齊最流行的算法,速度很快,很穩定。下面我將介紹一下這篇文章的整體思路和相關細節。
在介紹之前,先給出幾個有用的鏈接:
1.)
本論文作者主頁,形象地介紹了SDM的特點:
http://xiong828.github.io/sdm.html
2. )
superviseddescent C++11版本的實現:
http://patrikhuber.github.io/superviseddescent/
下面開始介紹:
人臉對齊就是要找人臉的特征點。如圖
。
我們要找到眼睛、鼻子、嘴巴等特征點。那么如何去做呢?方法有很多。本文講述了使用SDM去求特征點的方法。假設我們有一個初始的特征點x0x0,希望通過迭代,逐步求出準確地特征點x?x?。這就是大致的思路。
SDM方法(Supervised Descent Method )
Derivation of SDM
給定一幅含有m個像素的圖像d∈Rm×1d∈Rm×1,d(x)∈Rp×1d(x)∈Rp×1用來索引圖像的p個特征點,x代表p個特征點。h(d(x))∈R128p×1h(d(x))∈R128p×1代表SIFT特征向量。在訓練階段,我們假設準確的p個特征點已知,設為x?x?。我們另外選取訓練集特征點的平均值x0x0作為初始值。如圖:
這樣,Face Alignment可以通過在ΔxΔx求解如下的最優化問題:
這里 Φ?=h(d(x?))Φ?=h(d(x?))代表手工標記的特征點的SIFT特征。在訓練階段, Φ?Φ?和 ΔxΔx已知。
對上面關于 ΔxΔx求導,令 f′(x0+Δx)=0f′(x0+Δx)=0,可得
,這里 Φ0=h(d(x0))Φ0=h(d(x0)).
令 R=?2H?1JTh,ΔΦ0=Φ0?Φ?R=?2H?1JhT,ΔΦ0=Φ0?Φ?,于是R可看作 Δx1Δx1到 ΔΦ0ΔΦ0的線性回歸系數。但是,我們知道在測試階段, Φ?Φ?是未知的,但是固定的。因此我們不再使用 Φ?Φ?做訓練,而是改用下面的公式:
使用訓練樣本,我們的方法可以學習 R0,b0R0,b0.
通常這種方法不可能一步迭代完成,需要進行多步,除非f是二次的。為了處理這個非二次的方程,SDM將產生一系列的下降方向 {Rk}{Rk}和偏差 {bk}{bk}.
即
Learning for SDM
假定給定一系列人臉{di}{di}與對應的特征點{xi?}{x?i}.對于每張圖片,從初始的特征點xi0x0i出發,R0,b0R0,b0可以通過求解最優化問題獲得:
這里 Δxi=xi??xi0,Φi0=h(di(xi0))Δxi=x?i?x0i,Φ0i=h(di(x0i)).
我們假定 xi0x0i可以從服從正態分布的人臉檢測框對齊采樣。于是上面的最優化問題化為:
以上方程是個線性的最優化問題,可以直接求解。
當第一步求解完畢后,代入方程式(1),可以求出 x1x1,進而又可以計算特征向量 Φik=h(di(xik))Φki=h(di(xki))和 Δxki?=xi??xikΔx?ki=x?i?xki.這樣 Rk,bkRk,bk可以通過一個新的線性回歸得到。
隨著k的增大,誤差逐漸減小,一般4到5次的迭代就可以達到比較好的效果。
Training for SDM
當我們計算出一系列的{Rk},{bk}{Rk},{bk},我們就可以通過迭代式(1)通過迭代求解特征點。一般初始的特征點可以選取訓練時的初始特征點。
后續我們還會給出SDM方法的Matlab代碼及相關說明,你就會看到比較清楚的步驟和效果了。