python学opencv|读取图像(七十五)人脸识别:Fisherfaces算法和LBPH算法

【1】引言

前序学习进程中,已经掌握了使用Eigenfaces算法进行的人脸识别。相关文章链接为:

python学opencv|读取图像(七十四)人脸识别:EigenFaces算法-CSDN博客

在此基础上,学习剩余两种人脸识别算法:Fisherfaces算法和LBPH算法。

【2】官网教程

实际上,点击下述链接,可以直达三种算法的官网教程:

OpenCV: Face Recognition with OpenCV

对于Fisherfaces算法和LBPH算法,具体的应用流程和Eigenfaces算法一致:先确定用哪种算法后,就建立识别器,然后把样本放入训练器进行训练,最后输出识别效果。

【2.1】Fisherfaces算法

点击下方链接,直达Fisherfaces算法的官网教程:

OpenCV: cv::face::FisherFaceRecognizer Class Reference

在官网,可以看到Fisherfaces算法识别器相关的说明:

图1  cv.face.FisherFaceRecognizer.create算法识别器

具体的,cv.face.FisherFaceRecognizer.create识别器有两个参数:

    cv.face.FisherFaceRecognizer.create(    

    num_components              #可选参数,PCA(主成分分析)中保留分量的个数

    threshold  )                        #可选参数,人脸识别的阈值

【2.2】LBPH算法

点击下方链接,直达LBPH算法的官网教程:

OpenCV: cv::face::LBPHFaceRecognizer Class Reference

在官网,可以看到LBPH算法识别器相关的说明:

图2  cv.face.LBPHFaceRecognizer.create算法识别器 

具体的,cv.face.LBPHFaceRecognizer.create识别器有五个参数:

cv.face.LBPHFaceRecognizer.create(    

radius                            #可选参数,圆形局部二进制模式的半径

neighbors                      #可选参数,圆形局部二进制模式的采样数目

grid_x                            #可选参数,水平方向上的单元格数

grid_y                            #可选参数,竖直方向上的单元格数

threshold    )                  #可选参数,识别用的阈值

【3】代码测试

【3.1】Fisherfaces算法

对使用Fisherfaces算法的人脸识别,和使用Eigenfaces算法的人脸识别在代码上一样,所以可以直接使用先前的代码,只需要改一行旧代码即可:

# 创建人脸识别器
recognizer = cv.face.EigenFaceRecognizer.create()

改后代码为:

# 创建人脸识别器
recognizer = cv.face.FisherFaceRecognizer.create()

不过为了增强对比,这次用了两组图片,所以存储地址的列表变长了:

# 定义图片路径字典,键为标签,值为该标签对应的图片路径列表
image_paths_dict = {0: [r"D:\python\pythonworkspace\pythonProject3\0\01.jpg",r"D:\python\pythonworkspace\pythonProject3\0\02.jpg",r"D:\python\pythonworkspace\pythonProject3\0\03.jpg"],1: [r"D:\python\pythonworkspace\pythonProject3\1\01.jpg",r"D:\python\pythonworkspace\pythonProject3\1\02.jpg",r"D:\python\pythonworkspace\pythonProject3\1\03.jpg"]
}

这里的两组图片分别用了标签0和1。

待测试的图片也变成了两组:

# 定义测试图片路径列表
test_image_paths = [r"D:\python\pythonworkspace\pythonProject3\zyz\11.jpg",r"D:\python\pythonworkspace\pythonProject3\s01\05.jpg"
]

使用Fisherfaces算法的人脸识别和使用Eigenfaces算法的人脸识别在判断原理上也很类似,以5000为置信度标准,小于5000为图像识别成功,对比结果为0时表明两个图像完全一样,而超出为不能识别。

实际用的图像0有:

图3  训练样本0

图4  训练样本1 

图5  待测图像1  

图6  待测图像2

代码运行后,获得的识别效果为:

图7  待测图像1识别效果

图8  待测图像2识别效果

这个效果其实出乎预料,待测图像2本应被识别,但却未被认出。

不过用于训练的的样本的确太少,所以这样的识别效果也算正常。

此时的完整代码为:

