win10+Python3.7.3+OpenCV3.4.1入门学习( 二十三章 人脸识别)———— 23.3 EigenFaces人脸识别

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

23.3 EigenFaces人脸识别

EigenFaces通常也被称为特征脸,它使用主成分分析(Principal Component Analysis, PCA)方法将高维的人脸数据处理为低维数据后(降维),再进行数据分析和处理,获取识别结果。

23.3.1 基本原理

在现实世界中,很多信息的表示是有冗余的。例如,下表所列出的一组圆的参数中就存在冗余信息。
在这里插入图片描述

在表所示的参数中,各个参数之间存在着非常强的相关性:
● 直径=2半径
● 周长=2
π半径
● 面积=π
半径*半径
可以看到,直径、周长和面积都可以通过半径计算得到。
在进行数据分析时,如果我们希望更直观地看到这些参数的值,就需要获取所有字段的值。但是,在比较圆的面积大小时,仅使用半径就足够了,此时其他信息对于我们来说就是“冗余”的。
因此,我们可以理解“半径”就是表中所列数据中的“主成分”,我们将“半径”从上述数据中提取出来供后续分析使用,就实现了“降维”。
当然,上面例子的数据非常简单、易于理解,而在大多数情况下,我们要处理的数据是比较复杂的。很多时候,我们可能无法直接判断哪些数据是关键的“主成分”,所以就要通过PCA方法将复杂数据内的“主成分”分析出来。
EigenFaces就是对原始数据使用PCA方法进行降维,获取其中的主成分信息,从而实现人脸识别的方法。

23.3.2 函数介绍

OpenCV通过函数cv2.face.EigenFaceRecognizer_create()生成特征脸识别器实例模型,然后应用cv2.face_FaceRecognizer.train()函数完成训练,最后用cv2.face_FaceRecognizer.predict()函数完成人脸识别。
1.函数cv2.face.EigenFaceRecognizer_create()
函数cv2.face.EigenFaceRecognizer_create()的语法格式为:

retval = cv2.face.EigenFaceRecognizer_create( [, num_components[, threshold]] )

式中的两个参数都是可选参数,含义如下:
● num_components:在PCA中要保留的分量个数。当然,该参数值通常要根据输入数据来具体确定,并没有一定之规。一般来说,80个分量就足够了。
● threshold:进行人脸识别时所采用的阈值。
2.函数cv2.face_FaceRecognizer.train()
函数cv2.face_FaceRecognizer.train()对每个参考图像进行EigenFaces计算,得到一个向量。每个人脸都是整个向量集中的一个点。该函数的语法格式为:

None = cv2.face_FaceRecognizer.train( src, labels )

式中各个参数的含义为:
● src:训练图像,用来学习的人脸图像。
● labels:人脸图像所对应的标签。
该函数没有返回值。
3.函数cv2.face_FaceRecognizer.predict()
函数cv2.face_FaceRecognizer.predict()在对一个待测人脸图像进行判断时,会寻找与当前图像距离最近的人脸图像。与哪个人脸图像最接近,就将待测图像识别为其对应的标签。该函数的语法格式为:

label, confidence = cv2.face_FaceRecognizer.predict( src )

式中各个参数及返回值的含义为:
● src:需要识别的人脸图像。
● label:返回的识别结果标签。
● confidence:返回的置信度评分。置信度评分用来衡量识别结果与原有模型之间的距离。0表示完全匹配。该参数值通常在0到20000之间,只要低于5000,都被认为是相当可靠的识别结果。注意,这个范围与LBPH的置信度评分值的范围是不同的。

23.3.3 案例介绍

本节使用OpenCV的EigenFaces模块实现一个简单的人脸识别示例。

eg1:使用EigenFaces模块完成一个简单的人脸识别程序。
本例中用于学习的4幅人脸图像如下图所示,从左到右图像的名称分别为e01.png、e02.png、e11.png、e12.png。

在这里插入图片描述
这4幅图像中,前两幅图像是同一个人,将其标签设定为“0”;后两幅图像是同一个人,将其标签设定为“1”。
待识别的人脸图像如下图所示,该图像的名称为eTest.png。
在这里插入图片描述

根据题目的要求,编写代码如下:

import cv2
import numpy as np
images=[]
images.append(cv2.imread("e01.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("e02.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("e11.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("e12.png",cv2.IMREAD_GRAYSCALE))
labels=[0,0,1,1]
#print(labels)
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer.train(images, np.array(labels))  
predict_image=cv2.imread("eTest.png",cv2.IMREAD_GRAYSCALE)
label,confidence= recognizer.predict(predict_image) 
print("label=",label)
print("confidence=",confidence)

运行上述程序,识别结果为:

label= 0
confidence= 1592.4971123726827

从输出结果可以看到,eTest.png被识别为标签“0”所对应的人脸图像,即认为图像eTest.png与图像e01.png、e02.png中的是同一个人。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值