【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)
人臉驗證算法Joint Bayesian詳解及實現(Python版)
Tags: JointBayesian DeepLearning Python
本博客僅為作者記錄筆記之用,不免有很多細節不對之處。
還望各位看官能夠見諒,歡迎批評指正。
博客雖水,然亦博主之苦勞也。
如對代碼有興趣的請移步我的?Github。?
如需轉載,請附上本文鏈接,不甚感激!?
http://blog.csdn.net/cyh_24/article/details/49059475
Bayesian Face Revisited: A Joint Formulation
============================
研究人臉識別方向快一年多了,雖沒有什么大的成果,不過總歸還算有些許小收獲。?
在下不才,未能像師兄張雨石?那般洋洋灑灑寫下DeepID人臉識別算法之三代?之類的深度好文。只好另辟蹊徑,走走少有人走的路,哈哈!(注:本文乃大水文,大神請勿逗留)。
我們知道,人臉識別有兩個大方向:
本文要重點介紹的Joint Bayesian?就是用來實現第一個(face verification)功能的。本文主要是針對Bayesian Face Revisited: A Joint Formulation?這篇文章的筆記。這篇論文僅通過高維LBP跟Joint Bayesian這兩個方法結合,就把LFW?數據集上的人臉驗證準確率輕松刷到了92.4%. 香港中文大學團隊的DeepID2將七個聯合貝葉斯模型使用SVM進行融合,最終達到了99.15%的結果。
一個Naive的想法
如果這個任務交給你,你最開始會怎么想?如何判斷兩張圖片是否為同一個人?
- 提取這兩張圖片的特征,然后得出兩張圖片的差異? -
- 通過差異來判斷,差異為何種情況時為同一個人,否則為不同人?
我們假裝專業一點,用x1,x2?分別表示兩張圖片,Hi表示這兩張圖片為intra-personal(同一個人),用?He?表示extra-personal(不同人)。用?△?表示?x1-x2?(兩者差異)。
假裝我們能夠寫下如下公式(反正我肯定寫不出來):
這里S(△)就是關于差異△的函數,如果:
- S(△) >=Thresold: 為同一個人;
- S(△) < Thresold: 非同一個人;
如果你了解一點?MAP(Maximum a Posterior, 最大后驗假設),那么上面的復雜的式子就可以轉化成近似求一個對數似然比(結果差別不大,但是運算速度大幅提高,最重要的是式子簡單很多有沒有。。。):
問題轉換為如下,如果:
- 如果P(△|Hi)很大,P(△|He)很小,ratio值很大,則判斷為同一個人;
- 如果P(△|Hi)很小,P(△|He)很大,ratio值很小,則判斷為不同人;
- 但是,若兩者同時很小,或同時很大,這會造成一個分類錯誤,結果無法斷定。這種情況如下圖所示:
從上圖中可以看到,2-D的數據通過差分x-y映射到1-D上。O附近的點交錯在一起, 使得在O附近的Class-1 和Class-2 無法區分開來。這就是我們這個Naive想法的缺陷了。
A Naive Bayesian
如果上面的想法能夠再Naive一點,再理想化一點,我們假設(x1, x2)服從高斯分布,那么就有:
- P(x1, x2|Hi) = N(0, ∑I),
- p(x1, x2|He) = N(0, ∑E)
再用R來求驗證x1, x2的相似性。其中?∑I?和?∑E?分別是同一個人和不同人的協方差矩陣。?
這就是Naive Bayesian方法了,這樣得到的結果會比傳統的貝葉斯臉要好。
上面的這種方法是從統計數據中直接訓練得到協方差矩陣∑I,∑E。有兩個因素可能會限制效果:
A joint formulation
看到下面這張圖片,你有沒有什么靈感?提示:左圖為不同人的臉部特征分布情況,右圖為同一個人的臉部特征分布情況:
從上圖可以得出,一個人臉由兩部分組成:identity?和?intra-personal variation。?identity?用來區分不同人,intra-personal variation?是同一個人在不同姿態下的差異。我們用?μ?來表示identity,用?ε?表示intra-personal variation(包括:光線,姿態,表情等變化),那么人臉x就可以用如下公式定義了:?
上式中,這兩個潛在變量?μ?和?ε?分布服從兩個高斯分布:N(0, Sμ)?和?N(0, Sε)。簡要來說,上面的表達式包括附加的一些假設可以作為一個人臉的先驗知識。
Joint formulation with prior
有了上面的先驗知識,就可以得到一個均值為0的高斯聯合分布{x1,x2}。若?μ?和?ε?是相互獨立的,那么我們就可以得到兩張人臉特征的協方差如下:?
1. 在 Hi的假設前提下?
此時,μ1?和?μ2?是相同的,并且ε1?和?ε2?是獨立的。?
因此P(x1, x2|Hi)分布的協方差矩陣就可以按照如下計算:
2. 在 He的假設前提下?
此時,μ?和ε?都是獨立的。?
因此P(x1, x2|He)分布的協方差矩陣就可以按照如下計算:
有了上面的兩種情況下的聯合概率,相應的對數似然比?r(x1,x2) 就可以在簡單的代數變換之后得到(其實博主一點都不覺得簡單,但是我們還是要假裝很輕松的樣子。。。。):
注意:這式子(4)中,為了簡單處理,常數項被省略。在這個對數似然比矩陣中,還有三個有趣的特性,讀者有興趣的可以再讀一讀原文附件的一些材料:?
—-> 1. 矩陣 A 和 G 都是非負半正定矩陣?
—-> 2. 如果 A = G, 那么這個對數似然比就降為馬氏距離?
—-> 3. 特征在經過任何的滿秩的線性變化之后,這個對數似然比矩陣都是不變的
Model Learning
上面的一大堆可能你并沒有看懂推導過程的式子,主要在告訴我們一件事情:
如果兩個潛在變量?μ?(identity) 和?ε?(intra-personal variance) 分布服從兩個高斯分布:N(0, Sμ)?和?N(0, Sε), 那么,對數似然比r(x1,x2)就可以通過兩個協方差矩陣?Sμ?和?Sε?計算得到。
所以,現在的任務就是訓練模型來求這兩個未知的?Sμ?和?Sε?.
我們可以很簡單地利用經典的?LDA?(線性判別分析) 來求出這兩個類內跟類間的協方差矩陣,實際上,使用這個LDA方法,你還是能夠得到一個比較不錯的結果了。但是,為了得到更高精度的準確率,我們的模型采用的是一個類?EM?算法來求解。這里就按照EM算法的兩步走來介紹:
E-step (期望步驟)
假設每個人有m?張圖片,那么x=[x1;…x;m], 相應的潛在變量就是?h=[μ ;ε1;…;εm],h?與?x?的關系如下:?
總結一下,首先通過已知的協方差矩陣Sμ?和?Sε?求解對應的F和G,然后由F,G,去求解對應的?μ?和?ε?.
M-step (最大化步驟)
在這個步驟中,我們的目標是更新參數值Θ={Sμ, Sε}:
這里的?μ?和?ε?是E-step?階段的結果。?
不斷重復E-step 跟M-step過程,直到Sμ, Sε收斂。
Initialization (初始化)
在代碼實現中,μ?和?ε?是通過隨機的正定矩陣初始化得到。例如,你可以從隨機的一些數據中得到協方差矩陣當做初始值。
Verify(對數似然比的計算)
對數似然比ratio 的計算公式如下:
得到這個ratio之后,如果 ratio >= 閾值,則認為是同一個人;否則不是同一個人。
算法實現(Python版)
已經在網上看到有人實現了matlab版本的joint bayesian,不過因為我們實驗室一直是python的天下,所以簡單的照著matlab版本,用numpy實現了一把。
我把代碼都放到了github上,而且里面有完整的使用說明和實驗報告。
所以這里就不貼代碼了。這里就簡單貼一個算法的大致流程圖:
?
圖片引用自[網絡](http://blog.csdn.net/hqbupt/article/details/37758627)
對代碼有興趣的請移步我的?Github.?
代碼只是實驗用,寫的并不好,勉強能運行,歡迎拍磚!
參考文獻
[1]. D.Chen, X.Cao, L.Wang, F.Wen, and J.Sun. Bayesian face revisited: A joint formulation.In Proc. ECCV, 2012. [2]. http://blog.csdn.net/csyhhb/article/details/46300001 [3]. http://www.zhihu.com/question/28086678 [4]. http://blog.csdn.net/hqbupt/article/details/37758627 from: http://blog.csdn.net/cyh_24/article/details/49059475總結
以上是生活随笔為你收集整理的【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】Logistic Regre
- 下一篇: 2015 SegmentFault 黑客