1. 程式人生 > >8、人臉識別經典演算法一:特徵臉方法(Eigenface)

8、人臉識別經典演算法一:特徵臉方法(Eigenface)

這篇文章是擼主要介紹人臉識別經典方法的第一篇,後續會有其他方法更新。特徵臉方法基本是將人臉識別推向真正可用的第一種方法,瞭解一下還是很有必要的。特徵臉用到的理論基礎PCA在另一篇部落格裡: 。本文的參考資料附在最後了^_^

步驟一:獲取包含M張人臉影象的集合S。在我們的例子裡有25張人臉影象(雖然是25個不同人的人臉的影象,但是看著怎麼不像呢,難道我有臉盲症麼),如下圖所示哦。每張影象可以轉換成一個N維的向量(是的,沒錯,一個畫素一個畫素的排成一行就好了,至於是橫著還是豎著獲取原影象的畫素,隨你自己,只要前後統一就可以),然後把這M個向量放到一個集合S裡,如下式所示。



步驟二:在獲取到人臉向量集合S後,計算得到平均影象Ψ

 ,至於怎麼計算平均影象,公式在下面。就是把集合S裡面的向量遍歷一遍進行累加,然後取平均值。得到的這個Ψ其實還挺有意思的,Ψ其實也是一個N維向量,如果再把它還原回影象的形式的話,可以得到如下的“平均臉”,是的沒錯,還他媽的挺帥啊。那如果你想看一下某計算機學院男生平均下來都長得什麼樣子,用上面的方法就可以了。



步驟三:計算每張影象和平均影象的差值Φ ,就是用S集合裡的每個元素減去步驟二中的平均值。


步驟四:找到M個正交的單位向量un,這些單位向量其實是用來描述Φ (步驟三中的差值)分佈的。un 裡面的第k(k=1,2,3...M)個向量uk 是通過下式計算的,

當這個λk(原文裡取了個名字叫特徵值)取最小的值時,uk

  基本就確定了。補充一下,剛才也說了,這M個向量是相互正交而且是單位長度的,所以啦,uk  還要滿足下式:


上面的等式使得uk 為單位正交向量。計算上面的uk 其實就是計算如下協方差矩陣的特徵向量:


其中


對於一個NxN(比如100x100)維的影象來說,上述直接計算其特徵向量計算量實在是太大了(協方差矩陣可以達到10000x10000),所以有了如下的簡單計算。

步驟四另解:如果訓練影象的數量小於影象的維數比如(M<N^2),那麼起作用的特徵向量只有M-1個而不是N^2個(因為其他的特徵向量對應的特徵值為0),所以求解特徵向量我們只需要求解一個NxN的矩陣。這個矩陣就是步驟四中的AAT ,我們可以設該矩陣為L,那麼L的第m行n列的元素可以表示為:


一旦我們找到了L矩陣的M個特徵向量vl,那麼協方差矩陣的特徵向量ul就可以表示為:


這些特徵向量如果還原成畫素排列的話,其實還蠻像人臉的,所以稱之為特徵臉(如下圖)。圖裡有二十五個特徵臉,數量上和訓練影象相等只是巧合。有論文表明一般的應用40個特徵臉已經足夠了。論文Eigenface for recognition裡只用了7個特徵臉來表明實驗。


步驟五:識別人臉。OK,終於到這步了,別繞暈啦,上面幾步是為了對人臉進行降維找到表徵人臉的合適向量的。首先考慮一張新的人臉,我們可以用特徵臉對其進行標示:


其中k=1,2...M,對於第k個特徵臉uk,上式可以計算其對應的權重,M個權重可以構成一個向量:


perfect,這就是求得的特徵臉對人臉的表示了!

那如何對人臉進行識別呢,看下式:


其中Ω代表要判別的人臉,Ωk代表訓練集內的某個人臉,兩者都是通過特徵臉的權重來表示的。式子是對兩者求歐式距離,當距離小於閾值時說明要判別的臉和訓練集內的第k個臉是同一個人的。當遍歷所有訓練集都大於閾值時,根據距離值的大小又可分為是新的人臉或者不是人臉的兩種情況。根據訓練集的不同,閾值設定並不是固定的。

參考資料:

1、Eigenface for Recognition:http://www.cs.ucsb.edu/~mturk/Papers/jcn.pdf

2、特徵臉維基百科:http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E8%84%B8

3、Eigenface_tutorial:http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial.htm