Python基于Numpy和PIL库的PCA人脸识别

主要应用主成分分析方法降低训练样本的维度,再利用计算欧式距离的方法判定,与训练样本中最接近的人脸。代码如下。

#-*- coding:utf-8 -*-
from numpy import *
from scipy.linalg import *
from pylab import *
import testeig1
import os
from PIL import Image
path='./faces94/'
A=zeros([1,36000])
A=uint8(A)
fjpg=[]
for filename in os.listdir(path):
    if filename.endswith('.jpg'):
        fjpg.append(filename)
for i in range(len(fjpg)):
    fjpg[i]=path+fjpg[i]
    B=array(Image.open(fjpg[i]).convert('L'))
    B=B.flatten()
    A=append(A,B)
A=A.reshape(len(fjpg)+1,36000)
A1=delete(A,0,0)
A2=A1.T
B=array(Image.open('./faces94/test/9338454.1.jpg').convert('L'))
B1=B.flatten()
test=B1
feature=4#特征选择数
I1,lowD,percent1,Q,n,t=testeig1.testeig(A2,feature)
Ous=zeros(n)
pj_train=dot(lowD.T,I1)#影像投影坐标t*n,每一列为对应图像在子空间的坐标
pj_test=dot(lowD.T,test)#计算测试影像在子空间的坐标
for j in range(0,n):#计算欧式距离
    for i in range(0,t):
        Ous[j]+=(pj_train[i,j]-pj_test[i])**2
a=argmin(Ous)+1
lowD1=lowD[:,0]
lowD2=lowD1.reshape(200,180)
pl=Image.fromarray(lowD2)
pl.show()
print '图',fjpg[a-1],'与测试图像最接近\n',Ous,'\n','使用前',feature,'特征的信息完整度',percent1,'%'#Ous越小越接近,

训练和测试的头像如下:

Python基于Numpy和PIL库的PCA人脸识别_第1张图片

Python基于Numpy和PIL库的PCA人脸识别_第2张图片

输出结果如下:

图 ./faces94/cwang.1.jpg 与测试图像最接近
[  5.41676578e+15   7.81703951e+15   3.80191725e+15   4.10364707e+16
   1.61495155e+16   8.77888351e+15   3.53679326e+15   6.17202650e+15] 
使用前 4 特征的信息完整度 77.468618641 %

你可能感兴趣的:(Python基于Numpy和PIL库的PCA人脸识别)