opencv 进阶13-Fisherfaces 人脸识别-函数cv2.face.FisherFaceRecognizer_create()

Fisherfaces 人脸识别

PCA 方法是 EigenFaces 方法的核心,它找到了最大化数据总方差特征的线性组合。不可否认,EigenFaces
是一种非常有效的方法,但是它的缺点在于在操作过程中会损失许多特征信息。

因此,在一些情况下,如果损失的信息正好是用于分类的关键信息,必然会导致无法完成分类。Fisherfaces 采用 LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。线性判别识别最早由 Fisher 在 1936 年提出,是一种经典的线性学习方法,也被称为“Fisher 判别分析法”。

基本原理

线性判别分析在对特征降维的同时考虑类别信息。其思路是:在低维表示下,相同的类应该紧密地聚集在一起;不同的类别应该尽可能地分散开,并且它们之间的距离尽可能地远。简单地说,线性判别分析就是要尽力满足以下两个要求:

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

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

  • 同类间的点尽可能地靠近。
  • 异类间的点尽可能地远离。

做完投影后,将待测样本投影到直线 A 上,根据投影点的位置判定样本的类别,就完成了识别。

例如,图 23-13 所示的是一组训练样本集。现在需要找到一条直线,让所有的训练样本满足:同类间的距离最近,异类间的距离最远。

在这里插入图片描述

图 23-14 的左图和右图中分别有两条不同的投影线 L1 和 L2,将图 23-13 中的样本分别投影到这两条线上,可以看到样本集在 L2 上的投影效果要好于在 L1 上的投影效果。

在这里插入图片描述
线性判别分析就是要找到一条最优的投影线。以图 23-14 中右图投影为例,要满足:

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

找到一条这样的直线后,如果要判断某个待测样本的分组,可以直接将该样本点向投影线投影,然后根据投影点的位置来判断其所属类别。

例如,在图 23-15 中,三角形样本点 U 向投影线投影后,其投影点落在圆点的投影范围内,则认为待测样本点 U 属于圆点所在的分类。

在这里插入图片描述

函数介绍

OpenCV 中,通过函数 cv2.face.FisherFaceRecognizer_create()生成 Fisherfaces 识别器实例模型,然后应用 cv2.face_FaceRecognizer.train()函数完成训练,用 cv2.face_FaceRecognizer.predict()函数完成人脸识别。

  1. 函数cv2.face.FisherFaceRecognizer_create()
    函数 cv2.face.FisherFaceRecognizer_create()的语法格式为:

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

式中的两个参数都是可选参数,它们的含义为:

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

函数 cv2.face_FaceRecognizer.train()对每个参考图像进行 Fisherfaces 计算,得到一个向量。
每个人脸都是整个向量集中的一个点。该函数的语法格式为:

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

式中各个参数的含义为:

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

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

式中的参数与返回值的含义为:

  • src:需要识别的人脸图像。
  • label:返回的识别结果的标签。
  • confidence:置信度评分。置信度评分用来衡量识别结果与原有模型之间的距离。0 表示完全匹配该值通常在 0 到 20 000 之间,若低于 5000,就认为是相当可靠的识别结果。需要注意,该评分值的范围与 EigenFaces 方法的评分值范围一致,与 LBPH 方法的评分值范围不一致。

示例:使用 FisherFaces 完成一个简单的人脸识别程序


import cv2
import numpy as np
images=[]
img1= cv2.imread("face\\face2.png",cv2.IMREAD_GRAYSCALE);
img1.resize((240,240))
images.append(img1)img2= cv2.imread("face\\face3.png",cv2.IMREAD_GRAYSCALE);
img2.resize((240,240))
images.append(img2)img3= cv2.imread("face\\face4.png",cv2.IMREAD_GRAYSCALE);
img3.resize((240,240))
images.append(img3)img4= cv2.imread("face\\face5.png",cv2.IMREAD_GRAYSCALE);
img4.resize((240,240))
images.append(img4)labels=[0,0,1,1]
#print(labels)
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels)) # 识别器训练
predict_image=cv2.imread("face\\face6.png",cv2.IMREAD_GRAYSCALE)
predict_image.resize((240,240))
label,confidence= recognizer.predict(predict_image)
print("label=",label)
print("confidence=",confidence)

运行结果:

label= 0
confidence= 1034.0276952694567

从结果中可以看出,他的准确度又比EigenFaces 人脸识别对比的化准确多了。

