文章目录

  • 1 Eigenfaces
    • 1.1 建模流程
    • 1.2 示例代码
  • 2 Fisherfaces
    • 2.1 建模流程
    • 2.2 示例代码
  • 3 Local Binary Histogram
    • 3.1 建模流程
    • 3.2 示例代码

OpenCV 提供了三种人脸识别方法:

  1. Eigenfaces

Eigenfaces是一种基于PCA(Principal Component Analysis,主成分分析)的人脸识别方法,属于OpenCV中的特征脸方法之一。该方法将人脸图像转换为低维的特征向量,使用PCA降维的方式提取出训练集中的主成分特征,进而提取出人脸图像的特征向量。在进行识别时,通过比较输入图像与训练集中每个图像的特征向量的相似度来判断其所属的人脸类别。

  1. Local Binary Patterns Histograms (LBPH)

LBPH 是一种基于局部二值模式(Local Binary Pattern)的人脸识别方法,它将每个像素与周围的像素进行比较,计算出每个像素点的二进制编码,再将编码串联起来形成一个局部特征。LBPH 的优点是对于图像的旋转、缩放和灰度变化等不敏感,但对于遮挡和表情变化等因素的鲁棒性还有待提高。

  1. Fisherfaces

Fisherfaces 是一种基于线性判别分析(Linear Discriminant Analysis)的人脸识别方法,它通过将图像投影到低维空间,将图像从高维特征向量转换为低维特征向量,并使用低维特征向量进行分类。Fisherfaces 的优点是对于光照、表情变化等因素的鲁棒性很强,但对于遮挡的鲁棒性还有待提高。

1 Eigenfaces

Eigenfaces 是一种基于主成分分析(Principal Component Analysis, PCA)的人脸识别方法,它是最早的、也是最简单的人脸识别方法之一。

Eigenfaces 方法将每个人脸图像看作一个高维向量,通过对这些向量进行 PCA 变换,得到一组特征向量(也称为 eigenfaces),并将每个人脸图像投影到这组特征向量上,从而将高维的人脸数据降维到一个低维的特征空间中,进而实现人脸识别。

1.1 建模流程

首先,通过cv2.face.EigenFaceRecognizer_create()创建Eigenfaces识别器:

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

其中,可选参数num_components表示PCA保留的特征数量,默认为0,即保留所有特征。可选参数threshold表示一个阈值,当人脸图像与训练数据的差异小于该阈值时,认为这是同一个人。默认值为0,表示不使用阈值。

该方法返回一个EigenFaceRecognizer对象,可以使用其train()方法进行训练,predict()方法进行预测,save()load()方法保存和加载模型。

随后,进行训练:

cv2.face.EigenFaceRecognizer_create().train(src, labels)
或
EigenFaceRecognizer.train(src, labels)

其中,

  • src:训练数据,可以是一个列表或一个 NumPy 数组,其中每个元素都是包含人脸图像的数组。
  • labels:与训练数据对应的标签,传入的一个 NumPy 数组,其中每个元素都是一个整数标签,表示训练数据中对应人脸的身份信息。

该函数不返回任何值,训练后的识别器会保存在类实例中,可以通过调用 cv2.face.EigenFaceRecognizer_create().predict() 函数使用它。

最后,使用模型进行预测:

label, confidence = recognizer.predict(src)

recognizer.predict(src)函数是使用已经训练好的人脸识别器对输入的人脸图像进行识别。它接收一个参数src,即待识别的人脸图像。该函数返回两个值:

  • label:表示识别结果对应的人脸标签,通常是一个整数。
  • confidence:表示识别结果的置信度或准确度。值越小表示置信度越高,一般情况下,评分小于5000就可以认为匹配度高,评分为0则为完全一样。

1.2 示例代码

下面提供一个代码脚本,大概的流程为:

  1. 定义一个空列表 photos 和一个空列表 labels
  2. 使用 OpenCV 中的 cv2.imread() 函数读取一组人脸图像,并将其添加到 photos 列表中。每张图像都有一个对应的标签,表示这张图像属于哪个人。
  3. 创建一个字典 names,将每个标签与对应的人名关联起来。
  4. 使用 OpenCV 中的 cv2.face.EigenFaceRecognizer_create() 函数创建一个特征脸识别器。
  5. 使用 recognizer.train() 函数训练识别器,让其学会如何识别这组人脸图像。
  6. 读取一张待识别的人脸图像,并使用 recognizer.predict() 函数对其进行识别。该函数返回一个标签和一个置信度评分。
  7. 打印出评分和对应的人名。

