【深度学习】OpenCV 人脸识别实战:LBPH 算法实现简单人脸识别

文章目录


完整代码一览

c 复制代码
import cv2
import numpy as np

# 提前训练的人脸照片(灰度图)
images = []
images.append(cv2.imread('pyy1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('pyy2.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('qzl1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('qzl2.png', cv2.IMREAD_GRAYSCALE))
labels = [0, 0, 1, 1]
dic = {0: 'pyy', 1: 'qzl', -1: '无法识别'}

predict_image = cv2.imread('pyy.png', cv2.IMREAD_GRAYSCALE)  # 待识别人脸

# 创建 LBPH 识别器(设置阈值)
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)

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

# 预测
label, confidence = recognizer.predict(predict_image)

print('这人是:', dic[label])
print('置信度:', confidence)

导入库与安装说明

c 复制代码
import cv2
import numpy as np

cv2.face.LBPHFaceRecognizer_create 属于 OpenCV 的 contrib 扩展模块。如果你安装的是标准版 opencv-python,会报错 module 'cv2' has no attribute 'face'。请使用以下命令安装:

bash

c 复制代码
pip install opencv-contrib-python

如果已经安装了标准版,需要先卸载再安装 contrib 版。

准备训练数据(图像和标签)

c 复制代码
python
images = []
images.append(cv2.imread('pyy1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('pyy2.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('qzl1.png', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('qzl2.png', cv2.IMREAD_GRAYSCALE))
labels = [0, 0, 1, 1]
dic = {0: 'pyy', 1: 'qzl', -1: '无法识别'}

我们准备了 4 张人脸图像,分别是 pyy1.png、pyy2.png,qzl1.png、qzl2.png。

labels 是对应的数字标签:0 代表 pyy,1 代表 qzl。

dic 是一个字典,用于将数字标签映射回人名,方便打印。-1 是识别器返回的"无法识别"标签。

注意:这些图片应该是已经裁剪好的人脸图像(只含脸部区域),尺寸可以不一致(LBPH 会内部处理)。实际项目中,你需要先用人脸检测器裁剪出人脸。

创建 LBPH 识别器

c 复制代码
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)

cv2.face.LBPHFaceRecognizer_create() 创建一个 LBPH 识别器对象。

threshold=80:这是识别阈值。当识别器预测时,如果计算出的置信度(距离)大于这个值,则认为"不认识",返回标签 -1。阈值越小,识别越严格,但容易误拒;阈值越大,容忍度越高,但可能把陌生人认成熟人。80 是常用值,你可以根据实际情况调整。

训练模型

c 复制代码
recognizer.train(images, np.array(labels))

train() 方法接受两个参数:

images:训练图像列表(灰度图)。

labels:对应的标签数组(NumPy 格式)。

训练过程会计算每张图像的 LBPH 特征直方图,并存储起来,供后续识别时比对。

预测(识别)新图像

c 复制代码
predict_image = cv2.imread('pyy.png', cv2.IMREAD_GRAYSCALE)
label, confidence = recognizer.predict(predict_image)

predict() 接受一张待识别的灰度图像,返回两个值:

label:识别出的标签(如果置信度超过阈值,则返回 -1)。

confidence:置信度评分,数值越小表示匹配度越高(距离越近)。一般小于 50 表示比较可信,50~80 可能勉强,超过阈值则视为不认识。

输出结果

c 复制代码
print('这人是:', dic[label])
print('置信度:', confidence)

通过字典映射标签到人名,如果标签是 -1,则显示"无法识别"。

运行结果:

c 复制代码
这人是: qzl
置信度: 77.59353695603815