常见的OpenCV人脸算法以及它们的对比

Haar Cascade人脸检测(查找):
Haar Cascade是一种传统的人脸检测算法,它基于特征的级联分类器。尽管速度较快,但对于一些角度、光照和遮挡变化较大的情况,可能表现不够稳定和准确。

Dlib人脸检测和识别:
Dlib库提供了基于HOG特征的人脸检测和深度学习的人脸识别。Dlib在不同角度和轻微遮挡下有良好的检测性能。它还可以进行人脸特征点检测,如眼睛、嘴巴等。

深度学习模型:(后续讲解)
OpenCV也集成了一些深度学习模型用于人脸检测和识别,如基于CNN的人脸检测器和基于深度学习的人脸识别算法。这些模型通常在大规模数据集上进行了训练,具有更高的准确性,但可能需要更多的计算资源。

LBPH人脸识别:(应用少)
局部二值模式直方图(LBPH)是一种基于纹理的人脸识别算法,适用于小规模数据库。它不需要大量的训练数据,但在复杂场景下可能性能较差。

Eigenfaces和Fisherfaces:
Eigenfaces和Fisherfaces是基于PCA和LDA的经典人脸识别算法。它们在某些情况下可能表现出色,但在复杂环境中可能不如深度学习模型。

在选择OpenCV人脸算法时,需要考虑以下因素:

准确性: 算法的准确性是否满足你的应用需求?
速度: 算法的执行速度是否足够快?
复杂度: 算法的实现和使用是否容易?
数据规模: 你的数据集是大还是小?
场景: 你的应用场景中是否有遮挡、光照变化等因素?

一般来说,对于复杂的人脸检测和识别问题,深度学习模型可能会更加准确,但也需要更多的计算资源。对于一些简单的应用,传统的方法如Haar Cascade或Dlib可能已经足够。选择适合自己应用的算法需要根据具体情况进行权衡和评估。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PSP - 开源可训练的蛋白质结构预测框架 OpenFold 的环境配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132334671 Paper: OpenFold: Retraining AlphaFold2 yields new insights into its learning mechanisms and capacity for generalization Open…

制作电商网站帮助中心,节省60%的咨询工作量

随着电子商务的快速发展,越来越多的企业选择在网上建立自己的电商平台。然而,一旦电商网站上线,就会面临一系列的问题和挑战。其中一个重要问题是如何有效管理和解答大量用户的咨询和问题,这对于提高用户体验和促进销售至关重要。…

YOLOv5、v8改进:引入SKAttention注意力机制

目录 1.简介 2.YOLOv5改进 2.1增加以下SKAttention.yaml文件 2.2common.py配置 2.3yolo.py配置 1.简介 论文链接:https://arxiv.org/pdf/1903.06586.pdf 最近对卷积神经网络中的“自适应调整感受野”这样的操作很感兴趣,从字面的意思可以理解&…

Spring练习---28 (用户表和角色表分析,角色列表展示,角色层和Dao层的设置,页面展示操作)

84、下面进入我们的业务层面,进入我们的业务层面我们先分析一个东西,我们要分析用户和角色的关系,因为我们只有在分析完用户和角色之间的关系后,我们才知道表的关系,实体的关系 85、现在我们先画一张表,分析…

Apache Doris IP变更问题详解

Apache Doris IP变更问题详解 一、背景二、环境硬件信息软件信息 三、FE恢复3.1 异常日志3.2 获取当前ip3.3 重置ip信息3.4 重置元数据记录3.5 元数据模式恢复3.6 重置fe集群节点3.7 关闭元数据模式重启fe 四、BE恢复4.1 获取当前ip4.2 重置ip信息4.3 重置be集群节点 一、背景 …

vue3 基础知识

vue3创建一个项目 PS D:\code> npm init vuelatestVue.js - The Progressive JavaScript Framework√ Add TypeScript? ... No / Yes √ Add JSX Support? ... No / Yes √ Add Vue Router for Single Page Application development? ... No / Yes √ Add Pinia for sta…

WordPress用于您的企业网站的优点和缺点

如今,WordPress 被广泛认为是一个可靠、可扩展且安全的平台,能够为商业网站提供支持。然而,许多人质疑 WordPress 是否是适合企业的平台。 这就是我们创建本指南的原因。通过探索 WordPress 的优点和缺点,您可以确定世界上最受欢…

