日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

基于PCA方法的ORL人脸识别及Python代码实现

發布時間:2024/10/8 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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維后的數據

方案設計

  • 將ORL人臉數據庫的40位志愿者的10張圖片,使用10折交叉驗證。每個人依次取出一張作為驗證數據,進行10輪驗證,最后得到準確率的均值。對于每次運算,訓練集大小為360張圖片,驗證集大小為40張圖片。對于每張圖片,將其展開為一維向量XiX_iXi?;即訓練集X=X1,X2,?,X360X=X_1,X_2,\cdots,X_360X=X1?,X2?,?,X3?60,維度為(10304,400).
  • 求X每行的均值向量u,并將其與X相減,進行零均值化,得到C=(X1?u,X2?u,?,X360?u)C=(X_1-u,X_2-u,\cdots,X_360-u)C=(X1??u,X2??u,?,X3?60?u);
  • 構建協方差矩陣CCTCC^TCCT
  • 求解協方差矩陣的特征值,選取最大的K個,求出對應的K個特征向量,并將其按列排成變換矩陣P,其維度為(10304*K);
  • 計算訓練集的圖片在上述特征向量下的投影,即為Yi=PT(Xi?u)Y_i=P^T(X_i-u)Yi?=PT(Xi??u),作為查找集;
  • 將待識別的圖片做以上相同投影運算得到Z;
  • 遍歷搜索查找集,滿足min∣∣Yi?Z∣∣min||Y_i-Z||minYi??Z條件的,即待識別圖片與YiY_iYi?對應圖片屬于一類,即找到待識別照片的主人。
  • 其中,構建的協方差矩陣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在降維上擁有很好的效果,較好的保留了主要特征。

    參考文獻

  • https://blog.csdn.net/qq_24946843/article/details/81775701
  • https://blog.csdn.net/Big_Huang/article/details/103830082
  • 總結

    以上是生活随笔為你收集整理的基于PCA方法的ORL人脸识别及Python代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。