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官方网站的下载页面找到这些模型文件的下载链接。

该案例效果

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

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

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

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

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

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

2、实现步骤:

3、判断是谁的人脸:

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

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

1、准备训练数据

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

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

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

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

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

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

3、编写代码

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

3、运行结果

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

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

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)值可以用于评估识别的准确度,较低的可信度值可能表示模型对于当前图像的识别困难程度较大。
04-25 12:02