OpenCV人脸检测的EigenFaces方法缺点在于操作过程中会损失许多特征信息。Fisherface采用LDA(线性判别分析)实现人脸识别,是一种经典学习方法。

基本原理

线性判别分析在对特征降维的同时考虑类别信息,其思路是:在低维表示下,相同的类应该紧密地聚集在一起;不同的类别应该尽可能地分开。

  • 类别间的差别尽可能的大
  • 类别内的差别尽可能小

例如下面的一幅图里,需要找一条直线,让所有的训练样本满足同类的距离最近,异类的距离最远

训练的样本集,圆形一类,方形一类

找了两条直线,分别是L1与L2,将样本分别投影到这两条线上,

投影实例

  • A、B组内的点之间的距离尽可能地靠近
  • C的两端点之间的距离尽可能远

Fisherfaces相关函数

1、函数cv2.face.FisherFaceRecognizer_create()

retval = cv2.face.FisherFaceRecognizer_create( [,num_components[, threshold]] )
  • num_components:使用 Fisherfaces 准则进行线性判别分析时保留的成分数量。 可以采用默认值“0”, 让函数自动设置合适的成分数量。
  • threshold:进行识别时所用的阈值。如果最近的距离比设定的阈值 threshold 还要大,函数会返回“-1”。

2、函数cv2.face_FaceRecognizer.train()

None = cv2.face_FaceRecognizer.train( src, labels )
  • src:训练图像
  • labels:人脸标签

3、函数cv2.face_FaceRecognizer.predict()

label, confidence = cv2.face_FaceRecognizer.predict( src )
  • src:需要识别的人脸图像。
  • label:返回的识别结果的标签。
  • confidence: 置信度评分。置信度评分用来衡量识别结果与原有模型之间的距离。 0 表示完全匹配。该值通常在 0 到 20 000 之间, 若低于 5000,就认为是相当可靠的识别结果。

案例演示

import cv2
import numpy as np

images=[]
images.append(cv2.imread("f01.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f02.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f11.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("f12.png",cv2.IMREAD_GRAYSCALE))

labels=[0,0,1,1]
#print(labels)

recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels))  
predict_image=cv2.imread("fTest.png",cv2.IMREAD_GRAYSCALE)
label,confidence= recognizer.predict(predict_image) 

print("label=",label)
print("confidence=",confidence)

运行结果:

label= 0
confidence= 92.5647623298737

结果就不再过多解释。


实验素材:

f02

f11

f12

f01

fTest


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


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/CVfisher.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