人臉識別是乙個有監督學習過程,首先利用訓練集構造乙個人臉模型,然後將測試集與訓練集進行匹配,找到與之對應的訓練集頭像。最容易的方式是直接利用歐式距離計算測試集的每一幅影象與訓練集的每一幅影象的距離,然後選擇距離最近的影象作為識別的結果。這種直接計算距離的方式直觀,但是有乙個非常大的缺陷—計算量太大。如果每幅影象大小為100*100,訓練集大小1000,則識別測試集中的一幅影象就需要1000*100*100的計算量,當測試集很大時,識別速度非常緩慢。
解決上述問題的乙個途徑是對影象進行降維,通過只保留某些關鍵畫素可以使識別速度大大提公升。降維的乙個方法即是pca(主成分分析),在此我們介紹通過pca進行人臉識別的步驟。
讀取測試集目錄下指定個數的影象,然後將其儲存在乙個二維陣列中。如果影象個數為m,影象長寬為i、j,則我們建立乙個二維陣列a[m][i*j=n]用來儲存影象資料。陣列的每一行表示乙個影象的所有畫素資訊,每一列表示乙個隨機變數,也即不同影象同一位置的畫素資訊,降維也即用更少的列來代表影象。
將步驟一的每列減去該列的均值,這樣每列的資料均值為0。在利用matlab的函式princomp執行pca的過程中,princomp會首先將每一列減去該列均值,不用我們自己執行。
協方差矩陣表示不同隨機變數之間的相互關係,影象中也即求任意兩個畫素之間的關係。如果兩個隨機變數的協方差為正或為負,表明兩個變數之間具有相關性,如果為零表示兩個變數不相關。通過計算協方差矩陣,我們就可以獲得不同畫素之間的關係。針對人臉識別,計算的協方差矩陣大小為n*n,其中n表示影象的畫素點個數。
由於協方差矩陣是實對稱陣,所以可以求得其所有的特徵值和特徵向量,其共有n個特徵值和特徵向量。
所謂主成分即是具有最大特徵值的特徵向量,所以我們需要將特徵向量按照特徵值由大到小排序,然後根據精度要求選擇不同數量的特徵向量,例如我們選擇了前p個特徵向量,通常p遠小於n(在我們的人臉識別實驗中,為了達到95%的精度,p只有72,而n為120*140=17040)。
此步驟將原始的訓練集進行降維變換,原始的影象資料是m*n的矩陣,只包含主成分的特徵向量構成乙個n*p的矩陣(每一列都是乙個特徵向量)。將兩個矩陣相乘,我們即可獲得降維之後的影象矩陣m*p,這個矩陣遠小於原始的影象資料。
同步驟6相似,讀取所有的測試集影象,然後對其也進行降維操作。如果測試集有m幅影象,則降維後的矩陣為m*p。
該步驟為人臉識別的最後一步,用來對測試集進行識別,並計算識別準確率。該步驟有乙個限制,測試集中的頭像必須包含在訓練集中,否則得出的結果將沒有意義(這也就是**一開始要求訓練集大於測試集的目的)。識別的方法和最初的影象匹配方法類似:將測試集中的每一幅降維影象與降維的訓練集進行匹配,然後將其分類到距離最小的訓練集頭像中,如果兩個頭像表示乙個人,表示識別成功,否則表示識別失敗。與原始的匹配相比,由於對影象進行了降維,所以匹配速度大大提公升,在我們的實驗中速度提公升了200以上(120*142/72)。
pca的數學原理
基於PCA的人臉識別步驟
人臉識別是乙個有監督學習過程,首先利用訓練集構造乙個人臉模型,然後將測試集與訓練集進行匹配,找到與之對應的訓練集頭像。最容易的方式是直接利用歐式距離計算測試集的每一幅影象與訓練集的每一幅影象的距離,然後選擇距離最近的影象作為識別的結果。這種直接計算距離的方式直觀,但是有乙個非常大的缺陷 計算量太大。...
基於PCA的人臉識別步驟
人臉識別是乙個有監督學習過程,首先利用訓練集構造乙個人臉模型,然後將測試集與訓練集進行匹配,找到與之對應的訓練集頭像。最容易的方式是直接利用歐式距離計算測試集的每一幅影象與訓練集的每一幅影象的距離,然後選擇距離最近的影象作為識別的結果。這種直接計算距離的方式直觀,但是有乙個非常大的缺陷 計算量太大。...
基於opencv的人臉識別
1前言參考的是 這篇用的是dlib的對齊還加了mask。本文方法 人臉檢測 shiqiyu libfacedetection opencv提取ptr類 2 facedetect.h include include include include include facedetect dll.h us...