eigenvalue
:特徵值
特徵值算法基本是將人臉識別算法推向真正可用的第一種方法,
其主要工作步驟如下:
1)將訓練集的每一個人臉圖像都拉長一列,將他們組合在一起形成一個大矩陣A。假設每個人臉圖像是MxM大小,那麼拉成一列後每個人臉樣本的維度就是d=MxM大小了。假設有N個人臉圖像,那麼樣本矩陣A的維度就是dxN了。
2)將所有的N個人臉在對應維度上加起來,然後求個平均,就得到了一個“平均臉”。你把這個臉顯示出來的話,還挺帥的哦。
3)將N個圖像都減去那個平均臉圖像,得到差值圖像的數據矩陣Φ。
4)計算協方差矩陣C=ΦΦT。再對其進行特徵值分解。就可以得到想要的特徵向量(特徵臉)了。
5)將訓練集圖像和測試集的圖像都投影到這些特徵向量上了,再對測試集的每個圖像找到訓練集中的最近鄰或者k近鄰啥的,進行分類即可。
詳細步驟:
步驟一
:獲取包含M張人臉圖像的集合S。在我們的例子裏有25張人臉圖像,。每張圖像可以轉換成一個N維的向量(是的,沒錯,一個像素一個像素的排成一行就好了,至於是橫着還是豎着獲取原圖像的像素,隨你自己,只要前後統一就可以),然後把這M個向量放到一個集合S裏,如下式所示。
步驟二
:在獲取到人臉向量集合S後,計算得到平均圖像Ψ,也就是 每張圖片的相同位置加起來再去求個平均值
基本上得到了這樣一個人。。。。。 這就是傳說中的大衆臉?
步驟三
:計算每張圖像和平均圖像的差值Φ ,就是用S集合裏的每個元素減去步驟二中的平均值。
也就是說開始的那20個人, 每人都減去這個大衆臉。
步驟四
: 先看看這個 “” ,
如果訓練圖像的數量小於圖像的維數比如(M<N2),那麼起作用的特徵向量只有M-1個而不是N2個(因爲其他的特徵向量對應的特徵值爲0),所以求解特徵向量我們只需要求解一個NxN的矩陣。我們可以設該矩陣爲L,那麼L的第m行n列的元素可以表示爲:
一旦我們找到了L矩陣的M個特徵向量vl,那麼協方差矩陣的特徵向量ul就可以表示爲:
這些特徵向量如果還原成像素排列的話,其實還蠻像人臉的,所以稱之爲特徵臉(如下圖)。圖裏有二十五個特徵臉,數量上和訓練圖像相等只是巧合。有論文表明一般的應用40個特徵臉已經足夠了。論文Eigenface for recognition裏只用了7個特徵臉來表明實驗。
協方差矩陣的每一個特徵向量代表一個特徵臉, 把特徵向量還原爲 圖片可知:
步驟五
:
識別人臉。OK,終於到這步了,別繞暈啦,上面幾步是爲了對人臉進行降維找到表徵人臉的合適向量的。首先考慮一張新的人臉,我們可以用特徵臉對其進行標示:
其中k=1,2…M,對於第k個特徵臉uk,上式可以計算其對應的權重,M個權重可以構成一個向量:
perfect,這就是求得的特徵臉對人臉的表示了!
那如何對人臉進行識別呢,看下式:
其中Ω代表要判別的人臉,Ωk代表訓練集內的某個人臉,兩者都是通過特徵臉的權重來表示的。式子是對兩者求歐式距離,當距離小於閾值時說明要判別的臉和訓練集內的第k個臉是同一個人的。當遍歷所有訓練集都大於閾值時,根據距離值的大小又可分爲是新的人臉或者不是人臉的兩種情況。根據訓練集的不同,閾值設定並不是固定的。
回到自己的項目來說, 我們有41個人臉文件夾, 訓練的時候(train文件之中 pop出去的不是待檢測圖像請注意), 因此會得到41個特徵向量, 對應41個特徵臉,當真正進行人臉檢測的時候,通過捕捉視頻中的人臉 來和特徵臉進行比對,從而得到一個標籤值(也就是和哪個特徵臉最相似)我們根據這個標籤紙是不是41(我們待檢測的人臉)來判斷是不是目標。