目录
Fisherface人脸识别原理是基于线性判别分析(Linear Discriminant Analysis,LDA)的一种方法。线性判别分析是一种经典的线性学习方法,最早由Fisher在1936年提出,也被称为“Fisher判别分析法”
简易过程:
fisherface的原理
基本原理:在低维表示下,首先将训练集样本集投影到一条直线A上,让投影后的点满足同类间的点尽可能地靠近,异类间的点尽可能地远离。
然而,这种方法在操作过程中可能会损失许多用于分类的关键信息。因此,在某些特殊的情况下,如果损失的信息刚好是用于分类的关键信息,必然导致结果预测错误。
代码实现
重要函数:cv2.face.FisherFaceRecognizer_create(threshold=1000)
作用:创建一个FisherFace的人脸特征识别器
threshold:进行识别时所用的阈值。如果最近的距离比设定的阈值threshold还要大,函数会返回“-1”。
完整代码
代码用到的图片:
import cv2
import numpy as np
# 将训练图片统一放在列表里
images = [] # 读取训练图像
images.append(cv2.imread('./lbph/f01.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./lbph/f02.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./lbph/f11.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('./lbph/f12.png', cv2.IMREAD_GRAYSCALE))
# 与训练图集一一匹配
labels = [0, 0, 1, 1] # 给训练图像贴标签
# 用来测试的图片
predict_image = cv2.imread('./lbph/fTest.png', cv2.IMREAD_GRAYSCALE)
# 定义FisherFace人脸特征识别器
recognizer = cv2.face.FisherFaceRecognizer_create(threshold=1000)
# None = cv2.faceFaceRecognizer.train(src, labels )
# 参数的含义如下:
# src: 训练图像,用来学习的人脸图像
# labels: 标签,人脸图像对应的标签。
recognizer.train(images, np.array(labels))
# confidence:大小介于0到20000,只要低于5000都被认为是可靠的结果。
label, confidence = recognizer.predict(predict_image)
# 打印识别结果
print("识别标签label=", label)
print("置信度confidence=", confidence)
代码结果: