Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别
1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别
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官方网站的下载页面找到这些模型文件的下载链接。
该案例效果
二、简单进行人脸训练与识别
人脸识别是一种生物特征识别技术,旨在识别和验证人类面部的身份。它利用计算机视觉和模式识别技术来识别人脸图像中的关键特征,并将其与事先存储的人脸模板或数据库中的其他人脸进行比较,以确定是否匹配。人脸识别技术通常包括以下步骤:
人脸识别技术在安全门禁、支付验证、监控系统、社交媒体标记等领域有着广泛的应用。
1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别
LBPH(Local Binary Patterns Histograms)算法是一种用于人脸识别的经典算法,它结合了局部二值模式(Local Binary Patterns,LBP)和直方图统计的技术。下面详细介绍LBPH算法的原理、实现步骤以及判断是谁的人脸的过程:
2、实现步骤:
3、判断是谁的人脸:
案例中涉及的关键函数说明如下
三、简单进行人脸训练与识别案例实现简单步骤
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)
四、注意事项
- 确保训练数据集包含足够多的人脸图像,并且标签信息正确。
- 对训练图像进行预处理时,要保持图像大小的一致性,以便于训练模型。
- 在训练 LBPH 人脸识别器时,要确保提供正确的训练数据集和标签信息。
- 测试图像的加载和预处理要正确,避免出现图像加载失败或尺寸不匹配的问题。
- 人脸识别结果的可信度(confidence)值可以用于评估识别的准确度,较低的可信度值可能表示模型对于当前图像的识别困难程度较大。