Fisherfaces原理
PAC方法是EigenFaces人脸识别的核心,它找到了最大化数据总方差特征的线性组合。但是其具有明显的缺点,在操作过程中会损失许多人脸的特征信息。因此在某些特殊的情况下,如果损失的信息刚好是用于分类的关键信息,必然导致结果预测错误。
Fisherfaces采用LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。线性判别分析最早由Fisher在1936年提出,是一种经典的线性学习方法,也被称为“Fisher判别分析法”。
其基本原理:在低维表示下,相同的类应该紧密地聚集在一起;不同的类别应该尽可能地分散开,并且它们之间的距离尽可能地远。简单的概括,线性判别分析就是尽力满足以下两个要求:
- 类别间的差别尽可能地大
- 类别内的差别尽可能地小
做线性判别分析时,首先将训练集样本集投影到一条直线A上,让投影后的点满足:
- 同类间的点尽可能地靠近
- 异类间的点尽可能地远离
做完投影后,将待测样本投影到直线A上,根据投影点的位置判定样本的类别,就完成了人脸识别。
Fisherfaces实现人脸识别
在OpenCV中,通过函数cv2.face.FisherFaceRecognizer_create()生成Fisherfaces识别器实例模型,然后应用cv2.face_FaceRecognizer.train()函数完成训练,最后用cv2.face_FaceRecognizer.predict()函数完成人脸识别。
因为Fisherfaces人脸识别步骤与LBPH、EigenFaces代码步骤一模一样,所以我们直接实战通过Fisherfaces实现人脸识别。具体代码如下所示:
images = []
images.append(cv2.imread("42_1.jpg", cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("42_2.jpg", cv2.IMREAD_GRAYSCALE))
labels = [0, 1]
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels))
predict_image = cv2.imread('42_4.jpg', cv2.IMREAD_GRAYSCALE)
label, confidence = recognizer.predict(predict_image)
if label == 0:
print("匹配的人脸为尼根")
elif label == 1:
print("匹配的人脸为瑞克")
print("confidence=", confidence)
运行之后,控制台输出如下:
通过Fisherfaces进行人脸识别,其confidence返回值也在0到20000之间,只要低于5000,都被认为是相当可靠的识别结果。这里,0就是完全匹配。
训练图像:
测试图像: