opencv特徵臉方法(Eigenface)

eigenvalue :特徵值

特徵值算法基本是將人臉識別算法推向真正可用的第一種方法,

其主要工作步驟如下:

1)將訓練集的每一個人臉圖像都拉長一列,將他們組合在一起形成一個大矩陣A。假設每個人臉圖像是MxM大小,那麼拉成一列後每個人臉樣本的維度就是d=MxM大小了。假設有N個人臉圖像,那麼樣本矩陣A的維度就是dxN了。

2)將所有的N個人臉在對應維度上加起來,然後求個平均,就得到了一個“平均臉”。你把這個臉顯示出來的話,還挺帥的哦。

3)將N個圖像都減去那個平均臉圖像,得到差值圖像的數據矩陣Φ。

4)計算協方差矩陣C=ΦΦT。再對其進行特徵值分解。就可以得到想要的特徵向量(特徵臉)了。

5)將訓練集圖像和測試集的圖像都投影到這些特徵向量上了,再對測試集的每個圖像找到訓練集中的最近鄰或者k近鄰啥的,進行分類即可。

詳細步驟:

步驟一:獲取包含M張人臉圖像的集合S。在我們的例子裏有25張人臉圖像,。每張圖像可以轉換成一個N維的向量(是的,沒錯,一個像素一個像素的排成一行就好了,至於是橫着還是豎着獲取原圖像的像素,隨你自己,只要前後統一就可以),然後把這M個向量放到一個集合S裏,如下式所示。

img

img

步驟二:在獲取到人臉向量集合S後,計算得到平均圖像Ψ,也就是 每張圖片的相同位置加起來再去求個平均值

img

基本上得到了這樣一個人。。。。。 這就是傳說中的大衆臉?

img

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

img

也就是說開始的那20個人, 每人都減去這個大衆臉。

步驟四 : 先看看這個 “” ,

如果訓練圖像的數量小於圖像的維數比如(M<N2),那麼起作用的特徵向量只有M-1個而不是N2個(因爲其他的特徵向量對應的特徵值爲0),所以求解特徵向量我們只需要求解一個NxN的矩陣。我們可以設該矩陣爲L,那麼L的第m行n列的元素可以表示爲:

img

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

img

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

協方差矩陣的每一個特徵向量代表一個特徵臉, 把特徵向量還原爲 圖片可知:

img

步驟五

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

img

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

img

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

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

img

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

回到自己的項目來說, 我們有41個人臉文件夾, 訓練的時候(train文件之中 pop出去的不是待檢測圖像請注意), 因此會得到41個特徵向量, 對應41個特徵臉,當真正進行人臉檢測的時候,通過捕捉視頻中的人臉 來和特徵臉進行比對,從而得到一個標籤值(也就是和哪個特徵臉最相似)我們根據這個標籤紙是不是41(我們待檢測的人臉)來判斷是不是目標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章