淺談隨機森林在人臉對齊上的應用~

       在我之前的部落格中介紹過隨機森林,隨機森林在機器學習中的應用十分廣泛,它屬於非傳統的機器學習演算法,其他的諸如神經網路,MRF,Adaboost,乃至現在大名鼎鼎的深度學習,越來越取代了傳統機器學習演算法,如子空間學習,流程學習等的地位。果不其然,在眾多基於傳統機器學習的人臉對齊演算法中,去年CPVR2014也出現了一篇論文,名曰《Face Alignment At
3000fps via Local Binary Features》,正是利用了隨機森林對特定點進行定位,取得了與SDM等演算法同樣的效果,最關鍵的是,它快啊!!!所以本文專門說說LBF文獻中,隨機森林的作用。

(轉載請註明:http://blog.csdn.net/wsj998689aa/article/details/45204599,
作者:迷霧forest)

1. 隨機森林回顧

       隨機森林由N棵決策樹組成,每一棵決策樹都具有不同的初始訓練樣本,在訓練過程中,還需要一個屬性候選集,訓練樣本子集根據候選集合中的屬性,依據分裂依據進行進一步分類,這一步俗稱“分裂”,直至滿足人為設定的收斂條件。
       我個人認為,分裂的想法十分重要,它使得決策樹成功記憶住如何從頭開始,一步一步將樣本正確分類。於是在測試的過程中,測試樣本完全是按照這種記憶力將自己的類別確定下來。
       不得不說,這是一種傻瓜式的策略,只要訓練樣本足夠多,不斷的學習,肯定能把這玩意學會!那麼現在有個問題,我在特徵點定位的時候,怎麼能和隨機森林搭上關係呢?或者說,如何利用隨機森林建立模型解決人臉對齊問題?我覺得問題可以分解為如下幾個子問題。
在應用隨機森林做特徵點標記的時候
1、候選屬性集是什麼?
2、特徵是什麼?
3、分裂依據是什麼?
4、葉子節點記憶體放的是什麼?
5、測試過程是什麼樣?

《Face Alignment At 3000fps via Local Binary Features》一文給出了精彩的回答。

2. 隨機森林進行特徵點定位

     先大概說說LBF演算法的背景,LBF是中科大的幾位學者提出來的演算法,發表在CVPR2014上,這個會議大家都知道,裡面的文章都是很靠譜的。LBF雖然沒有提供原始碼但我們實現過,可以說效果與當前流行的其他演算法如ESR,SDM基本保持一致,速度雖然說打不到3000fps,但也有300FPS,可以說實用意義很強。其演算法思想是基於學習理論,將每個特徵點用一個標準隨機森林訓練,使得森林能夠記住各種姿態下的“特徵點走勢”,得到特徵點的稀疏編碼,再通過全域性優化得到最終的標定結果。本文主要說一說我對隨機森林這塊的理解。

    主要還是回答一下上面的幾個子問題。

    1. 隨機森林的重點是挑選屬性進行節點分裂,LBF將候選屬性集定義為“當前特徵點周圍圓形鄰域內的隨機撒點”,如下圖所示:

這樣做的目的很直白,就是通過比較各個隨機撒點(比如有500個)的資訊增益值,挑選最小的那一個作為分裂屬性,效果是使得初始的不準確特徵點一點一點的向真實位置靠近。與眾不同的地方在於,LBF將畫素位置作為候選屬性,這麼做很靈活。

    2. 在文中給出的特徵是“pixel-difference feature”,看過它的引用文獻,發現這個特徵十分的簡單,就是兩個畫素之間的灰度差,這恰好解釋了LBF快速的原因(SDM用的是sift特徵,大家想想吧!!),和其他人臉對齊演算法一樣,始終要利用紋理資訊。

    3. 分裂的依據就是資訊增益值,這裡舉個例子,比如隨機森林共有50棵樹,候選屬性個數為500,每棵樹的訓練樣本個數為1000,那麼在根節點上,我就要將這1000個樣本的當前特徵點與每個候選屬性進行計算,也就是得到了500 * 1000個pixel-difference feature,然後對每一組pixel-difference feature計算資訊增益值,也就是說得到了500個資訊增益值,然後挑選出最小的那個值所對應的候選屬性作為當前節點的分裂屬性,進一步,有了分裂屬性,與事先設定的閾值(??)進行比較,將1000個樣本進行分類,共分為兩類!至於論文中選擇的資訊增益手段,是“maximum
variance reduction”,這裡不多說,大家自己查查就知道了哈!

    4. 葉子節點中存放的本來是訓練樣本,但是為了之後的計算方便,要對訓練樣本與初始值做減法再做平均,於是存放的其實是偏移值。

    5. 訓練與測試過程的流程如下,測試樣本在每棵決策樹中只能抵達一個葉子節點,累加所有葉子節點中的偏移量,得到的就是最終的結果。LBF別出心裁,採用了一個稀疏編碼完成這一過程。

3. 一點想法

      特徵方面,LBF用的只是灰度差值作為特徵,這種特徵判別性很弱,很容易受到遮擋和噪聲的影響,多虧了隨機森林一級一級的訓練,以及足夠多的樣本可以防止演算法陷入過擬合才把這個特徵的弱勢掩蓋下去,如果我們在這個特徵基礎上再加上空間距離,演算法效能可能會更好,不信大家試一試看。
後記: 說點這段時間自己的感想,現在在人臉對齊這塊深度學習做的不錯,深度學習我個人愚見是“一點記憶,瘋狂學習”(隨機森林是“全憑記憶,從不學習”)。其實我對傳統的機器學習演算法更加情有獨鍾,漂亮的嚴謹的公式推理,複雜的理論背景,子空間學習啊,概率圖模型啊,各種優化演算法啊!!!這才是人類智慧的集中體現啊,可是不得不面對現實,現在的機器學習已經是深度學習為代表的傻瓜式學習演算法的天下嘍~ 歡迎大家來噴~~