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(6,161,11):
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() < resVal: #求得与的欧式距离来判断未知人脸与第k张训练人脸之间的差距。
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 = "G:\\ProgrameCode\\FaceDataLib\\yaleFaceDataset\\"
nameList = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15']
characteristic = ['centerlight', 'glasses', 'happy', 'leftlight', 'noglasses', '','rightlight', 'sad', 'sleepy','surprised', 'wink']
#其实是11个,这是取出10个而已,没有使用opencv去做,使用矩阵运算理论做的;训练图片大大减少,
countSum=0
for P,K in enumerate(range(1,12)):#大于11才行,默认步进长度1
# print("列值",K)
if K==6:#列为normal值
print(P) #这里应该是5 P是索引0开始
continue
print("不会走下去")
cout=0
for N,M in enumerate(range(K,166,11)):#>155 N是次数0开始
# print("行值",M)
try:
loadname=fileArry+"s"+str(M)+".bmp"
judgeImg = cv2.imread(loadname, 0)
tempMat=mat(judgeImg).flatten()#(1, 10000)
#不明白这里返回值要加1,表示与正常的人脸识别,15人一人一张图,就可以识别出15个不同人的照片了,
if judgeFace(tempMat, FaceVector, avgImg, diffTrain) == int(nameList[N]):#N是真实的标签,是行标
cout += 1
countSum+=1
except:
print("err")
# print(P)
character=characteristic[P]
print('accuracy of %s is %f' % (character, float(cout) / len(nameList))) # 求出正确率 15
print('accuracy of %s is %f' % ('sum', float (countSum) / 165)) # 求出正确率 0.636364
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本人在https://blog.csdn.net/u010006643/article/details/46417127博客上看到的,奈何数据库没有,本人结合网上流传的数据库yale,写下了可以运行得出结果的PCA降维,人脸识别程序,特别适合numpy和PCA学习。我第二次上传资源,感谢平台支持。谢谢大家支持。代码注释很详细,注意我把人脸图片在文件夹之内看成二维的数组。实验表明,PCA对于光照很敏感。
资源推荐
资源详情
资源评论
收起资源包目录
Python-PCA降维人脸识别,已包含yale数据库 (173个子文件)
s70.bmp 11KB
s10.bmp 11KB
s16.bmp 11KB
s15.bmp 11KB
s72.bmp 11KB
s14.bmp 11KB
s8.bmp 11KB
s158.bmp 11KB
s123.bmp 11KB
s127.bmp 11KB
s152.bmp 11KB
s19.bmp 11KB
s59.bmp 11KB
s134.bmp 11KB
s124.bmp 11KB
s153.bmp 11KB
s51.bmp 11KB
s102.bmp 11KB
s165.bmp 11KB
s108.bmp 11KB
s30.bmp 11KB
s37.bmp 11KB
s31.bmp 11KB
s156.bmp 11KB
s26.bmp 11KB
s154.bmp 11KB
s155.bmp 11KB
s146.bmp 11KB
s128.bmp 11KB
s22.bmp 11KB
s104.bmp 11KB
s113.bmp 11KB
s81.bmp 11KB
s94.bmp 11KB
s44.bmp 11KB
s11.bmp 11KB
s12.bmp 11KB
s53.bmp 11KB
s103.bmp 11KB
s36.bmp 11KB
s60.bmp 11KB
s105.bmp 11KB
s89.bmp 11KB
s101.bmp 11KB
s42.bmp 11KB
s6.bmp 11KB
s5.bmp 11KB
s62.bmp 11KB
s61.bmp 11KB
s23.bmp 11KB
s50.bmp 11KB
s84.bmp 11KB
s82.bmp 11KB
s32.bmp 11KB
s85.bmp 11KB
s137.bmp 11KB
s129.bmp 11KB
s79.bmp 11KB
s24.bmp 11KB
s149.bmp 11KB
s140.bmp 11KB
s52.bmp 11KB
s98.bmp 11KB
s20.bmp 11KB
s39.bmp 11KB
s55.bmp 11KB
s117.bmp 11KB
s164.bmp 11KB
s17.bmp 11KB
s21.bmp 11KB
s116.bmp 11KB
s48.bmp 11KB
s163.bmp 11KB
s143.bmp 11KB
s122.bmp 11KB
s135.bmp 11KB
s3.bmp 11KB
s97.bmp 11KB
s119.bmp 11KB
s4.bmp 11KB
s90.bmp 11KB
s1.bmp 11KB
s13.bmp 11KB
s106.bmp 11KB
s110.bmp 11KB
s83.bmp 11KB
s29.bmp 11KB
s47.bmp 11KB
s151.bmp 11KB
s95.bmp 11KB
s96.bmp 11KB
s87.bmp 11KB
s111.bmp 11KB
s33.bmp 11KB
s68.bmp 11KB
s9.bmp 11KB
s58.bmp 11KB
s132.bmp 11KB
s27.bmp 11KB
s125.bmp 11KB
共 173 条
- 1
- 2
资源评论
weixin_38671006
- 粉丝: 6
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功