人臉識別經典算法三:Fisherface(LDA)


Fisherface是由Ronald Fisher發明的,想必這就是Fisherface名字由來。Fisherface所基於的LDA(Linear Discriminant Analysis,線性判別分析)理論和特征臉里用到的PCA有相似之處,都是對原有數據進行整體降維映射到低維空間的方法,LDA和PCA都是從數據整體入手而不同於LBP提取局部紋理特征。如果閱讀本文有難度,可以考慮自學斯坦福公開課機器學習或者補充線代等數學知識。

同時作者要感謝cnblogs上的大牛JerryLead,本篇博文基本摘自他的線性判別分析(Linear Discriminant Analysis)[1]。

 

1、數據集是二類情況

通常情況下,待匹配人臉要和人臉庫內的多張人臉匹配,所以這是一個多分類的情況。出於簡單考慮,可以先介紹二類的情況然后拓展到多類。假設有二維平面上的兩個點集x(x是包含橫縱坐標的二維向量),它們的分布如下圖(1)(分別以藍點和紅點表示數據):

原有數據是散布在平面上的二維數據,如果想用一維的量(比如到圓點的距離)來合理的表示而且區分開這些數據,該怎么辦呢?一種有效的方法是找到一個合適的向量w(和數據相同維數),將數據投影到w上(會得到一個標量,直觀的理解就是投影點到坐標原點的距離),根據投影點來表示和區分原有數據。以數學公式給出投影點到到原點的距離:​y=wTx。圖(1)給出了兩種w方案,w以從原點出發的直線來表示,直線上的點是原數據的投影點。直觀判斷右側的w更好些,其上的投影點能夠合理的區分原有的兩個數據集。但是計算機不知道這些,所以必須要有確定的方法來計算這個w。

首先計算每類數據的均值(中心點):

這里的i是數據的分類個數,Ni代表某個分類下的數據點數,比如u1代表紅點的中心,u2代表藍點的中心。

數據點投影到w上的中心為:

如何判斷向量w最佳呢,可以從兩方面考慮:1、不同的分類得到的投影點要盡量分開;2、同一個分類投影后得到的點要盡量聚合。從這兩方面考慮,可以定義如下公式:

J(w)代表不同分類投影中心的距離,它的值越大越好。

上式稱之為散列值(scatter matrixs),代表同一個分類投影后的散列值,也就是投影點的聚合度,它的值越小代表投影點越聚合。

結合兩個公式,第一個公式做分子另一個做分母:

上式是w的函數,值越大w降維性能越好,所以下面的問題就是求解使上式取最大值的w。

把散列函數展開:

可以發現除w和w^T外,剩余部分可以定義為:

其實這就是原數據的散列矩陣了,對不對。對於固定的數據集來說,它的散列矩陣也是確定的。

另外定義:

Sw稱為Within-class scatter matrix。

回到並用上面的兩個定義做替換,得到:

 

展開J(w)的分子並定義SB,SB稱為Between-class scatter。

這樣就得到了J(w)的最終表示:

上式求極大值可以利用拉格朗日乘數法,不過需要限定一下分母的值,否則分子分母都變,怎么確定最好的w呢。可以令,利用拉格朗日乘數法得到:

其中w是矩陣,所以求導時可以把當做。(這點我也不懂)

上式兩邊同乘以可以得到:

可以發現w其實就是矩陣的特征向量了對不對。

通過上式求解w還是有些困難的,而且w會有多個解,考慮下式:

將其帶入下式:

其中λw是以w為變量的數值,因為(u1-u2)^T和w是相同維數的,前者是行向量后者列向量。繼續帶入以前的公式:

由於w擴大縮小任何倍不影響結果,所以可以約去兩遍的未知常數λ和λw(存疑):

到這里,w就能夠比較簡單的求解了。

 

2、數據集是多類的情況

這部分是本博文的核心。假設有C個人的人臉圖像,每個人可以有多張圖像,所以按人來分,可以將圖像分為C類,這節就是要解決如何判別這C個類的問題。判別之前需要先處理下圖像,將每張圖像按照逐行逐列的形式獲取像素組成一個向量,和第一節類似設該向量為x,設向量維數為n,設x為列向量(n行1列)。

和第一節簡單的二維數據分類不同,這里的n有可能成千上萬,比如100x100的圖像得到的向量為10000維,所以第一節里將x投影到一個向量的方法可能不適用了,比如下圖:

圖(2)

平面內找不到一個合適的向量,能夠將所有的數據投影到這個向量而且不同類間合理的分開。所以我們需要增加投影向量w的個數(當然每個向量維數和數據是相同的,不然怎么投影呢),設w為:

w1、w2等是n維的列向量,所以w是個n行k列的矩陣,這里的k其實可以按照需要隨意選取,只要能合理表征原數據就好。x在w上的投影可以表示為:

所以這里的y是k維的列向量。

像上一節一樣,我們將從投影后的類間散列度和類內散列度來考慮最優的w,考慮圖(2)中二維數據分為三個類別的情況。與第一節類似,μi依然代表類別i的中心,而Sw定義如下:

其中:

代表類別i的類內散列度,它是一個nxn的矩陣。

所有x的中心μ定義為:

類間散列度定義和上一節有較大不同:

代表的是每個類別到μ距離的加和,注意Ni代表類別i內x的個數,也就是某個人的人臉圖像個數。

上面的討論都是投影之間的各種數據,而J(w)的計算實際是依靠投影之后數據分布的,所以有:

分別代表投影后的類別i的中心,所有數據的中心,類內散列矩陣,類間散列矩陣。與上節類似J(w)可以定義為:

回想我們上節的公式J(w),分子是兩類中心距,分母是每個類自己的散列度。現在投影方向是多維了(好幾條直線),分子需要做一些改變,我們不是求兩兩樣本中心距之和(這個對描述類別間的分散程度沒有用),而是求每類中心相對於全樣本中心的散列度之和。得到:

最后化為:

還是求解矩陣的特征向量,然后根據需求取前k個特征值最大的特征向量。

另外還需注意:

由於SB中的(μi-μ)秩為1,所以SB的至多為C(矩陣的秩小於等於各個相加矩陣的和)。又因為知道了前C-1個μi后,最后一個μc可以用前面的μi來線性表示,因此SB的秩至多為C-1,所以矩陣的特征向量個數至多為C-1。因為C是數據集的類別,所以假設有N個人的照片,那么至多可以取到N-1個特征向量來表征原數據。(存疑)

如果你讀過前面的一篇文章PCA理論分析,會知道PCA里求得的特征向量都是正交的,但是這里的並不是對稱的,所以求得的K個特征向量不一定正交,這是LDA和PCA最大的不同。

如前所述,如果在一個人臉集合上求得k個特征向量,還原為人臉圖像的話就像下面這樣:

 

得到了k個特征向量,如何匹配某人臉和數據庫內人臉是否相似呢,方法是將這個人臉在k個特征向量上做投影,得到k維的列向量或者行向量,然后和已有的投影求得歐式距離,根據閾值來判斷是否匹配。具體的方法在人臉識別經典算法一:特征臉方法(Eigenface)里有,可前往查看。需要說明的是,LDA和PCA兩種方法對光照都是比較敏感的,如果你用光照均勻的圖像作為依據去判別非均勻的,那基本就慘了。

 

參考文獻:

[1]Jerry Lead 線性判別分析(Linear Discriminant Analysis)(一)

[2]http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html

轉載 http://blog.csdn.net/smartempire/article/details/23377385


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM