Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

一、简单介绍

二、简单进行人脸训练与识别

1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别

2、实现步骤:

3、判断是谁的人脸:

案例中涉及的关键函数说明如下

1)准备训练数据集:load_training_data(data_dir)

2)预处理图像:preprocess_images(faces)

3)训练 LBPH 人脸识别器:train_lbph(faces, labels)

4)读取测试图像:load_test_image(image_path)

5)预处理测试图像:preprocess_test_image(test_image)

6)进行人脸识别:recognize_face(model, test_image)

7)测试人脸识别器:test_face_recognition(data_dir, test_image_path)

三、简单进行人脸训练与识别案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

OpenCV 提供了一些已经训练好的级联分类器,这些级联分类器以XML文件的方式保存在以下路径中:

...\Python\Lib\site-packages\cv2\data\

OpenCV提供了一些经过预训练的人脸检测器模型文件,这些文件通常包含在OpenCV的安装包中。你也可以在OpenCV的官方GitHub页面或者OpenCV官方网站的下载页面找到这些模型文件的下载链接。

一般来说,你可以从以下位置获取OpenCV的预训练模型文件:

  •         OpenCV GitHub Release 页面:在 Releases · opencv/opencv · GitHub 找到你需要的版本,然后在下载的压缩包中找到位于 opencv\data 目录下的人脸检测器模型文件。
  •         OpenCV 官方网站下载页面:访问 OpenCV 官方网站 Releases - OpenCV ,下载你需要的版本,并在相应的压缩包中查找人脸检测器模型文件。

请确保下载与你使用的OpenCV版本兼容的模型文件。

该案例效果

二、简单进行人脸训练与识别

人脸识别是一种生物特征识别技术,旨在识别和验证人类面部的身份。它利用计算机视觉和模式识别技术来识别人脸图像中的关键特征,并将其与事先存储的人脸模板或数据库中的其他人脸进行比较,以确定是否匹配。人脸识别技术通常包括以下步骤:

  1. 人脸检测:首先从图像或视频中检测出人脸的位置,通常使用级联分类器、深度学习模型或其他检测算法来实现。

  2. 人脸对齐:将检测到的人脸图像对齐,确保它们具有相似的尺寸、姿态和位置。这一步有助于提高后续特征提取的准确性。

  3. 特征提取:从对齐后的人脸图像中提取关键特征,例如人脸的轮廓、眼睛、鼻子、嘴巴等。常用的特征提取方法包括主成分分析(PCA)、局部二值模式(LBP)、深度神经网络等。

  4. 特征匹配:将提取的特征与事先存储的人脸模板或数据库中的其他人脸特征进行比较,并计算它们之间的相似度或距离。通常采用的方法包括欧氏距离、余弦相似度等。

  5. 决策阶段:根据特征匹配的结果,决定是否识别为已知身份。这一阶段通常会设置一个阈值来判断匹配结果的可信度,如果相似度超过阈值,则识别为已知身份;否则,识别为未知身份或拒绝识别。

人脸识别技术在安全门禁、支付验证、监控系统、社交媒体标记等领域有着广泛的应用。

1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别

LBPH(Local Binary Patterns Histograms)算法是一种用于人脸识别的经典算法,它结合了局部二值模式(Local Binary Patterns,LBP)和直方图统计的技术。下面详细介绍LBPH算法的原理、实现步骤以及判断是谁的人脸的过程:

  1. 局部二值模式(LBP)

    • LBP 是一种用于纹理分析的特征描述方法。它通过比较像素点与其邻域像素的灰度值来描述图像的局部纹理特征。将每个像素与其邻域像素进行比较,并根据比较结果得到一个二进制数值,将这个数值作为该像素的特征描述。LBP 算法可以有效地捕获图像的纹理信息。
  2. 直方图统计

    • 在 LBP 算法的基础上,LBPH 算法将每个图像分割成多个局部区域,并计算每个局部区域的 LBP 特征直方图。这些直方图描述了每个局部区域的纹理分布情况,从而将图像的纹理信息转化为了直方图的形式。
  3. 人脸识别

    • 对于训练数据集中的每张人脸图像,LBPH 算法首先提取其局部纹理特征,并计算每个局部区域的 LBP 特征直方图。然后,利用这些直方图作为特征向量进行训练。在识别阶段,LBPH 算法对输入的测试图像进行同样的处理,提取其局部纹理特征,并计算每个局部区域的 LBP 特征直方图。接着,通过比较测试图像的特征向量与训练集中已知人脸的特征向量,利用一定的分类算法(如K最近邻算法)进行匹配和判别,从而确定测试图像属于哪个人。

2、实现步骤:

  1. 准备训练数据集

    • 收集包含多个人脸图像的数据集,并为每张图像标注对应的人物标签。
  2. 提取局部纹理特征

    • 对于每张人脸图像,利用 LBP 算法提取其局部纹理特征,得到每个局部区域的 LBP 特征描述。
  3. 构建特征向量

    • 将每个局部区域的 LBP 特征直方图组合成一个完整的特征向量,作为该图像的特征描述。
  4. 训练模型

    • 利用训练数据集中的特征向量,通过一定的机器学习算法(如K最近邻算法、支持向量机等)训练模型,得到人脸识别模型。
  5. 人脸识别

    • 对于新的测试图像,同样提取其局部纹理特征,并计算每个局部区域的 LBP 特征直方图。然后,利用训练好的模型对测试图像的特征向量进行匹配和判别,确定其所属的人物标签。

3、判断是谁的人脸:

  1. 训练模型

    • 在训练阶段,LBPH 算法利用已知的人脸图像数据集,构建了一个能够将人脸图像特征与对应人物标签关联起来的模型。
  2. 测试识别

    • 在识别阶段,LBPH 算法对输入的测试图像提取特征,并利用训练好的模型对其进行匹配和判别。根据匹配结果,确定测试图像属于哪个已知的人物标签。
  3. 置信度评估

    • LBPH 算法通常会返回识别结果的置信度(confidence)值,用于评估识别的准确度。较高的置信度值表示模型对于当前图像的识别结果较为自信,而较低的置信度值可能表示模型对于当前图像的识别困难程度较大。

案例中涉及的关键函数说明如下

1)准备训练数据集:load_training_data(data_dir)

参数:

  • data_dir(字符串):包含训练图像的目录路径。

功能: 该函数用于加载训练数据集。它遍历指定目录下的图像文件,并将每个图像转换为灰度图像。每个图像的路径提供了标签信息,标签即为图像所在的目录名称。

注意事项:

  • data_dir 应包含不同类别的图像,每个类别的图像应放置在以其类别名称命名的子目录中。
2)预处理图像:preprocess_images(faces)

参数:

  • faces(列表):包含原始训练图像的灰度图像列表。

功能: 该函数用于对训练图像进行预处理。它将每个图像调整为相同的大小(这里是100x100像素)。

注意事项:

  • 输入的 faces 列表应包含灰度图像,且每个图像的尺寸可以不同。
  • 预处理后的图像会覆盖原始图像,因此建议在调用该函数前备份原始图像数据。
3)训练 LBPH 人脸识别器:train_lbph(faces, labels)

参数:

  • faces(列表):包含预处理后的训练图像的灰度图像列表。
  • labels(列表):包含每个训练图像对应的标签列表。

功能: 该函数创建 LBPH 人脸识别器,并使用给定的训练数据集进行训练。

注意事项:

  • faceslabels 应具有相同的长度,且一一对应。
  • 训练数据集应包含足够多的样本,并且覆盖各种姿态、光照和表情等变化。
4)读取测试图像:load_test_image(image_path)

参数:

  • image_path(字符串):测试图像文件的路径。

功能: 该函数用于加载测试图像,并将其转换为灰度图像。

注意事项:

  • 输入的测试图像应为灰度图像。
5)预处理测试图像:preprocess_test_image(test_image)

参数:

  • test_image(二维数组):灰度测试图像。

功能: 该函数用于对测试图像进行预处理,将其调整为与训练图像相同的大小。

注意事项:

  • 输入的测试图像应为灰度图像。
  • 预处理后的测试图像会覆盖原始图像数据,因此建议在调用该函数前备份原始测试图像数据。
6)进行人脸识别:recognize_face(model, test_image)

参数:

  • model(cv2.face_LBPHFaceRecognizer):训练好的 LBPH 人脸识别器。
  • test_image(二维数组):预处理后的测试图像。

功能: 该函数使用训练好的 LBPH 人脸识别器对预处理后的测试图像进行识别,并返回预测的标签和置信度。

注意事项:

  • 输入的 test_image 应为预处理后的灰度图像。
  • 人脸识别器的模型应已经经过训练。
7)测试人脸识别器:test_face_recognition(data_dir, test_image_path)

参数:

  • data_dir(字符串):包含训练图像的目录路径。
  • test_image_path(字符串):测试图像文件的路径。

功能: 该函数是主函数,用于测试人脸识别器。它调用了前面定义的各个功能函数,并输出识别结果。

注意事项:

  • data_dir 应包含不同类别的图像,每个类别的图像应放置在以其类别名称命名的子目录中。
  • 测试图像应为单个灰度图像文件。

三、简单进行人脸训练与识别案例实现简单步骤

1、准备训练数据

这里使用1文件夹 汤姆汉克斯的头像,2 文件夹皮特的头像

2、待测试的是 2 皮特的头像

3、编写代码

3、运行结果

识别还是对了的,你们也可以试试其他图片

4、编辑代码

"""
简单进行人脸训练与识别1、准备训练数据集:2、提取局部纹理特征:3、构建特征向量:4、训练模型:5、人脸识别:
"""import cv2
import os
import numpy as npdef load_training_data(data_dir):"""从指定目录加载训练数据集:param data_dir:(str) 包含训练图像的目录路径:return:tuple 包含训练图像和对应标签的元组 (faces, labels)"""if not isinstance(data_dir, str) or not data_dir.strip():raise ValueError("Invalid data directory path.")faces = []  # 存储人脸图像labels = []  # 存储人脸标签for root, dirs, files in os.walk(data_dir):for file in files:if file.endswith('.jpg') or file.endswith('.png'):img_path = os.path.join(root, file)label = os.path.basename(root)face_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)if face_img is not None:faces.append(face_img)labels.append(int(label))if not faces or not labels:raise ValueError("No valid training data found in the directory:", data_dir)return faces, labelsdef preprocess_images(faces):"""对图像列表进行预处理,调整图像大小为100x100像素:param faces: (list) 包含人脸图像的列表:return: list 预处理后的人脸图像列表"""if not isinstance(faces, list) or not faces:raise ValueError("Invalid input: faces must be a non-empty list of images.")preprocessed_faces = []for face in faces:if face is not None:face = cv2.resize(face, (100, 100))  # 调整图像大小preprocessed_faces.append(face)return preprocessed_facesdef train_lbph(faces, labels):"""使用 LBPH 算法训练人脸识别器:param faces: (list) 包含训练图像的列表:param labels: (list) 包含训练图像对应标签的列表:return: cv2.face_LBPHFaceRecognizer: 训练完成的 LBPH 人脸识别器模型"""if not isinstance(faces, list) or not faces:raise ValueError("Invalid input: faces must be a non-empty list of images.")if not isinstance(labels, list) or not labels:raise ValueError("Invalid input: labels must be a non-empty list of integers.")if len(faces) != len(labels):raise ValueError("Mismatch in the number of faces and labels.")model = cv2.face.LBPHFaceRecognizer_create()model.train(faces, np.array(labels))return modeldef load_test_image(image_path):"""加载测试图像:param image_path: (str) 测试图像文件路径:return: numpy.ndarray 加载的测试图像"""if not isinstance(image_path, str) or not image_path.strip():raise ValueError("Invalid image path.")test_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)if test_image is None:raise ValueError("Failed to load test image from path:", image_path)return test_imagedef preprocess_test_image(test_image):"""预处理测试图像,调整大小为100x100像素:param test_image: (numpy.ndarray) 待处理的测试图像:return: numpy.ndarray 预处理后的测试图像"""if test_image is None:raise ValueError("Invalid input: test_image is None.")test_image = cv2.resize(test_image, (100, 100))  # 调整图像大小return test_imagedef recognize_face(model, test_image):"""使用训练好的模型识别人脸:param model: (cv2.face_LBPHFaceRecognizer) 训练完成的 LBPH 人脸识别器模型:param test_image: (numpy.ndarray) 待识别的测试图像:return: tuple 识别结果的标签和置信度 (label, confidence)"""if model is None or not isinstance(model, cv2.face_LBPHFaceRecognizer):raise ValueError("Invalid model: model must be a trained LBPH face recognizer.")if test_image is None:raise ValueError("Invalid input: test_image is None.")label, confidence = model.predict(test_image)return label, confidencedef test_face_recognition(data_dir, test_image_path):"""测试人脸识别器:param data_dir: (str) 包含训练图像的目录路径:param test_image_path: (str) 测试图像文件路径:return: tuple 识别结果的标签和置信度 (label, confidence)"""# 加载训练数据集faces, labels = load_training_data(data_dir)# 预处理训练数据集preprocessed_faces = preprocess_images(faces)# 训练 LBPH 人脸识别器model = train_lbph(preprocessed_faces, labels)# 读取测试图像test_image = load_test_image(test_image_path)# 预处理测试图像preprocessed_test_image = preprocess_test_image(test_image)# 进行人脸识别label, confidence = recognize_face(model, preprocessed_test_image)return label, confidence# 测试人脸识别器
if __name__ == "__main__":data_dir = "Images/Face/Train"test_image_path = "Images/Face/Test/Test_Peter.png"label, confidence = test_face_recognition(data_dir, test_image_path)print("Predicted label:", label)print("Confidence:", confidence)

