美文网首页
Fisherfaces人脸识别---OpenCV-Python开

Fisherfaces人脸识别---OpenCV-Python开

作者: 极客学编程 | 来源:发表于2021-05-14 21:30 被阅读0次

    Fisherfaces原理

    PAC方法是EigenFaces人脸识别的核心,它找到了最大化数据总方差特征的线性组合。但是其具有明显的缺点,在操作过程中会损失许多人脸的特征信息。因此在某些特殊的情况下,如果损失的信息刚好是用于分类的关键信息,必然导致结果预测错误。

    Fisherfaces采用LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。线性判别分析最早由Fisher在1936年提出,是一种经典的线性学习方法,也被称为“Fisher判别分析法”。

    其基本原理:在低维表示下,相同的类应该紧密地聚集在一起;不同的类别应该尽可能地分散开,并且它们之间的距离尽可能地远。简单的概括,线性判别分析就是尽力满足以下两个要求:

    1. 类别间的差别尽可能地大
    2. 类别内的差别尽可能地小

    做线性判别分析时,首先将训练集样本集投影到一条直线A上,让投影后的点满足:

    1. 同类间的点尽可能地靠近
    2. 异类间的点尽可能地远离

    做完投影后,将待测样本投影到直线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)
    

    运行之后,控制台输出如下:


    1.png

    通过Fisherfaces进行人脸识别,其confidence返回值也在0到20000之间,只要低于5000,都被认为是相当可靠的识别结果。这里,0就是完全匹配。

    训练图像:


    42_1.jpg 42_2.jpg

    测试图像:


    42_4.jpg

    相关文章

      网友评论

          本文标题:Fisherfaces人脸识别---OpenCV-Python开

          本文链接:https://www.haomeiwen.com/subject/dpkelltx.html