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 np


def 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, labels


def 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_faces


def 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 model


def 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_image


def 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_image


def 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, confidence


def 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.mfbz.cn/a/574714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

政安晨:【Keras机器学习示例演绎】(十六)—— 用于图像分类的混合增强

目录 简介 设置 准备数据集 定义超参数 将数据转换为 TensorFlow 数据集对象 定义混合技术函数 可视化新的增强数据集 模型制作 1.使用混合数据集训练模型 2.在没有混合数据集的情况下训练模型 说明 政安晨的个人主页:政安晨 欢迎 👍点赞✍评…

BGP的基本配置

l 按照以下步骤配置BGP协议: 第1步:设备基本参数配置,AS内配置IGP确保内部网络连通性; l 配置IGP(OSPF协议等)路由解决peer对等体的源和目标IP之间连通性,确保peer之间TCP(179&a…

SpringBoot学习之Redis下载安装启动【Mac版本】(三十七)

一、下载Redis 1、下载地址:Downloads - Redis 往下滑,找到Downloads区域,这里有若干版本,这里我们选择了7.0的稳定版本 2、我们下载的是redis-7.0.15.tar.gz,这是一个压缩包,我们双击解压这个压缩包,可以得到如下文件 二、安装Redis 1、我们进入redis根目录安装mak…

IDEA使用技巧(常用设置、快捷键等)

IDEA使用技巧 一、IDEA常用基本设置设置代码背景颜色/主题/字体Ctrl鼠标滚轮缩放字体大小设置字符编码左右两侧的Project,Structure,Maven等按钮消失新增类似sout,psvm的模版切换某个模块编译的JDK版本 二、常用快捷键CtrlAltT包裹代码Alt回车联想补全Ct…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器,在item中添加了很多的控件,这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候,及容易不小心就把数据给修改了而不自知。所有,我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

数据结构篇其二---单链表(C语言+超万字解析)

目录 前言: 一、顺序表的缺点和链表的引入。 二、链表概述 实现一个简单的链表 空链表的概念 三、链表的功能实现 链表的打印 链表节点的创建 链表的头插(自上而下看完分析,相信你会有所收获) 头插的前置分析 传值调用和…

一、路由基础

1.路由协议的优先级 路由器分别定义了外部优先级和内部优先级(越小越优) 路由选择顺序:外部优先级>>内部优先级(相同时) ①外部优先级:用户可以手工为各路由协议配置的优先级 ②内部优先级&#xf…

汽车信息安全--如何理解TrustZone(2)

目录 1.概述 2 如何切换安全状态 3 TrustZone里实现了什么功能? 4. 与HSM的比较 1.概述 汽车信息安全--如何理解TrustZone(1)-CSDN博客讲解了什么是Trustzone,下面我们继续讲解与HSM的区别。 2 如何切换安全状态 在引入安全扩展后,Arm…

太速科技-多路PCIe的阵列计算全国产化服务器

多路PCIe的阵列计算全国产化服务器 多路PCIe的阵列计算全国产化服务器以国产化处理器(海光、飞腾ARM、算能RSIC V)为主板,扩展6-8路PCIe3.0X4计算卡; 计算卡为全国产化的AI处理卡(瑞星微ARM,算能AI&#x…

MMSeg搭建模型的坑

Input type(torch.suda.FloatTensor) and weight type (torch.FloatTensor) should be same 自己搭建模型的时候,经常会遇到二者不匹配,以这种情况为例,是因为部分模型没有加载到CUDA上面造成的。 注意搭建模型的时候,所有层都应…

Oracle之RMAN联机和脱机备份(二)

rman脱机备份,首先使用rman登入数据库服务器,然后关闭数据库后,启动数据库到mount状态,在执行backup database指定备份整个数据库。 1、启动mount归档模式 sys@ORCL>archive log list; Database log mode Archive Mode Automatic archival Enabl…

STM32H750外设ADC之开始和结束数据转换功能

目录 概述 1 开始转换 1.1 使能ADSTART 1.2 使能JADSTART 1.3 ADSTART 通过硬件清零 2 转换时序 3 停止正在进行的转换( ADSTP、 JADSTP) 3.1 停止转换功能实现 3.2 停止转换流程图 概述 本文主要讲述了STM32H750外设ADC之开始和结束数据转换…

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏 第一步 确认有添加静态库第二步 验证第三步 修改源码在合适的地方配置 ro.product.is_support_SettingsSplitEnabled 即可。第一步 确认有添加静态库 --- a/packages/apps/Settings/Android.bp +++ b/packages/apps/Set…

[集群聊天项目] muduo网络库

目录 网络服务器编程常用模型什么是muduo网络库什么是epoll muduo网络库服务器编程 网络服务器编程常用模型 【方案1】 : accept read/write 不是并发服务器 【方案2】 : accept fork - process-pre-connection 适合并发连接数不大,计算任…

Centos的一些基础命令

CentOS是一个基于开源代码构建的免费Linux发行版,它由Red Hat Enterprise Linux (RHEL) 的源代码重新编译而成。由于 CentOS是基于RHEL构建的,因此它与RHEL具有非常类似的特性和功能,包括稳定性、安全性和可靠性。并且大部分的 Linux 命令在C…

Apache Doris 2.x 版本【保姆级】安装+使用教程

Doris简介 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于…

COOIS 生产订单显示系统增强

需求说明:订单系统显示页面新增批量打印功能 增强点:CL_COIS_DISP_LIST_NAVIGATION -->TOOLBAR方法中新增隐式增强添加自定义打印按钮 增强点:BADI-->WORKORDER_INFOSYSTEM新增增强实施 实现位置:IF_EX_WORKORDER_INFOSYS…

频裂变加群推广强制分享引流源码

视频裂变加群推广强制分享引流源码,用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次数。 引导用户转发QV分享,达到快速裂变引流的效果! 视频裂变推广程序,强制分享链接,引导用户转发,…

数据库MySQL的初级基础操作

文章目录 1. 介绍2. 数据库相关概念3. 启动4. 数据模型5. SQL6. DDL数据库DDL-表操作DDL-表操作-数据类型DDL-表操作-修改DDL-表操作-删除 7. 图形化界面工具DataGrip8. DML(数据操作语言)DML-添加数据DML-修改数据 9. DQL(数据查询语言)基本查询条件查询…

MemFire案例-政务应急物联网实时监测预警项目

客户背景 党的十八大以来,中央多次就应急管理工作做出重要指示:要求坚持以防为主、防抗救相结合,全面提升综合防灾能力;坚持生命至上、安全第一,完善安全生产责任制,坚决遏制重特大安全事故。 面对新形势…
最新文章