四、注意事项

  1. 确保训练数据集包含足够多的人脸图像,并且标签信息正确。
  2. 对训练图像进行预处理时,要保持图像大小的一致性,以便于训练模型。
  3. 在训练 LBPH 人脸识别器时,要确保提供正确的训练数据集和标签信息。
  4. 测试图像的加载和预处理要正确,避免出现图像加载失败或尺寸不匹配的问题。
  5. 人脸识别结果的可信度(confidence)值可以用于评估识别的准确度,较低的可信度值可能表示模型对于当前图像的识别困难程度较大。

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

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

相关文章

【MATLAB源码-第198期】基于simulink的三相光伏并网仿真模拟。

操作环境: MATLAB 2022a 1、算法描述 三相光伏并网系统是一种将太阳能转换为电能并将其馈入电网的系统。这个系统通常包括光伏阵列、逆变器(包括其控制算法)、滤波器、电网连接和监控系统。从上载的框图中可以看出,该系统的设计…

找不到mfc140.dll如何解决?mfc140.dll丢失的几种解决方法分享

在我们启动并开始利用电脑进行日常工作的过程中,如果遭遇了操作系统提示“mfc140.dll文件丢失”的错误信息,导致某些应用程序无法正常运行,这究竟是何种情况呢?小编将介绍计算机缺失mfc140.dll文件的5种解决方法,帮助大…

java项目:微信小程序基于SSM框架实现的购物系统小程序【源码+数据库+毕业论文+PPT】

一、项目简介 本项目是一套基于SSM框架实现的购物系统小程序 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐…

unity学习(91)——云服务器调试——补充catch和if判断

本机局域网没问题,服务器放入云服务器后,会出现异常。 想要找到上面的问题,最简单的方法就是在云服务器上下载一个vs2022! 应该不是大小端的问题! 修改一下readMessage的内容,可以直接粘贴到云服务器的。 …

使用FunASR处理语音识别

FunASR是阿里的一个语音识别工具,比SpeechRecognition功能多安装也很简单; 官方介绍:FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD&#xff…

