当前位置:首页 > Python > 正文

Python LBPH人脸识别完整教程 - OpenCV实现详解

Python LBPH人脸识别完整教程

使用OpenCV实现高效的LBPH人脸识别算法 - 从基础到实践

计算机视觉研究员
最后更新: 2023年10月15日 | 阅读时间: 10分钟

LBPH人脸识别简介

LBPH(Local Binary Patterns Histograms)是一种高效的人脸识别算法,它结合了局部二值模式(LBP)和直方图技术。LBPH的主要优势在于对光照变化不敏感,计算效率高,适用于实时人脸识别系统。

LBPH工作原理

  1. 将图像分成多个小区域
  2. 对每个区域计算LBP特征
  3. 生成每个区域的直方图
  4. 连接所有直方图形成特征向量
  5. 使用特征向量进行人脸识别

LBPH优势

  • 对光照变化具有鲁棒性
  • 计算效率高,适合实时应用
  • 训练过程简单快速
  • 内存占用小
  • 实现相对简单

LBPH人脸识别实现步骤

1

准备数据集

收集人脸图像并组织成训练集,每个人一个文件夹

2

人脸检测

使用Haar级联检测器定位图像中的人脸

3

训练模型

使用处理后的图像训练LBPH识别器

4

人脸识别

使用训练好的模型识别新的人脸图像

Python代码实现

1. 安装依赖库

pip install opencv-python
pip install numpy

2. 准备数据集

创建如下目录结构,每个人一个文件夹:

dataset/
├── person1/
│   ├── 1.jpg
│   ├── 2.jpg
│   └── ...
├── person2/
│   ├── 1.jpg
│   ├── 2.jpg
│   └── ...
└── ...

3. 完整人脸识别代码

import cv2
import os
import numpy as np

# 加载人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

def detect_faces(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    return faces

def prepare_training_data(data_folder_path):
    dirs = os.listdir(data_folder_path)
    faces = []
    labels = []
    label_dict = {}
    current_label = 0
    
    for dir_name in dirs:
        if not dir_name.startswith("."):
            label_dict[current_label] = dir_name
            subject_dir_path = os.path.join(data_folder_path, dir_name)
            subject_images_names = os.listdir(subject_dir_path)
            
            for image_name in subject_images_names:
                if image_name.startswith("."):
                    continue
                    
                image_path = os.path.join(subject_dir_path, image_name)
                image = cv2.imread(image_path)
                
                # 检测人脸
                faces_rect = detect_faces(image)
                if len(faces_rect) != 1:
                    continue
                    
                (x, y, w, h) = faces_rect[0]
                face = image[y:y+w, x:x+h]
                face = cv2.resize(face, (200, 200))
                face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
                
                faces.append(face)
                labels.append(current_label)
            
            current_label += 1
            
    return faces, labels, label_dict

# 准备训练数据
data_path = "dataset"
faces, labels, label_dict = prepare_training_data(data_path)

# 创建LBPH人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()

# 训练模型
recognizer.train(faces, np.array(labels))

# 保存模型
recognizer.save("lbph_model.yml")
np.save("label_dict.npy", label_dict)

# 测试识别
def predict(test_img):
    img = test_img.copy()
    faces_rect = detect_faces(img)
    
    for (x, y, w, h) in faces_rect:
        face = img[y:y+w, x:x+h]
        face = cv2.resize(face, (200, 200))
        gray_face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
        
        label, confidence = recognizer.predict(gray_face)
        
        # 获取标签对应的名称
        label_text = label_dict[label]
        
        # 绘制结果
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        cv2.putText(img, f"{label_text} ({confidence:.2f})", (x, y-10), 
                   cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
    
    return img

# 加载测试图像
test_img = cv2.imread("test.jpg")
predicted_img = predict(test_img)

# 显示结果
cv2.imshow("Prediction", predicted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

LBPH参数调优指南

参数 说明 推荐值 调整建议
radius LBP半径大小 1-3 值越大,特征越全局化
neighbors 采样点数量 8 通常设置为8或16
grid_x 水平方向网格数 8 值越大,特征越精细
grid_y 垂直方向网格数 8 通常与grid_x相同
threshold 识别阈值 50-80 值越小,识别越严格

提高识别准确率的技巧

  • 使用高质量、多样化的训练图像(不同光照、角度)
  • 确保每个人至少有10-20张训练图像
  • 对图像进行预处理(直方图均衡化)
  • 使用相同尺寸和位置的人脸图像
  • 在相似条件下采集测试图像
  • 定期更新模型以适应外观变化

LBPH人脸识别应用场景

📱

移动设备解锁

智能手机和平板电脑的人脸解锁功能

🏢

门禁系统

办公楼、实验室等场所的安全门禁

📊

考勤管理

企业和学校的自动考勤系统

🛍️

智能零售

识别VIP客户提供个性化服务

掌握LBPH人脸识别技术

本教程详细介绍了使用Python和OpenCV实现LBPH人脸识别的完整流程。通过合理的数据准备、模型训练和参数调优,您可以构建高效的人脸识别系统。LBPH算法因其计算效率和光照不变性,成为许多人脸识别应用的理想选择。

开始构建您的人脸识别系统吧!

发表评论