训练数据网上可以较为容易的找到,也可以博客下面留言获取。

import cv2
import numpy as np  photos = list()
lables = list()
photos.append(cv2.imread("第一张图象地址,后面依此类推", 0))
lables.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread("", 0))
lables.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread("", 0))
lables.append(0)  # 第3张图像对应的标签  photos.append(cv2.imread("", 0))
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread("", 0))
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread("", 0))
lables.append(1)  # 第6张图像对应的标签  names = {"0": "张三", "1": "李四"}  # 标签对应的名称字典  recognizer = cv2.face.EigenFaceRecognizer_create()  # 创建特征脸识别器
recognizer.train(photos, np.array(lables))  # 识别器开始训练  i = cv2.imread("待识别.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字
cv2.waitKey()
cv2.destroyAllWindows()

其运行结果为;

2 Fisherfaces

Fisherfaces 是一种基于线性判别分析(Linear Discriminant Analysis, LDA)的人脸识别方法,它是 Eigenfaces 方法的改进版本。

Fisherfaces 通过寻找最佳的投影方向(线性变换),将高维的人脸数据投影到一个低维的特征空间中,从而实现人脸识别。与 Eigenfaces 不同的是,Fisherfaces 不仅仅考虑样本之间的距离,还考虑了样本所属的类别之间的距离,因此更加适用于多类别人脸识别。

Fisherfaces 方法与 Eigenfaces 方法相比,具有更高的识别率和更好的鲁棒性,但计算成本较高。

2.1 建模流程

OpenCV的各模型建模流程相同,除

recognizer = cv2.face.EigenFaceRecognizer_create()
# 需要改成
recognizer = cv2.face.FisherFaceRecognizer_create()

其余均不需更改。

2.2 示例代码

示例代码与1.2中基本完全相同,需要更改的就是2.1中提到的部分。
更改方法后,运行结果为:

此处看出这个模型的confidence较高,也就是对结果更没有信心,其原因可能是因为 Fisherfaces 方法对样本数据的数量和质量的要求较高,以及对输入图像的光照、姿态、表情等变化更加敏感。

具体来说,Fisherfaces 方法需要在训练集中包含足够多的样本,并且每个样本需要具有代表性,才能够获得较好的分类效果。此外,Fisherfaces 方法对于输入图像的光照、姿态、表情等变化比较敏感,这些因素会影响特征向量的提取和分类结果的准确性,从而降低置信度。

相比之下,Eigenfaces 方法虽然对于样本数量和质量的要求不高,也比较容易实现,但其在人脸识别方面的分类能力和鲁棒性较差,因此在某些情况下可能会出现识别错误的情况,从而导致置信度较低。

3 Local Binary Histogram

3.1 建模流程

Local Binary Histogram(LBH)是一种基于局部二值模式(Local Binary Pattern, LBP)的人脸识别方法。与前面提到的基于 PCA 或 LDA 的人脸识别方法不同,LBH 方法直接利用局部纹理特征进行人脸识别,具有较好的鲁棒性和识别精度。

具体来说,LBH 方法通过以下步骤实现人脸识别:

  1. 对于每个人脸图像,将其分成若干个局部区域,并计算每个局部区域的 LBP 特征。

  2. 将每个局部区域的 LBP 特征用直方图统计的方法转换为一个向量。

  3. 将每个人脸图像的局部区域 LBP 特征向量组合成一个全局的特征向量,并将其归一化。

  4. 对于测试集中的每个人脸图像,同样将其分成若干个局部区域,并计算每个局部区域的 LBP 特征。将每个局部区域的 LBP 特征向量用直方图统计的方法转换为一个向量,并将这些向量组合成一个测试集的全局特征向量。

  5. 计算训练集中每个人脸图像的全局特征向量与测试集中人脸图像的全局特征向量之间的距离,将距离最小的训练集中的人脸图像所属的类别作为测试集中人脸图像的识别结果。

