opencv学习:人脸识别FisherFaceRecognizer_create算法的使用

ops/2024/10/22 3:51:39/

FisherFaceRecognizer_create算法

cv2.face.FisherFaceRecognizer_create() 是 OpenCV 中用于创建 FisherFace 人脸识别模型的函数。FisherFace 是一种基于线性判别分析(Linear Discriminant Analysis,LDA)的人脸识别方法。这种方法的核心思想是在低维表示中,使得同一类别的样本尽可能聚集在一起,而不同类别的样本尽可能地分散开来,从而最大化类间距离和最小化类内距离。

函数参数

  • num_components:这是一个可选参数,表示在进行线性判别分析时保留的成分数量。如果设置为0,函数将自动设置合适的成分数量,这通常等于类别数减一(c-1)。
  • threshold:这也是一个可选参数,用于在预测时设置阈值。如果最近邻居的距离大于这个阈值,函数将返回-1,表示识别结果不可靠。

函数用法

使用 cv2.face.FisherFaceRecognizer_create() 创建的识别器可以用于训练和预测。首先,你需要准备一组训练图像和对应的标签,然后使用 train 方法训练模型。训练完成后,可以使用 predict 方法对新的人脸图像进行识别。

代码步骤

初始化一个空列表来存储图像,图像并转换为灰度图,然后调整图像大小为120x180

# 初始化一个空列表来存储图像
images=[]
# 读取图像并转换为灰度图,然后调整图像大小为120x180
a=cv2.imread('hg1.png',0)
a=cv2.resize(a,(120,180))
b=cv2.imread('hg2.png',0)
b=cv2.resize(b,(120,180))
c=cv2.imread('hjh1.png',0)
c=cv2.resize(c,(120,180))
d=cv2.imread('hjh2.png',0)
d=cv2.resize(d,(120,180))
images.append(a)
images.append(b)
images.append(c)
images.append(d)

创建标签列表,与图像列表对应

# 创建标签列表,与图像列表对应
labels=[0,0,1,1]

读取要预测的图像,转换为灰度图,并调整大小

# 读取要预测的图像,转换为灰度图,并调整大小
pre_image=cv2.imread('hg.png',0)
pre_image=cv2.resize(pre_image,(120,180))

创建FisherFace识别器实例,使用图像列表和标签列表训练识别器

# 创建FisherFace识别器实例
recongnizer=cv2.face.FisherFaceRecognizer_create()
# 使用图像列表和标签列表训练识别器
recongnizer.train(images,np.array(labels))

使用训练好的识别器预测要预测的图像的标签和置信度

# 使用训练好的识别器预测要预测的图像的标签和置信度
label,condidence=recongnizer.predict(pre_image)

在原图上添加文本标签

# 在原图上添加文本标签
aa=cv2.putText(cv2.imread('hg.png').copy(),dic[label],(10,30),cv2.FONT_HERSHEY_SIMPLEX,0.9,(0,0,255),2)cv2.imshow('s',aa)

运行结果

完整代码

