NO IMAGE

前幾天討論班我講了基於PCA的人臉識別,當時我自己其實也只是知道這個演算法流程,然後基於該演算法利用c 實現了,效果還不錯。後來跟師兄一起討論的時候,才發現這個PCA還是有相當深刻的意義。

PCA的演算法:矩陣C=AAT,A的每一列是一張人臉(將一張人臉圖片用一個列向量表示,即對於128*128的圖片,將視為16384維的列向量),A的列數就是圖片的張數。演算法就是求矩陣C的特徵向量,每個向量稱之為特徵臉[1]。為了簡單,只取其中部分的特徵向量,這些特徵向量對應於某些特徵值,通常是前M個大的特徵值。這樣便得到了M個特徵向量。接下來就是將每張圖片在這M個特徵向量上做投影,得到一個M維的權重向量w=(w1,…wM),一個人可能有多張圖片,於是將對應於這個人的權重向量做一個平均作為這個人的權重向量。然後對於每個新來的人臉,先求得一個權重向量,然後與人臉庫中每個人的權重向量做比較,如果小於某個閾值,則認為他是人臉庫中的這個人;否則視為unknown。當然,文章中還給出了另外一個判斷一張影象是否是人臉的方法,這裡不再討論。對於計算的時候我們實際上求的是ATA,至於二者的關係,可以參考文章[1],因為與後面討論的關係不大,這裡不細說了。

有個上述簡介,我們就大概知道了PCA到底是怎麼做的了。刨根問底一下,C到底是什麼,C的特徵向量又到底是什麼,對應於特徵值大的特徵向量有有什麼意義。

1.C到底是什麼?我們先看一下C的(i,j)元素是什麼。很簡單,就是A的第i行與AT的第j列的乘積。那麼A的第i行又是什麼呢?就是每張圖片的第i個畫素構成的一個向量。則C的(i,j)元素就是每張圖片的第i個畫素構成的向量與每張圖片的第j個畫素構成的向量的乘積。回憶一下概率論中的協方差cov(x,y)=E((x-x)(y- y)),這裡x
是x的平均。如果我們把圖片的第i個畫素視為一個隨機變數Xi,那麼人臉庫中的每張人臉的第i個畫素的取值即為這個隨機變數的所有取值。根據注,A的第i行的每個值都已經減去了Xi的均值,因此C的(i,j)元素就是隨機變數Xi與Xj的協方差。到此,我們已經知道C是什麼了。

         2.C的特徵向量是什麼。我們知道對C求特徵向量是找到一個可逆矩陣Q,使得Q-1CQ是一個對角陣D,D的元素即為特徵值,Q中的每一列即為特徵向量,與特徵值所在的列一一對應。注意,因為C是實對稱陣,故必然可以對角化。由於C是對稱的,C的特徵向量是正交的,因此Q便是一個正交陣,故Q-1即為QT。先從簡單的角度來看,假設C已經是一個對角陣了,並且對角元素依次遞減。即隨機變數Xi與Xj(i!=j)時是不相關的,而Xi的方差則隨著i的增大而減小。也就是前幾個畫素是方差比較大的畫素,即在第一個畫素上,每張圖片的值變化最大,第二個畫素次之,依此類推。舉個例子,假設第一個畫素表示人臉的額頭上的某個點(也許你會問,第一個畫素不是圖片的最左上角的那個畫素嗎?為什麼會是額頭上的某個點,後面會說明為什麼可以這麼假設),而在這個點上,有些人有痣,有些人沒有,那麼這一點的方差就會比相鄰的額頭上的其他點大,因為其他點上,每個人的額頭都差不多,因此其畫素值也差不多,方差就小了。現在來考慮QTAATQ=D,這裡依然假設D中的元素依次遞減。對於QTA,QT的每一行是一個特徵向量,QT的第i行與A的每一列相乘得到QTA的每一行,從矩陣的角度也可以看作是用QT對A做一個變換。記住這裡的QTA可以看做前面討論的A,那麼變換的結果就是使得QTA前面的行對應的是方差大的畫素,而且這個變換會把方差最大的放到了第一行(因為D的降序排列),這裡也就解釋了為什麼前面那個例子可以認為第一個畫素是額頭上的某個點,因為做了變換。我們選擇了QT的前M行作為特徵向量,因為他們對應了前M個大的特徵值。這裡可以舉一個直觀但是不一定恰當的例子,人的頭髮部分對應的那些畫素,經過QT變換後回到某個畫素上,那麼這個畫素會是QTA中的哪個位置呢,我認為應該是QTA的列中靠下面的畫素,因為在頭髮這個畫素的地方每個人基本都是頭髮(這句話很彆扭,我是想說,對於比較正規的人臉庫,即每張人臉不會有太大的變化,某個人頭髮的對應的那幾個畫素對於其他人來說也都是頭髮,因此變換後這個畫素對於每個人都差不多,方差小,固然會在比較靠後的位置了)。QTA的每一列的前M個元素對應的就是每張人臉的權重向量w。因此每張人臉的權重向量的同一個分量可以看作是新的畫素,這些新的畫素對應著方差依次減小的畫素。對於一張新來的人臉,讓他在特徵向量上作投影得到權重向量,在這些方差大的畫素處,如果跟某個人的比較接近,則認為是這個人,這個也是合理的。至此,也許沒能講清楚特徵向量是什麼,但我想對應於特徵值大的特徵向量有什麼意義這一點也交代的差不多了。

         3.2中交代了說了,這裡想不到有什麼需要補充的了。

         理解了這幾個問題之後,PCA簡潔明瞭(這本來就是的)而又有深刻意義了。我突然發現原來看似簡單的理論其實水深的很,o(︶︿︶)o !我看文章實在是不夠認真,如果沒有師兄提問,估計我也不會去想這個問題。再次感謝WF師兄。

 

[1]Eigenfaces for Recognition. Matthew Turk,Alex Pentland 1991

注:A的每一列是一張人臉,這裡的人臉是每張人臉減去了所有人臉的平均後的人臉