【Java数据结构】初步认识ArrayList与顺序表

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

分布式文件系统--MinIO

1 MinIO安装(Docker) ●在root目录下新建docker_minio文件夹 ●在docker_minio文件夹下新建config文件夹,data文件夹 ●在root目录下新建docker_compose文件夹,在docker_compose文件夹中添加docker-compose.yaml services:minio:image: quay.io/minio/miniocontainer_name: mi…

Vuforia AR篇(三)— AR模型出场效果

目录 前言一、AR模型出场二、AR出场特效三、添加过渡效果四、效果 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、AR模型出场 创建ARCamer…

Three.js——基础材质、深度材质、法向材质、面材质、朗伯材质、Phong材质、着色器材质、直线和虚线、联合材质

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

【树莓派】强力烧写工具 Balena Etcher,烧写树莓派系统,树莓派系统克隆,备份

文章目录 使用Win32DiskImager备份和写入树莓派系统步骤一:下载和安装Win32DiskImager步骤二:准备工作步骤三:备份树莓派系统步骤四:写入树莓派系统 使用Balena Etcher给树莓派烧写系统Balena Etcher简介步骤一:下载Ba…

Mac安装telnet

一、安装Homebrew 1、打开官网:Homebrew — The Missing Package Manager for macOS (or Linux) 2、打开终端输入: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 二、安装Telnet bre…

【LAMMPS学习】八、基础知识(4.5)TIP5P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

园区智慧化转型新篇章:解码智慧技术如何助力园区实现精细化管理,提升运营效率

目录 一、智慧技术概述及其在园区管理中的应用 (一)物联网技术的应用 (二)大数据技术的应用 (三)云计算技术的应用 二、智慧技术助力园区实现精细化管理 (一)实现资源优化配置…

轻松上手,无缝对接:详述如何接入企讯通空号检测接口API

企讯通空号检测接口API作为一款高效、精准的手机号码状态检测工具,能够帮助企业及开发者快速识别手机号码的有效性,优化通讯资源,提升营销效果。本篇文章将带领您一步步了解如何轻松、无缝地对接企讯通空号检测接口API,让您的业务…

【RAG 论文】Adaptive-RAG:自适应地根据 query 难度来选择合适的 RAG 模型

论文:Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity ⭐⭐⭐⭐ Code:github.com/starsuzi/Adaptive-RAG NAACL 2024,arXiv:2403.14403 文章目录 一、论文速读二、实现细节2.1 三种…

使用FPGA实现逐级进位加法器

介绍 逐级进位加法器就是将上一位的输出作为下一位的进位输入,依次这样相加。下面以一个8位逐级进位加法器给大家展示。 我增加了电路结构,应该很容易理解吧。 下面我也列举了一位加法器,可以看下。 电路结构 设计文件 1位加法器 librar…

Docker 的数据管理 端口映射 容器互联 镜像的创建

目录 概念 概念 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。总结:因为容器数据是临时保存的为了安全,就要让数据保持持久化。 1&#…

OceanBase单机版安装体验

前情提要 上周OceanBase开发者大会过后,作为观察员也来体验一下OB的安装。业内有某个国产安装用了两周,这种其实有点劝退了。话说就是10年前,没搞过Oracle的人也不用两周安装一个数据库啊。今天看看OB的(一体化)安装。…

计算机网络----第十三天

DNS协议和文件传输协议 DNS: 含义:用于域名和IP地址的互相解析 DNS域名: 背景:通过IP地址访问目标主机,不便于记忆 域名的树形层次化结构: ①根域 ②顶级域:主机所处的国家/区域&#xf…

一纸歉文难挽人心,特步站在了“悬崖边”

撰稿|多客 来源|贝多财经 日前,一场马拉松赛事风波把特步推上了舆论风口。 此次事件说起来也并不复杂,在4月14日举办的2024北京半程马拉松赛最后冲刺的几百米,几位外籍选手在超过何杰后,对何杰做出回头看、摆手示意的动作&…