Fisherface(FLD)人脸识别实验

Fisherface(FLD)人脸识别实验大致与Eigenface(PCA)人脸识别实验相同。主要是在模型训练方面,需要使用cv2.face.FisherFaceRecognizer_create(),最终的预测结果与实际相符。

如果想要了解Eigenface(PCA)人脸识别实验,可以参考我的另一篇博客:Eigenface(PCA)人脸识别实验

1、数据提取与处理

%matplotlib inline
# 导入所需模块
import matplotlib.pyplot as plt
import numpy as np
import os
import cv2

# plt显示灰度图片
def plt_show(img):
    plt.imshow(img,cmap='gray')
    plt.show()

# 读取一个文件夹下的所有图片,输入参数是文件名,返回文件地址列表
def read_directory(directory_name):
    faces_addr = []
    for filename in os.listdir(directory_name):
        faces_addr.append(directory_name + "/" + filename)
    return faces_addr

# 读取所有人脸文件夹,保存图像地址在faces列表中
faces = []
for i in range(1,41):
    faces_addr = read_directory('C:/Users/ASUS/Desktop/att_faces/s'+str(i))
    for addr in faces_addr:
        faces.append(addr)

# 读取图片数据,生成列表标签
images = []
labels = []
for index,face in enumerate(faces):
    # enumerate函数可以同时获得索引和值
    image = cv2.imread(face,0)
    images.append(image)
    labels.append(int(index/10+1))
print(len(labels))
print(len(images))
print(type(images[0]))
print(labels)

Fisherface(FLD)人脸识别实验_第1张图片

# 画出最后20组人脸图像
# 创建画布和子图对象
fig, axes = plt.subplots(10,20
                       ,figsize=(20,10)
                       ,subplot_kw = {
     "xticks":[],"yticks":[]} #不要显示坐标轴
                       )
# 图片x行y列,画布x宽y高
# 填充图像
for i, ax in enumerate(axes.flat):
    ax.imshow(images[i+200],cmap="gray") #选择色彩的模式

Fisherface(FLD)人脸识别实验_第2张图片

2、Fisher线性降维以及使用OpenCV的createFisherFace算法进行识别

from sklearn.model_selection import train_test_split

# 图像数据转换特征矩阵
image_data = []
for image in images:
    data = image.flatten()
    # a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降
    image_data.append(data)
print(image_data[0].shape)

输出:(10304,)

# 转换为numpy数组
X = np.array(image_data)
y = np.array(labels)
print(type(X))
print(X.shape)

输出:

(400, 10304)

# 画出特征矩阵
import pandas as pd
data = pd.DataFrame(X)
data.head()

Fisherface(FLD)人脸识别实验_第3张图片

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.2) # train训练,test测试

# 模型创建与训练
model = cv2.face.FisherFaceRecognizer_create()
model.train(x_train,y_train)

# 预测
res = model.predict(x_test[0])
print(res)
y_test[0]

输出:
(2, 1072.3448517673733)
2

# 测试数据集的准确率
ress = []
true = 0
for i in range(len(y_test)):
    res = model.predict(x_test[i])
    if y_test[i] == res[0]:
        true = true+1
    else:
        print(i)

print('测试集识别准确率:%.2f'% (true/len(y_test)))

输出:
8
13
14
59
65
73
测试集识别准确率:0.93

如果你觉得还不错,那就给我点个赞吧(* ̄︶ ̄)

你可能感兴趣的:(模式识别,人工智能,模式识别,python,fisher精确检验)