资源简介

本人在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() < 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 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           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.xml
     文件         227  2018-08-16 21:58  Py815\.idea\misc.xml
     文件         262  2018-08-15 22:38  Py815\.idea\modules.xml
     文件       51494  2018-08-20 15:27  Py815\.idea\workspace.xml
     目录           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个文件信息

评论

共有 条评论