【基於PCA的人臉識別演算法】從QR分解到PCA,再到人臉識別
PCA(Principal Component Analysis,主成分分析)是一種很常用的根據變數協方差對資料進行降維、壓縮的方法。它的精髓在於儘量用最少數量的維度,儘可能精確地描述資料。
PCA對資料進行降維的過程可以用下面這個動圖來解釋(圖片摘自http://stats.stackexchange.com/a/140579/93946):
在上圖中,一組位於直角座標系的二維樣本集,沿著斜線的方向有很強的相關性。所以如果我們將直角座標系轉換到斜向,也就是讓橫軸沿斜線方向,縱軸垂直於斜線方向。於是,在這個新的座標系下,資料點在橫軸上分佈很分散,但是在縱軸方向比較集中。如果在誤差允許範圍內,我們完全可以將資料點在新縱軸上的座標全部置為0,只用新橫軸上的座標來表示點的位置。這樣,就完成了對資料降維的過程(即將原始直角座標系的2個維度減小到新座標系的1個維度)。對更高維的情況,處理過程與之類似。
PCA人臉識別
將PCA用於人臉識別的過程如下:
1.假設有400幅尺寸為100*100的影象,構成10000*400的矩陣;
2.計算均值,令;
3.根據定義,計算協方差矩陣;
4.計算的特徵值與特徵向量,取前h個最大特徵值所對應的特徵向量,構成矩陣;
5.矩陣可對資料降維:,Y是h行400列的矩陣,也就是將資料從10000維降為h維。
這種做法一個明顯的缺陷在於,的維度為10000×10000,直接進行奇異值分解計算量非常大。利用QR分解,作間接的奇異值分解,可以減小計算量。
利用QR分解減小計算量
基於QR分解的PCA演算法步驟如下:
1.已知,其中為d*d,H為d*n,d代表原始資料的維數,n代表樣本數,d遠大於n;
2.對H作QR分解,,其中Q為d*t,R為t*n,;
3.則,對作奇異值分解,其中U為n*t,V為t*t,;
4.於是,其中;
5.由於,所以QV可將對角化,QV為的特徵向量矩陣,為的特徵值矩陣;
6.選取D前h個最大對角元所對應於V中的h個列,構成t*h的矩陣,則降維矩陣;
該過程涉及對一個很大的矩陣的QR分解,和對一個較小矩陣的奇異值分解。計算量與傳統方法相比較的結果如下(圖片摘自[1]):
進一步,進行人臉識別的過程如下:
1.假設有c個類別,每類包含s個樣本,則n=c∗s;
2.對X計算,將Y(也稱特徵臉)按類別計算均值,得到c個長度為h的列向量;
3.對於未知類別的新樣本x,計算,y的長度為h;
4.計算距離,取距離最小的i作為x的類標號。
距離度量d
1.歐式距離
2.曼哈頓距離
3.馬氏距離
在馬氏距離中,x與y分佈相同,且協方差矩陣為S。加入協方差矩陣的逆矩陣的作用是,將如下圖(圖片部分取自http://stats.stackexchange.com/a/62147/93946)中呈橢圓分佈的資料歸一化到圓形分佈中,再來比較距離,可以抵消不同樣本集在特徵空間中的分佈差異。
C++實現
環境要求:OpenCV(樣本影象的讀取),Armadillo(高效能線性代數C++函式庫),Intel MKL(替代LAPACK為Armadillo提供矩陣分解計算)。
專案使用Visual Studio Ultimate 2012建立,不過核心程式碼只有一個cpp檔案。
全部程式碼託管在github.com/johnhany/QR-PCA-FaceRec。
分類測試
測試樣本採用The AT&T Database of Faces,原稱The ORL Database of Faces,包含取自40個人的樣本,每人10幅,共400幅影象,影象尺寸92*112。
樣本庫的連結為http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html。
1.歐式距離降維及分類效果:
即使將h設為最大的400(樣本數),其分類正確率也只能達到99%。
2.曼哈頓距離降維及分類效果:
在h為128時,分類正確率可以達到100%,降維能力略好於歐式距離。
3.馬氏距離降維及分類效果:
在h僅僅為7的時候,其分類正確率就已經達到100%了。採用馬氏距離的PCA方法可以將人臉資料的維度從10000左右降到7,降維效果非常優秀。在h超過9時,分類過程中計算的最大馬氏距離超出了雙精度浮點數double的上限。
參考文獻
[1] Sharma A, Paliwal K K, Imoto S, et al. Principal component analysis using QR decomposition[J]. International Journal of Machine Learning and Cybernetics, 2013, 4(6): 679-683.
[2] Raj D. A Realtime Face Recognition system using PCA and various Distance Classifiers[J]. 2011.
[3] Turk M, Pentland A. Eigenfaces for recognition[J]. Journal of Cognitive Neuroscience, 1991, 3(1): 71-86.
相關文章
- 基於PCA(主成分分析)的人臉識別PCA
- 如何理解並實現一個簡單的人臉識別演算法(下):人臉識別演算法
- 基於深度學習的人臉識別系統系列(Caffe+OpenCV+Dlib)——【六】設計人臉識別的識別類深度學習OpenCV
- opencv 人臉識別OpenCV
- OpenCV — 人臉識別OpenCV
- 從零玩轉人臉識別
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- SAP官方提供的人臉識別APIAPI
- 基於Android平臺實現人臉識別Android
- 人臉識別之特徵臉方法(Eigenface)特徵
- 前端人臉識別--兩張臉相似度前端
- Mars演算法實踐——人臉識別演算法
- C#人臉識別入門篇-STEP BY STEP人臉識別--入門篇C#
- 智慧人臉識別門禁系統開發,人臉識別開鎖流程
- 基於DNN的人臉識別中的反欺騙機制DNN
- 基於開源模型搭建實時人臉識別系統(五):人臉跟蹤模型
- 基於開源模型搭建實時人臉識別系統(四):人臉質量模型
- 一個簡單的人臉識別庫
- 乾貨 | AI人臉識別之人臉搜尋AI
- Java 基於ArcFace人臉識別2.0 服務端DemoJava服務端
- 【專案】Python人臉識別(GUI介面)—— 基於pyopencvPythonGUIOpenCV
- 帶你玩轉OpenHarmony AI:基於Seetaface2的人臉識別AI
- 人臉活體檢測人臉識別:眨眼+張口
- 從零玩轉人臉識別之RGB人臉活體檢測
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- 人臉識別之Python DLib庫進行人臉關鍵點識別Python
- 人臉識別技術應用
- 前端如何玩轉人臉識別前端
- python—呼叫API人臉識別PythonAPI
- 人臉識別之人臉檢測的重要性
- 刷臉支付人臉識別特徵點越多是別越精確特徵
- 基於卷積神經網路的人臉表情識別應用--AR川劇變臉(一)卷積神經網路
- 深度學習下的人臉識別技術:從“後真相”到“無隱私”深度學習
- 人臉識別 -- 活體檢測(張嘴搖頭識別)
- 人臉識別 — 活體檢測(張嘴搖頭識別)
- 模式識別hw2-------基於matconvnet,用CNN實現人臉圖片性別識別模式CNN
- 中國人臉識別產業鏈全景圖產業
- Python人臉識別微笑檢測Python