import cv2  # 导入OpenCV库# 初始化一个空列表来存储图像
images = []# 读取图像并转换为灰度图,然后调整图像大小为120x180
a = cv2.imread('hg1.png', 0)
a = cv2.resize(a, (120, 180))b = cv2.imread('hg2.png', 0)
b = cv2.resize(b, (120, 180))c = cv2.imread('hjh1.png', 0)
c = cv2.resize(c, (120, 180))d = cv2.imread('hjh2.png', 0)
d = cv2.resize(d, (120, 180))# 将调整大小后的图像添加到images列表中
images.append(a)
images.append(b)
images.append(c)
images.append(d)# 创建标签列表,与图像列表对应
labels = [0, 0, 1, 1]# 读取要预测的图像,转换为灰度图,并调整大小
pre_image = cv2.imread('hg.png', 0)
pre_image = cv2.resize(pre_image, (120, 180))# 创建FisherFace识别器实例
recognizer = cv2.face.FisherFaceRecognizer_create()# 使用图像列表和标签列表训练识别器
recognizer.train(images, np.array(labels))# 使用训练好的识别器预测要预测的图像的标签和置信度
label, confidence = recognizer.predict(pre_image)# 创建一个字典来映射标签到对应的类别名称
dic = {0: "hu", 1: "hjh", -1: 'error'}# 打印预测结果和置信度
print('这人是', dic[label])
print('置信度', confidence)# 在原图上添加文本标签
aa = cv2.putText(cv2.imread('hg.png').copy(), dic[label], (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)# 显示添加了文本标签的图像
cv2.imshow('s', aa)# 等待按键,0表示无限等待直到用户按下任意键
cv2.waitKey(0)

局限性

  1. 对光照敏感:FisherFace算法对光照条件比较敏感,不同的光照条件可能会影响人脸特征的提取,从而影响识别的准确性。

  2. 特征损失:在特征提取过程中,可能会损失一些重要的人脸特征信息,这在某些特殊情况下可能会导致识别错误。

  3. 计算复杂度:尽管FisherFace通过LDA降维减少了计算量,但在处理大规模数据集时,计算投影系数和散度矩阵仍然可能非常耗时。

  4. 对姿态变化敏感:FisherFace算法对于人脸的姿态变化较为敏感,侧脸或非正面人脸可能难以被准确识别。

  5. 需要足够训练样本:为了获得较好的识别效果,FisherFace算法需要足够多的训练样本来覆盖不同人脸之间的差异。


http://www.ppmy.cn/ops/127470.html

相关文章

北京大学与长安汽车联合发布TEOcc: 时域增强的多模态占据预测

北京大学与长安汽车联合发布TEOcc: 时域增强的多模态占据预测 Abstract 作为一种新颖的3D场景表示,语义占据(semantic occupancy)在自动驾驶领域引起了广泛关注。然而,现有的占据预测方法主要集中于设计更好的占据表示形式&…

SpringBoot +Vue3前后端分离项目入门基础实例四

项目说明 项项目名称使用框架说明后端项目springboot_vue_element_demoSpringBoot + MyBatis-plus + MySQL完成基本的增删改查操作API前端项目vue-projectVue3 + ElementUI plus + axios界面展示,调用后端API项目文档目录 SpringBoot +Vue3前后端分离项目入门基础实例一 Spri…

「漏洞复现」灵当CRM data/pdf.php 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

持续科技创新 高德亮相2024中国测绘地理信息科技年会

图为博览会期间, 自然资源部党组成员、副部长刘国洪前往高德企业展台参观。 10月15日,2024中国测绘地理信息科学技术年会暨中国测绘地理信息技术装备博览会在郑州召开。作为国内领先的地图厂商,高德地图凭借高精度高动态导航地图技术应用受邀参会。 本…

LeetCode 2379.得到K个黑块的最少涂色次数

题目: 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 W 要么是 B ,表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。 给你一个整数 k ,表示想要 连续 黑色块的数目。 每一次操作中,你可以…

力扣3191.使二进制数全变成1

给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次(也可以 0 次): 选择数组中 任意连续 3 个元素,并将它们 全部反转 。 反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。 请你返回将 nums 中…

Java笔试05

在Java中,final 关键字可以用于修饰类、方法和变量: 修饰类: 被 final 修饰的类不能被继承,即不能有子类。这通常用于工具类或者不希望被扩展的类。 修饰方法: 被 final 修饰的方法不能被子类覆盖。这通常用于确保类…

【软件测试: jmeter工具】OS进程取样器调用python

在jmeter中有时候需要调用自定义函数进行加密、解密等拓展功能 本文通过识别验证码处理登录验证码为例,通过OS进程取样器,调用python函数实现 识别验证码的python函数源码 import base64 from io import BytesIO from PIL import Image import sys im…