資源簡介
本人在https://blog.csdn.net/u010006643/article/details/46417127博客上看到的,奈何數據庫沒有,本人結合網上流傳的數據庫yale,寫下了可以運行得出結果的PCA降維,人臉識別程序,特別適合numpy和PCA學習。我第二次上傳資源,感謝平臺支持。謝謝大家支持。代碼注釋很詳細,注意我把人臉圖片在文件夾之內看成二維的數組。實驗表明,PCA對于光照很敏感。

代碼片段和文件信息
from?numpy?import?*
from?numpy?import?linalg?as?la
import?cv2
import?os
#導入文件?這里沒有用到for?循環的步進
def?loadImageSet():
????FaceMat?=?mat(zeros((15?100?*?100)))??#?先是15行的長矩陣
????file?=?“G:\\ProgrameCode\\FaceDataLib\\yaleFaceDataset\\“
????j=0
????try:
????????for?i?in?range(616111):
????????????tmp=str(i)
????????????img?=?cv2.imread(file?+?“s“?+?tmp?+?“.bmp“?0)
????????????FaceMat[j?:]?=?mat(img).flatten()
????????????j+=1
????????????i=int(tmp)
????except:
????????print(“err“)
????print(j)?#代表讀取多少照片?15
????print(FaceMat.shape)??#?(15?10000)
????return?FaceMat
def?ReconginitionVector(selecthr=0.8):
????FaceMat?=?loadImageSet().T??#?1000*15的矩陣
????aveImg?=?mean(FaceMat?1)??#?(10000?1)
????diffTrain?=?FaceMat?-?aveImg??#?列元素都會去減去的?初始化的
????tempDiffTrain?=?mat(diffTrain.T?*?diffTrain)??#?15*1000?*?1000*15
????#?print(tempDiffTrain.shape)#(15?15)
????#?print(tempDiffTrain)#這個數值沒法看懂
????eigvals?eigVects?=?linalg.eig(tempDiffTrain)??#對角化矩陣
????#?print(eigvals.shape)#(15)
????#?print(eigvals)#應該是15*1
????#?print(eigVects.shape)
????eigSortIndex?=?argsort(-eigvals)#排序
????#?從中可以看出argsort函數返回的是數組值從大到小的索引值arr[eigSortIndex]才是其值
????tempArrage?=?shape(FaceMat)[1]??#?1000*15?為了返回矩陣的列數??只是要索引而已
????#?print(tempArrage)?#15
????#?selecthr?=?0.9??#?0.8得到7;??0.9得到[0?1?2?3?4?6?7?8?9]
????for?i?in?range(tempArrage):
????????tempArryI?=?eigSortIndex[:i]??#?這是一維的索引,為了下面的相加
????????#?print(tempArryI)?#[0?1?2?3?4?6?7?8]
????????#代表矩陣的一行求和?eigvals.sum()?值是?273051023.0666671
????????#這是所謂的求得閾值
????????if?(eigvals[tempArryI]?/?eigvals.sum()).sum()?>=?selecthr:
????????????eigSortIndex?=?tempArryI
????????????#?print(eigSortIndex)
????????????break
????tempEigSortIndex?=?eigVects[:?eigSortIndex]??#?特征向量之中找到較大的特征值
????#?print(tempEigSortIndex.shape)?#(15?9)
????covVects?=?diffTrain?*?tempEigSortIndex
????##1000*15?*?15*(0-9等等)
????#?這樣我們不僅減少了計算量,而且保留了主成分,減少了噪聲的干擾。
????print(covVects.shape)??#(10000?9)
????return?aveImg?covVects?diffTrain?#標準臉??主特征臉?差值
????##?(10000?1)?#(10000?9)??1000*15
??????????#?(1?10000)???(10000?9)???(10000?1)??1000*15??#?待識別臉?主特征臉??標準臉??差值
def?judgeFace(judgeImg?FaceVector?avgImg?diffTrain):
????diff?=?judgeImg.T?-?avgImg?#(10000?1)??#特征向量
????weiVec?=?FaceVector.T?*?diff?#(7*1)(9*1)這是權重
????res?=?0
????resVal?=?inf?#正無窮
????for?i?in?range(15):#行數??從0開始到14
????????TrainVec?=?FaceVector.T?*?diffTrain[:?i]#9*(1-15)
????????tempVal=array(weiVec?-?TrainVec)?**?2?#下面代表近似無窮大
????????if?tempVal.sum()?????????????res?=?i
????????????#?這里因為我假設我要識別的未知人肯定是訓練集合里有的
????????????#?if?i?==?14:??#?代表遍歷所以的還小于;想法對,代碼不對
????????????#?????print(“查無此人“)
????????????#?????res=-1?#但是不對
????????????resVal?=?tempVal.sum()#求取元素的平方
????tempRes=res+1
????print(tempRes)
????return?tempRes??#
if?__name__?==?‘__main__‘:
????avgImg?FaceVector?diffTrain?=?ReconginitionVector(selecthr=0.9)
????##?(10000?1)?#(10000?9)??1000*15
????fileArry?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-08-20?16:32??Py815\
?????目錄???????????0??2018-08-20?15:27??Py815\.idea\
?????文件?????????534??2018-08-16?21:58??Py815\.idea\Py815.iml
?????目錄???????????0??2018-08-15?22:38??Py815\.idea\inspectionProfiles\
?????文件?????????228??2018-08-15?22:38??Py815\.idea\inspectionProfiles\profiles_settings.xm
?????文件?????????227??2018-08-16?21:58??Py815\.idea\misc.xm
?????文件?????????262??2018-08-15?22:38??Py815\.idea\modules.xm
?????文件???????51494??2018-08-20?15:27??Py815\.idea\workspace.xm
?????目錄???????????0??2018-08-16?09:00??Py815\__pycache__\
?????文件?????????345??2018-08-16?09:00??Py815\__pycache__\const.cpython-35.pyc
?????文件?????????187??2018-08-16?08:57??Py815\__pycache__\test.cpython-35.pyc
?????文件????????5335??2018-08-20?14:39??Py815\facePCA.py
?????目錄???????????0??2018-08-20?16:32??Py815\yaleFaceDataset\
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s1.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s10.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s100.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s101.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s102.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s103.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s104.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s105.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s106.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s107.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s108.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s109.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s11.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s110.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s111.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s112.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s113.bmp
?????文件???????11078??2003-02-06?23:09??Py815\yaleFaceDataset\s114.bmp
............此處省略147個文件信息
評論
共有 條評論