中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用python實現人臉識別經典算法

發布時間:2021-03-23 13:47:53 來源:億速云 閱讀:173 作者:小新 欄目:開發技術

這篇文章主要介紹了如何使用python實現人臉識別經典算法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

第三方庫:opencv for python、numpy

第一種比較經典的算法就是特征臉法,本質上其實就是PCA降維,這種算法的基本思路是,把二維的圖像先灰度化,轉化為一通道的圖像,之后再把它首尾相接轉化為一個列向量,假設圖像大小是20*20的,那么這個向量就是400維,理論上講組織成一個向量,就可以應用任何機器學習算法了,但是維度太高算法復雜度也會隨之升高,所以需要使用PCA算法降維,然后使用簡單排序或者KNN都可以。

只當搬運工,送上鏈接。

PCA ,這篇博客講得非常好了,從原理到實現基本看這個就能搞出來了:PCA的數學原理

特征臉法:PCA應用在人臉識別當中:人臉識別經典算法一:特征臉方法(Eigenface) ,這里與PCA有不同的操作就是特征值分解的時候,由于圖像組成的列向量維度太高,直接按照PCA算法求解會很慢,所以這里有一種特殊的處理方法。

數據組織形式為若干樣本圖片分類放入對應文件夾中,然后在統一存放入face文件夾下,測試圖像單獨一張圖像即可。

另外,由于PCA中維度是一個很麻煩的事情,所以在程序中,我打印了很多維度信息,有助于我們理解PCA的工作過程和調試。

代碼如下:

#encoding=utf-8 
import numpy as np 
import cv2 
import os 
 
class EigenFace(object): 
 def __init__(self,threshold,dimNum,dsize): 
 self.threshold = threshold # 閾值暫未使用 
 self.dimNum = dimNum 
 self.dsize = dsize 
 
 def loadImg(self,fileName,dsize): 
 ''''' 
 載入圖像,灰度化處理,統一尺寸,直方圖均衡化 
 :param fileName: 圖像文件名 
 :param dsize: 統一尺寸大小。元組形式 
 :return: 圖像矩陣 
 ''' 
 img = cv2.imread(fileName) 
 retImg = cv2.resize(img,dsize) 
 retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY) 
 retImg = cv2.equalizeHist(retImg) 
 # cv2.imshow('img',retImg) 
 # cv2.waitKey() 
 return retImg 
 
 
 def createImgMat(self,dirName): 
 ''''' 
 生成圖像樣本矩陣,組織形式為行為屬性,列為樣本 
 :param dirName: 包含訓練數據集的圖像文件夾路徑 
 :return: 樣本矩陣,標簽矩陣 
 ''' 
 dataMat = np.zeros((10,1)) 
 label = [] 
 for parent,dirnames,filenames in os.walk(dirName): 
  # print parent 
  # print dirnames 
  # print filenames 
  index = 0 
  for dirname in dirnames: 
  for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname): 
   for filename in subFilenames: 
   img = self.loadImg(subParent+'/'+filename,self.dsize) 
   tempImg = np.reshape(img,(-1,1)) 
   if index == 0 : 
    dataMat = tempImg 
   else: 
    dataMat = np.column_stack((dataMat,tempImg)) 
   label.append(subParent+'/'+filename) 
   index += 1 
 return dataMat,label 
 
 
 def PCA(self,dataMat,dimNum): 
 ''''' 
 PCA函數,用于數據降維 
 :param dataMat: 樣本矩陣 
 :param dimNum: 降維后的目標維度 
 :return: 降維后的樣本矩陣和變換矩陣 
 ''' 
 # 均值化矩陣 
 meanMat = np.mat(np.mean(dataMat,1)).T 
 print '平均值矩陣維度',meanMat.shape 
 diffMat = dataMat-meanMat 
 # 求協方差矩陣,由于樣本維度遠遠大于樣本數目,所以不直接求協方差矩陣,采用下面的方法 
 covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) # 歸一化 
 #covMat2 = np.cov(dataMat,bias=True) 
 #print '基本方法計算協方差矩陣為',covMat2 
 print '協方差矩陣維度',covMat.shape 
 eigVals, eigVects = np.linalg.eig(np.mat(covMat)) 
 print '特征向量維度',eigVects.shape 
 print '特征值',eigVals 
 eigVects = diffMat*eigVects 
 eigValInd = np.argsort(eigVals) 
 eigValInd = eigValInd[::-1] 
 eigValInd = eigValInd[:dimNum] # 取出指定個數的前n大的特征值 
 print '選取的特征值',eigValInd 
 eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #歸一化特征向量 
 redEigVects = eigVects[:,eigValInd] 
 print '選取的特征向量',redEigVects.shape 
 print '均值矩陣維度',diffMat.shape 
 lowMat = redEigVects.T*diffMat 
 print '低維矩陣維度',lowMat.shape 
 return lowMat,redEigVects 
 
 def compare(self,dataMat,testImg,label): 
 ''''' 
 比較函數,這里只是用了最簡單的歐氏距離比較,還可以使用KNN等方法,如需修改修改此處即可 
 :param dataMat: 樣本矩陣 
 :param testImg: 測試圖像矩陣,最原始形式 
 :param label: 標簽矩陣 
 :return: 與測試圖片最相近的圖像文件名 
 ''' 
 testImg = cv2.resize(testImg,self.dsize) 
 testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY) 
 testImg = np.reshape(testImg,(-1,1)) 
 lowMat,redVects = self.PCA(dataMat,self.dimNum) 
 testImg = redVects.T*testImg 
 print '檢測樣本變換后的維度',testImg.shape 
 disList = [] 
 testVec = np.reshape(testImg,(1,-1)) 
 for sample in lowMat.T: 
  disList.append(np.linalg.norm(testVec-sample)) 
 print disList 
 sortIndex = np.argsort(disList) 
 return label[sortIndex[0]] 
 
 
 def predict(self,dirName,testFileName): 
 ''''' 
 預測函數 
 :param dirName: 包含訓練數據集的文件夾路徑 
 :param testFileName: 測試圖像文件名 
 :return: 預測結果 
 ''' 
 testImg = cv2.imread(testFileName) 
 dataMat,label = self.createImgMat(dirName) 
 print '加載圖片標簽',label 
 ans = self.compare(dataMat,testImg,label) 
 return ans 
 
 
if __name__ == '__main__': 
 eigenface = EigenFace(20,50,(50,50)) 
 print eigenface.predict('d:/face','D:/face_test/1.bmp')

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何使用python實現人臉識別經典算法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍邱县| 清徐县| 宜宾县| 满城县| 衡山县| 阳朔县| 渝中区| 新龙县| 滨州市| 甘洛县| 射洪县| 库车县| 探索| 凤庆县| 河曲县| 莆田市| 丹棱县| 天峻县| 包头市| 西城区| 武乡县| 军事| 阿尔山市| 潢川县| 夏邑县| 永修县| 东乌珠穆沁旗| 屏边| 霍城县| 水富县| 四会市| 四子王旗| 铜川市| 卫辉市| 乌拉特前旗| 霸州市| 云龙县| 平定县| 漯河市| 萨迦县| 莫力|