import cv2 as cv
import numpy as np# 定义图片路径字典,键为标签,值为该标签对应的图片路径列表
image_paths_dict = {0: [r"D:\python\pythonworkspace\pythonProject3\0\01.jpg",r"D:\python\pythonworkspace\pythonProject3\0\02.jpg",r"D:\python\pythonworkspace\pythonProject3\0\03.jpg"],1: [r"D:\python\pythonworkspace\pythonProject3\1\01.jpg",r"D:\python\pythonworkspace\pythonProject3\1\02.jpg",r"D:\python\pythonworkspace\pythonProject3\1\03.jpg"]
}photos = []  # 定义photo空列表,用来存储图像
labels = []  # 定义lables空列表,用来存储图像对应的标签# 定义图像尺寸信息
width = 600  # 定义一个初始宽度量
height = 600  # 定义一个初始高度量
target_size = (width, height)  # 定义一个元组,存储宽度量和高度量# 读取图片并调整尺寸
for label, paths in image_paths_dict.items():for path in paths:# 以彩色模式读取图像img = cv.imread(path)if img is not None:# 调整图像尺寸为与目标尺寸相同img = cv.resize(img, target_size)# 将彩色图像转换为灰度图像用于训练gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)photos.append(gray_img)labels.append(label)else:print(f"无法读取图片: {path}")# 定义标签映射
names = {0: "su",1: "other_person"
}# 创建人脸识别器
recognizer = cv.face.FisherFaceRecognizer.create()# 训练人脸识别器
if photos and labels:recognizer.train(photos, np.array(labels))  # 训练器读入人脸样本和对应标签# 定义测试图片路径列表test_image_paths = [r"D:\python\pythonworkspace\pythonProject3\zyz\11.jpg",r"D:\python\pythonworkspace\pythonProject3\s01\05.jpg"]for test_image_path in test_image_paths:# 读取测试图片,以彩色模式读取test_img = cv.imread(test_image_path)if test_img is not None:# 调整测试图像尺寸与目标尺寸一致test_img = cv.resize(test_img, target_size)# 将彩色图像转换为灰度图像用于识别gray_test_img = cv.cvtColor(test_img, cv.COLOR_BGR2GRAY)label, confidence = recognizer.predict(gray_test_img)# 设定识别阈值threshold = 5000  # 可根据实际情况调整if confidence > threshold:# 添加未识别标记cv.putText(test_img, "Unrecognized", (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)else:print(f'confidence={confidence}')print(names[label])# 添加识别结果标记text = names[label]cv.putText(test_img, text, (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 输出图像cv.imshow('Result Image', test_img)cv.waitKey(0)cv.destroyAllWindows()else:print(f"无法读取测试图片: {test_image_path}")

【3.2】LBPH算法

对使用Fisherfaces算法、Eigenfaces算法的人脸识别,和使用LBPH算法的人脸识别在代码上的设计也一样,只是调用的参数不同,并且使用LBPH算法时的参数均可以由算法自动选择。

所以依然可以直接使用Fisherfaces算法的代码,只需将创建识别器的代码修改即可:

# 创建人脸识别器
recognizer = cv.face.LBPHFaceRecognizer.create()

其余代码均无需修改,代码运行后获得的人脸识别效果为:

图9 待测图像1人脸识别效果  

图10 待测图像2人脸识别效果

使用LBPH算法的人脸识别效果稍好,因为它正确识别了待测图像2。

【4】细节说明

所有识别器均在对灰度图像进行识别时更高效,因此实际的识别过程大都是对灰度图像进行。

【5】总结

掌握了使用python+opencv实现了使用Fisherfaces算法和LBPH算法进行人脸识别的技巧。

 

 

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

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

相关文章

React 前端框架介绍

什么是 React? React 是一个由 Facebook 开发并维护的开源 JavaScript 库,用于构建用户界面。它主要用于创建交互式用户界Face(UI),尤其是当数据变化时需要更新部分视图时非常有效。React 的核心思想是组件化和声明性…

包装类的空指针异常

