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个文件信息