相比于传统的基于 PCA 或 LDA 的人脸识别方法,LBH 方法更加鲁棒,能够更好地应对光照、姿态、表情等变化,同时具有较高的识别率和较低的计算成本,因此被广泛应用于人脸识别和相关领域。

3.2 示例代码

此处需要更改的部分:

recognizer = cv2.face.LBPHFaceRecognizer_create()

此处因计算方法不同,需注意返回值confidence的含义与前两者不同。
此模型的返回值,小于50认为匹配度较高,0则为完全一样。

代码的输出为:

11 OpenCV图像识别之人脸识别相关推荐

  1. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  2. python dlib opencv人脸识别准确度_基于dlib和opencv库的人脸识别

    基于dlib和opencv库的人脸识别 需下载68个特征点的人脸检测模型: http://dlib.net/files/ 文件名为shape_predictor_68_face_landmarks.d ...

  3. OpenCV+百度云人脸识别项目及源码

    OpenCV+百度云人脸识别项目及源码 1.需要的硬件环境 虚拟机 带有摄像头的电脑 2.整体项目的框架 用Opencv识别人脸,上传百度云进行识别对比 3.虚拟机上需要装的库 sudo apt-ge ...

  4. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)

    基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...

  5. 使用openCV进行视频人脸识别

    视频人脸识别系列 第一篇 使用openCV进行视频人脸识别 第二篇 使用虹软SDK进行视频人脸识别 第三篇 使用虹软SDK进行视频人脸比对 文章目录 视频人脸识别系列 前言 一.环境搭建 开发环境 配 ...

  6. dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪

    文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...

  7. 基于 OpenCV + Python 的人脸识别上课签到系统

    目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py (3)采集人脸图像 (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1) ...

  8. 【毕业设计/课程设计】基于opencv的高精度人脸识别考勤系统设计与实现

    文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 程序运行结果测试与分析 5 实验心得 6 项目源码 0 项目说明 基于opencv的高精度人脸识别考勤系统设计与实现 提示:适合用 ...

  9. 基于Opencv快速实现人脸识别(图片识别)

    两个文件夹,一个为训练数据集,一个为测试数据集,训练数据集中有两个文件夹0和1,之前看一些资料有说这里要遵循"slabel"命名规则,但后面处理起来比较麻烦,因为目前opencv接 ...

最新文章

  1. Yii2 操作不同的数据库
  2. [Dynamic Language] Python 静态方法、类方法、属性
  3. 每日一皮:男性同胞,是时候反击了!
  4. iis7.5php.2,Windows2008 IIS7.5搭建PHP5.2
  5. mysql创建数据库指定字符集
  6. 机器人总动员中的小草_机器人总动员读后感
  7. php [ext/gd/gd.lo] error 1,关于PHP一些编译安装出现的错误总结
  8. 什么?你竟然还没有用这几个chrome插件? 1
  9. 面向对象——抽象基类
  10. 快慢指针在数组中的应用
  11. EverMonkey-VSCode上最好用的印象笔记插件
  12. 接口:基于FPGA的HDMI接口设计
  13. 现代检测技术-测量误差和处理
  14. 浏览器阻挡cookies_如何在任何浏览器中阻止Cookies(除了您使用的网站外) | MOS86...
  15. SAP基本计量单位更改
  16. python pil image_Python PIL的Image模块
  17. Vmware+Ubuntu18.04配置桥接模式,并解决虚机中网络慢的问题
  18. asd激光粒度仪测试原理是什么解答
  19. 服务器管理员账号sa,一次利用MSSQL的SA账户提权获取服务器权限
  20. c语言画笔的使用方法,新手必看:Photoshop笔刷画笔工具基本使用教程

热门文章

  1. 发视频抖音快手热门时间段是多少
  2. rtsp端口号_设置RTSP, RTP和RTCP端口号 | 学步园
  3. 原型链继承和构造函数继承
  4. Jlink无法连接及升级后提示Jlink Clone解决方案
  5. 【李开复】给中国学生的第六封信——选择的智慧(六)
  6. 2021年您应该知道的技术之一!互联网寒冬下(1)
  7. linux驱动实例之74HC595
  8. 星云大师:青年人应有的爱情观
  9. 虚拟机下Linux系统的安装及项目部署详解
  10. C++ Builder 全部API函数列表