python代码:
from __future__ import print_function
from time import time
import logging
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_lfw_people
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.decomposition import PCA
from sklearn.svm import SVC
def main():
logging.basicConfig( level=logging.INFO ,format='%(asctime)s %(message)s' )
peoples = fetch_lfw_people( min_faces_per_person=70 )
# 下面介绍数据预处理和分类
# 返回多少个图
shapes,h,w = peoples.images.shape
# X是特征向量的矩阵,每一行是个实例,每一列是个特征值
X = peoples.data
# n_featers表示的就是维度
n_features = X.shape[1] # 维度:每个人会提取多少的特征值
# 提取每个实例对应每个人脸,目标分类标记,不同的人的身份
y = peoples.target
target_names = peoples.target_names
n_classes = target_names.shape[0] #多少行,shape就是多少行,多少个人,多少类
# 下面开始拆分数据,分成训练集和测试集,有个现成的函数,通过调用train_test_split;来分成两部分
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25)
# 数据降维,因为特征值的维度还是比较高
n_components = 150
t0 = time() # 计算出打印每一步需要的时间
pca = PCA(n_components=n_components, whiten=True).fit(X_train)
eigenfaces = pca.components_.reshape((n_components, h, w))
t0 = time()
X_train_pca = pca.transform(X_train) # 特征量中训练集所有的特征向量通过pca转换成更低维的矩阵
X_test_pca = pca.transform(X_test)
# param_grid把参数设置成了不同的值,C:权重;gamma:多少的特征点将被使用,因为我们不知道多少特征点最好,选择了不同的组合
param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],
'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
# 把所有我们所列参数的组合都放在SVC里面进行计算,最后看出哪一组函数的表现度最好
clf = GridSearchCV(SVC(kernel='rbf'), param_grid)
# 其实建模非常非常简单,主要是数据的预处理麻烦
clf = clf.fit(X_train_pca, y_train)
# 测试集预测看看准确率能到多少
y_pred = clf.predict(X_test_pca)
# print(classification_report(y_test, y_pred, target_names=target_names)) #预测精确度
# print(confusion_matrix(y_test, y_pred, labels=range(n_classes))) #混淆矩阵
# 把预测出来的人名存起来
prediction_titles = [title(y_pred, y_test, target_names, i)
for i in range(y_pred.shape[0])]
plot_gallery(X_test, prediction_titles, h, w)
# 降维后的图片
eigenface_titles = ['eigenface %d' %i for i in range(eigenfaces.shape[0])]
# 提取过特征向量之后的脸是什么样子
plot_gallery(eigenfaces, eigenface_titles, h, w)
# 把预测的函数归类标签和实际函数归类标签,比如布什
def title(y_pred, y_test, target_names, i):
pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]
true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]
flag = "No"
if pred_name == true_name:
flag = "Yes"
result = " flag:{0}\n predicted :{1} \n true : {2} ".format(flag,pred_name,true_name)
return result
#把数据可视化的可以看到,把需要打印的图打印出来
def plot_gallery(images,titles,h,w,n_row=3,n_col=4):
"""Helper function to plot a gallery of portraits"""
#在figure上建立一个图当背景
plt.figure(figsize=(1.8*n_col,2.4*n_row))
plt.subplots_adjust(bottom=0,left=.01,right=.99,top=.90,hspace=.35)
for i in range(n_row * n_col):
plt.subplot(n_row,n_col,i+1)
plt.imshow(images[i].reshape((h,w)),cmap=plt.cm.gray)
plt.title(titles[i],size=12)
plt.xticks(())
plt.yticks(())
plt.show()
main()
人脸识别结果:
降维后结果: