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,一经查实,立即删除!

相关文章

【ARM64 常见汇编指令学习 18 -- ARM64 TST 指令与 条件标志位 Z】

文章目录 回顾零标志位ZTST 测试指令 上篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 下篇文章:ARM64 常见汇编指令学习 19 – ARM64 BEQ与B.EQ的区别 回顾零标志位Z 在ARMv8架构中,标志位Z(Zero)是条件码寄存…

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%的咨询工作量

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

day1:前端缓存问题

❝ 「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。篇幅不会过长,方便理解和记忆。 ❞ ❝ 「主要面向群体:」前端开发工程师(初、中、高级)、应届、转行、培训等同学 ❞ Day…

【数据治理】WKC+Minio+Airflow --20230821(链接)

https://blog.csdn.net/m0_46629123/article/details/132413616

docker安装es8.x及elasticSearch8部分api使用

docker中安装es8 1、es8的tar下载地址: tar包下载地址) 2、docker load -i es-name 3、docker run -d --name elasticsearch-8.6.2 -e ES_JAVA_OPTS“-Xms256m -Xmx256m” -p 9200:9200 -p 9300:9300 -e “discovery.typesingle-node” elasticsearch:8.6.2 4、8开始以后不支持…

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、现在我们先画一张表,分析…

从FLIR热像仪图像中读取温度和原始照片: Python处理与应用的深入解析

第一部分:FLIR热像仪图像简介与Python环境准备 热像仪是一种可以检测辐射热量的设备,并将其转换为可视图像。FLIR(Forward Looking Infrared)热像仪是市面上的主导品牌之一,被广泛应用于各种场景,例如医学、军事和消费电子产品。其输出的图像不仅仅是我们看到的彩色或灰…

cUrl的介绍和基本使用

cURL 如果你在开发接口的时候,需要调试。那么cUrl将是你必备的技能。也许你用过postman,但这个未免太重量级了。curl将会是你最佳轻量级,调试接口的工具😀 1.Curl函数的基本选项✨ 1.1 --request和 -x —request 和 -X 指定与HTTP服务器通信…

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…

软件测试-测试策略

版本1 测试策略 目录 版本1​​​​​​​测试策略 版本2测试策略 一、版本分析 测试-----6天 预发----2天 1、XXX业务1 2、XXX业务2 3、XXX业务3 二、测试策略 测试类型分析方向测试目标及用例参考是否需要测试测试结论备注功能测试对比测试用例和策划文档,评估…

【目标检测中对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相…

数据库设计规范

数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。 一、数据库设…

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

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

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

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