问题: Integer是引用对象,当初始化不进行赋值的时候是null,是null就不可以自动拆箱 实践: public class Test {public static void main(String[] args) {Integer num null;//自动拆箱int i num;} } 会包异常信息: Excepti…

【Elasticsearch】检索选定字段(Retrieve selected fields)

在 Elasticsearch 中,检索选定字段(Retrieve selected fields)是一个重要的功能,用于优化查询性能和减少数据传输量。以下是结合所有回答的详细总结,涵盖每种字段检索方式的原理、应用场景、性能特点以及限制。 1._so…

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例 Delete删除数据语法案例 截断表语法案例 插入查询结果语法案例 聚合函数函数介绍案例 group by子句的使用语…

docker 基础命令使用(ubuntu)

docker 状态查询 docker ps docker ps -adocker --version docker info docker --help docker run --help docker ps --help ...docker 操作镜像命令 docker imagesdocker rmi 镜像id/镜像名docker 操作容器命令 docker ps docker ps -adocker run 命令 # 端口映射 -p 参数…

idea 2023.3.7常用插件

idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace …

基于Flask的广西高校舆情分析系统的设计与实现

【Flask】基于Flask的广西高校舆情分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统综合运用Python、Flask框架及多种数据处理与可视化工具开发,结合Boot…

用什么办法能实现ubuntu里面运行的自己开发的python程序能自动升级。

要实现Ubuntu中自己开发的Python程序自动升级,可以通过以下几种方式: 1. 使用 Git 仓库 定时任务 如果你的Python程序托管在Git仓库中,可以通过定时拉取最新代码来实现自动升级。 步骤: 确保Python程序在Git仓库中。在Ubuntu上…

破解微服务疑难杂症:2025年全解决方案

微服务架构已经成为现代软件开发的主流选择,其优势在于能够将复杂的系统拆分为独立的服务模块,方便开发和维护。然而,在微服务的实施过程中,开发者往往会面临许多挑战,如服务间通信、数据一致性、性能优化和故障处理等…

Linux(Centos 7.6)命令详解:head

1.命令作用 将每个文件的前10行打印到标准输出(Print the first 10 lines of each FILE to standard output) 2.命令语法 Usage: head [OPTION]... [FILE]... 3.参数详解 OPTION: -c, --bytes[-]K,打印每个文件的前K字节-n, --lines[-],打印前K行而…

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换(SNAT,Source NAT): 目标地址转换(DNAT,Destination NAT): 端口地址转换(PAT&#xff0c…

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…

STM32 I2C通信协议说明

目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况: 异常情况: 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…

Android 10.0 移除wifi功能及相关菜单

介绍 客户的机器没有wifi功能,所以需要删除wifi相关的菜单,主要有设置-网络和互联网-WLAN,长按桌面设置弹出的WALN快捷方式,长按桌面-微件-设置-WLAN。 修改 Android10 上直接将config_show_wifi_settings改为false,这样wifi菜单的入口就隐…

DeepSeek HuggingFace 70B Llama 版本 (DeepSeek-R1-Distill-Llama-70B)

简简单单 Online zuozuo :本心、输入输出、结果 文章目录 DeepSeek HuggingFace 70B Llama 版本 (DeepSeek-R1-Distill-Llama-70B)前言vllm 方式在本地部署 DeepSeek-R1-Distill 模型SGLang 方式在本地部署 DeepSeek-R1-Distill 模型DeepSeek-R1 相关的 Models,以及 Huggin…

服务器中部署大模型DeepSeek-R1 | 本地部署DeepSeek-R1大模型 | deepseek-r1部署详细教程

0. 部署前的准备 首先我们需要足够算力的机器,这里我在vultr中租了有一张A16显卡一共16GB显存的服务器作为演示。部署的模型参数为14b的。如果需要部署满血版本671b的,需要更大的算力支持,这里由于是个人资金有限,就演示14b的部署…

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

🎓 毕业设计大揭秘!想要源码和文章?快来私信我吧! Hey小伙伴们~ 👋 毕业季又来啦!是不是都在为毕业设计忙得团团转呢?🤔 别担心,我这里有个小小的福利要分享给你们哦&…

基于Go语言 XTA AI聊天界面实现

项目开源地址: XTA-AI-SDK 人工智能技术的迅速发展,AI聊天应用变得越来越流行。本文将介绍如何使用Go语言和LCL库( Lazarus Component Library)创建一个功能丰富的AI聊天界面。项目主要包含以下模块: 项目背景 本项目旨在为开发…

使用 Apache PDFBox 提取 PDF 中的文本和图像

在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox 是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。 本文将介绍如何使…

MongoDB 7 分片副本集升级方案详解(下)

#作者:任少近 文章目录 1.4 分片升级1.5 升级shard11.6 升级shard2,shard31.7 升级mongos1.8重新启用负载均衡器1.9 推荐MongoDB Compass来验证数据 2 注意事项: 1.4 分片升级 使用“滚动”升级从 MongoDB 7.0 升级到 8.0,即在其他成员可用…