linux部署kafka3.5.1(单机)

一、下载jdk17 kafka3.x版本需要jdk11以上版本才能更好的兼容,jdk11、jdk17都是LTS长期维护版本,而且jdk17支持springboot3.x,所以我选择了openjdk17。 下载地址: Archived OpenJDK GA Releaseshttps://jdk.java.net/archive/ 二、上传jdk安装包解压 …

PHP加密与安全的最佳实践

PHP加密与安全的最佳实践 概述 在当今信息时代,数据安全是非常重要的。对于开发人员而言,掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言,提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…

【目标检测中对IoU的改进】GIoU,DIoU,CIoU的详细介绍

文章目录 1、IoU2、GIoU(Generalized Intersection over Union)3、DIoU4、CIoU 1、IoU IoU为交并比,即对于pred和Ground Truth:交集/并集 1、IoU可以作为评价指标使用,也可以用于构建IoU loss 1 - IoU 缺点: 2、对于pred和GT相…

Android Studio导入项目需要做的一些配置

点击项目结构 选择本地安装的SDK、NDK目录 选择java版本 重新加载项目 Clean Project Rebuild Project 选择要构建的版本 可选debug和release 打包apk安装包 打包完成,就可以安装到安卓手机了

【2023最新爬虫】用python爬取知乎任意问题下的全部回答

老规矩,先上结果: 爬取了前200多页,每页5条数据,共1000多条回答。(程序设置的自动判断结束页,我是手动break的) 共爬到13个字段,包含: 问题id,页码,答主昵称,答主性别,…

Java虚拟机(JVM):堆溢出

一、概念 Java堆溢出(Java Heap Overflow)是指在Java程序中,当创建对象时,无法分配足够的内存空间来存储对象,导致堆内存溢出的情况。 Java堆是Java虚拟机中用于存储对象的一块内存区域。当程序创建对象时&#xff0c…

Maven之JDK编译问题

IDEA Maven 默认使用 JDK 1.5 编译问题 IDEA 在「调用」maven 时,IDEA 默认都会采用 JDK 1.5 编译,不管你安装的 JDK 版本是 JDK 7 还是 JDK 8 或者更高。这样一来非常不方便,尤其是时不时使用 JDK 7/8 的新特性时。如果使用新特性&#xff…

智能监控系统的守护者:人工智能行为识别技术的崛起与发展

人工智能助力监控系统:行为识别在安全监控中的应用与挑战 摘要: 随着人工智能技术的快速发展,行为识别在监控系统中的应用逐渐成为安全监控领域的重要工具。本文将详细探讨人工智能行为识别技术在监控系统中的应用,以及在实际应用…

乖宝宠物上市,能否打破外资承包中国宠物口粮的现实

近日,乖宝宠物上市了,这是中国宠物行业成功挂牌的第三家公司。同时,昨日,宠物行业最大的盛事“亚洲宠物展”时隔3年,于昨日在上海成功回归。 这两件事情的叠加可谓是双喜临门,行业能够走到今天实属不易&…

报道 | 9月国际运筹优化会议汇总

封面图来源: https://www.pexels.com/zh-cn/photo/1181406/ 九月召开会议汇总: The 96th meeting of the EURO Working Group on Multiple Criteria Decision Aiding (EWG-MCDA) Location: Paris, France Important dates: Conference: September 202…

STP生成树协议

一、STP是什么 STP协议概述生成树协议(spanning tree protocol),是一种工作在OSI网络模型中第二层(数据链路层)的通信协议,是一种由交换机运行的,基本应用是防止交换机冗余链路产生的环路,用于确保以太网中无环路的逻辑拓扑结构&…

计算机网络-物理层(三)-信道的极限容量

计算机网络-物理层(三)-信道的极限容量 当信号在信道中传输失真不严重时,在信道的输出端,这些信号可以被识别 当信号在信道中,传输失真严重时,在信道的输出端就难以识别 造成失真的因素 码元传输速率信号传输距离噪声干扰传输媒…

CSS中的transform属性有哪些值?并分别描述它们的作用。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ translate()⭐ rotate()⭐ scale()⭐ skew()⭐ matrix()⭐ scaleX() 和 scaleY()⭐ rotateX()、rotateY() 和 rotateZ()⭐ translateX() 和 translateY()⭐ skewX() 和 skewY()⭐ perspective()⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…