基于PCA方法的ORL人脸识别及Python代码实现
基于PCA方法的ORL人臉識別及Python代碼實現
- PCA算法
- 方案設計
- 代碼實現
- 結果分析
- 參考文獻
PCA的理論知識已經有很多博客做了清晰的解釋,主要概括為找到投影的面使得類間誤差最大,轉化為找到構建的協方差的特征值與特征向量,在新的投影方向(特征向量)上投影,構建數據庫和待檢索的人臉進行比對,得到相似度最高的人臉作為查詢結果,本文使用ORL人臉數據庫基于PCA方法實現人臉識別。
機器學習理論《統計學習方法》學習筆記:主成分分析(PCA)
本文所用的是ORL人臉庫,由英國劍橋實驗室拍攝,共有40人,每人不同角度不同表情拍攝了10張,所以共有400個樣本數據,圖片尺寸為112*92,格式為pgm。本文將每人的前5張作為訓練集,后5張作為測試集。ORL人臉庫可在該網址下載。
https://download.csdn.net/download/qq_40507857/13714311
PCA算法
設有m條n維數據:
(1)將原始數據按列組成n行m列矩陣X
(2)將X的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值
(3)求出協方差矩陣
(4)求出協方差矩陣的特征值及對應的特征向量
(5)將特征向量按對應特征值大小從上到下按行進行排列成矩陣,取前k行組成矩陣P
(6)Y=PX即為降維到K維后的數據
方案設計
其中,構建的協方差矩陣CCTCC^TCCT進行特征值與特征向量求解時非常耗時,所以構造CTCC^TCCTC進行特征值和特征向量的求取,最后通過將求得的特征向量左乘C,即可得到CTCC^TCCTC的特征向量。
代碼實現
import cv2 import numpy as np import glob# 預處理 構建數據矩陣 images = glob.glob(r'.\ORL\*.bmp') X = [] for img in images:img = cv2.imread(img, 0)temp = np.resize(img, (img.shape[0] * img.shape[1], 1))X.append(temp.T) X = np.array(X).squeeze().T print(X.shape, X.shape[1]) # (10304, 400) 400# 10輪 correct_sum = 0 for epoch in range(10):# 10折交叉驗證 數據劃分train_data = X[:, [x for x in list(range(X.shape[1])) if x not in list(range(epoch, X.shape[1], 10))]]test_data = X[:, list(range(epoch, X.shape[1], 10))]# trainu = np.sum(train_data, axis=1) / train_data.shape[1] # 求均值向量# 平均臉# u = np.array(u, dtype='uint8')# average_face = np.resize(u, (img.shape[0], img.shape[1]))# cv2.imwrite('Average_Face.png', average_face)u = u[:, np.newaxis]C = train_data - u # 中心化后數據矩陣Covariance = np.dot(C.T, C) # 構建協方差矩陣,一般為C .* C.T,但是構造這種類型可減少運算量eigvalue, eigvector = np.linalg.eig(Covariance) # 由協方差矩陣求解特征值、特征向量real_eigvector = np.dot(C, eigvector) # 通過之前的構造來恢復真正協方差矩陣對應的特征向量sort = np.argsort(-eigvalue) # 將特征值從大到小怕排序,得到排序后對于原索引P = real_eigvector.T[sort[0:100]] # 對于排序構造特征向量,取前面較大權重值Y = []for i in range(train_data.shape[1]):temp = train_data[:, i, np.newaxis]Y.append(np.dot(P, temp - u)) # 構建每幅圖像投影后的值,構造查找表# testcorrect = 0for index in range(test_data.shape[1]):img_test = test_data[:, index, np.newaxis] # 從測試集提取單張人臉Result = np.dot(P, img_test - u) # 計算待識別的人臉的投影a = np.sum(abs(Y - Result), axis=1).argmin() # 遍歷搜索匹配if index * 9 <= a < (index + 1) * 9: # 若索引在寬度為9的區間內則為該人臉,視為匹配正確correct += 1print('Epoch{} correct rate: {}%'.format(epoch, correct / 40 * 100))correct_sum += correctprint('Final correct rate: {}%'.format(correct_sum / 4))- 平均臉
- 運行結果
結果分析
通過10折交叉驗證,最后得到的準確度為97.75%,即通過少量樣本可以得到較好的結果,說明PCA在降維上擁有很好的效果,較好的保留了主要特征。
參考文獻
總結
以上是生活随笔為你收集整理的基于PCA方法的ORL人脸识别及Python代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django 基本使用
- 下一篇: for循环和增强for循环