本期分享的知识是用算法模型进行人脸识别。
- 人脸识别任务
- 400张共计40个人的人脸照片。
- 使用人脸照片作为样本的特征,人脸的名字作为标签数据。
第一步:录入人脸
这一步我们需要建立一个个人脸识别文档。
接下来录入人脸
#加载相关模块
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
#随机抽选一个人脸的照片数据进行读取
import matplotlib.pylab as plt
img_arr = plt.imread('./datasets/faces/刘梅/3.bmp')
img_arr.shape #读取出来的人脸照片是一个三维的数组
plt.imshow(img_arr)
#过滤图片的颜色通道从而减少图片的特征维度
img_arr = img_arr[:,:,0]
img_arr.shape
plt.imshow(img_arr,cmap='gray')
以上我们只是读取了一个人脸。思考:如何对多个人脸做分类呢?
第二步:批量读取数据
import numpy as np
import os
feature = [] #保存特征数据
target = [] #保存标签数据
#获取每一个人名对应的文件夹名称,完整的图片路径 './datasets/faces/刘梅/3.bmp'
#listdir作用是可以将一个文件夹下所有文件的名称获取
names = os.listdir('./datasets/faces')
for name in names:
if name != '.DS_Store':
for index in range(10):#index的取值范围是0-9
img_path = './datasets/faces/'+name+'/'+str(index)+'.bmp'
#根据图片路径将图片的像素点数据进行读取
img_arr = plt.imread(img_path)
#过滤图片的颜色通道
img_arr = img_arr[:,:,0] #img_arr的形状是(64,64)
feature.append(img_arr)
target.append(name)
feature = np.array(feature)
target = np.array(target)
feature.shape
#(400,64,64)
此时的数据还是三维数据,需要把其改变为二维数据。(因为模型只接收二维形式的矩阵)#发
feature = feature.reshape((400,4096))4096为后二者相乘。
第三步:切分-找参数-建模
#数据集切分
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,
random_state=2020)
#找寻模型最优的超参数
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
ks = np.linspace(3,150,num=50).astype('int')
scores = []
for k in ks:
model = KNeighborsClassifier(n_neighbors=k)
score = cross_val_score(model,x_train,y_train,cv=5).mean()
scores.append(score)
scores = np.array(scores)
index = np.argmax(scores)
best_k = ks[index]
#建模
model = KNeighborsClassifier(n_neighbors=best_k)
model.fit(x_train,y_train)
model.score(x_test,y_test)
第四步:使用训练好的模型进行人脸识别任务
persons = x_test[10:15]
print('真实的名字:',y_test[10:15])
print('模型识别的人名:',model.predict(persons))