最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)人臉識別經(jīng)典算法(一) 特征臉法

 更新時間:2021年04月16日 08:45:50   作者:freedom098  
這篇文章主要為大家詳細介紹了python實現(xiàn)人臉識別經(jīng)典算法,特征臉法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

近來想要做一做人臉識別相關(guān)的內(nèi)容,主要是想集成一個系統(tǒng),看到opencv已經(jīng)集成了三種性能較好的算法,但是還是想自己動手試一下,畢竟算法都比較初級。

操作環(huán)境:python2.7

第三方庫:opencv for python、numpy

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

只當搬運工,送上鏈接。

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

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

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

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

代碼如下:

#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): 
 ''''' 
 載入圖像,灰度化處理,統(tǒng)一尺寸,直方圖均衡化 
 :param fileName: 圖像文件名 
 :param dsize: 統(tǒng)一尺寸大小。元組形式 
 :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: 包含訓練數(shù)據(jù)集的圖像文件夾路徑 
 :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函數(shù),用于數(shù)據(jù)降維 
 :param dataMat: 樣本矩陣 
 :param dimNum: 降維后的目標維度 
 :return: 降維后的樣本矩陣和變換矩陣 
 ''' 
 # 均值化矩陣 
 meanMat = np.mat(np.mean(dataMat,1)).T 
 print '平均值矩陣維度',meanMat.shape 
 diffMat = dataMat-meanMat 
 # 求協(xié)方差矩陣,由于樣本維度遠遠大于樣本數(shù)目,所以不直接求協(xié)方差矩陣,采用下面的方法 
 covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) # 歸一化 
 #covMat2 = np.cov(dataMat,bias=True) 
 #print '基本方法計算協(xié)方差矩陣為',covMat2 
 print '協(xié)方差矩陣維度',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] # 取出指定個數(shù)的前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): 
 ''''' 
 比較函數(shù),這里只是用了最簡單的歐氏距離比較,還可以使用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): 
 ''''' 
 預測函數(shù) 
 :param dirName: 包含訓練數(shù)據(jù)集的文件夾路徑 
 :param testFileName: 測試圖像文件名 
 :return: 預測結(jié)果 
 ''' 
 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') 

 以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python3模擬實現(xiàn)xshell遠程執(zhí)行l(wèi)inux命令的方法

    python3模擬實現(xiàn)xshell遠程執(zhí)行l(wèi)inux命令的方法

    今天小編就為大家分享一篇python3模擬實現(xiàn)xshell遠程執(zhí)行l(wèi)inux命令的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Django Rest framework之認證的實現(xiàn)代碼

    Django Rest framework之認證的實現(xiàn)代碼

    這篇文章主要介紹了Django Rest framework之認證的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • pandas獲取groupby分組里最大值所在的行方法

    pandas獲取groupby分組里最大值所在的行方法

    下面小編就為大家分享一篇pandas獲取groupby分組里最大值所在的行方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python面向?qū)ο蟮某绦蛟O(shè)計詳情

    Python面向?qū)ο蟮某绦蛟O(shè)計詳情

    這篇文章主要介紹了Python面向?qū)ο蟮某绦蛟O(shè)計詳情,面向?qū)ο蟮某绦蛟O(shè)計在Python中具有非常重要的地位,熟練的使用面向?qū)ο缶幊棠軌驗槲覀兊腜ython編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • VsCode終端激活anconda環(huán)境問題解決

    VsCode終端激活anconda環(huán)境問題解決

    本文主要介紹了VsCode終端激活anconda環(huán)境問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • Python分割列表list方法使用(平均n等份拆成)

    Python分割列表list方法使用(平均n等份拆成)

    本文主要介紹了Python分割列表list方法使用(平均n等份拆成),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 解決matplotlib庫show()方法不顯示圖片的問題

    解決matplotlib庫show()方法不顯示圖片的問題

    今天小編就為大家分享一篇解決matplotlib庫show()方法不顯示圖片的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • tensorflow構(gòu)建BP神經(jīng)網(wǎng)絡(luò)的方法

    tensorflow構(gòu)建BP神經(jīng)網(wǎng)絡(luò)的方法

    這篇文章主要為大家詳細介紹了tensorflow構(gòu)建BP神經(jīng)網(wǎng)絡(luò)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • numpy中tensordot的用法

    numpy中tensordot的用法

    本文主要介紹了numpy中tensordot的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 詳解如何使用Python實現(xiàn)復制粘貼的功能

    詳解如何使用Python實現(xiàn)復制粘貼的功能

    pandas?里面有一個?pd.read_clipboard?函數(shù),可以根據(jù)你復制的內(nèi)容生成DataFrame。本文就利用這個函數(shù)實現(xiàn)復制粘貼的功能,感興趣的可以了解一下
    2023-01-01

最新評論

镇沅| 泾川县| 清水河县| 鹤庆县| 黑河市| 双柏县| 福清市| 西平县| 双流县| 灵丘县| 中西区| 清涧县| 射洪县| 江口县| 江口县| 琼结县| 扶风县| 蕲春县| 凌源市| 泸水县| 青川县| 晴隆县| 江门市| 阳高县| 哈巴河县| 天等县| 孟村| 宣恩县| 高陵县| 赤水市| 宜宾市| 鸡泽县| 临江市| 垣曲县| 鲜城| 台南市| 丘北县| 郧西县| 赤水市| 托克托县| 库车县|