文章目录
- 引言
- 一、概述
- 二、代码实现
- 1. 代码整体结构
- 2. 导入库解析
- 3. 训练数据准备
- 4. 标签系统
- 5. 待识别图像加载
- 6. LBPH识别器创建
- 7. 模型训练
- 8. 预测执行
- 9. 结果输出
- 三、 LBPH算法原理解析
- 四、关键点解析
- 五、改进方向
- 总结
引言
人脸识别是计算机视觉领域的一个重要应用,今天我将分享一个使用Python和OpenCV实现的简单人脸识别系统。这个系统能够识别特定人物的照片,并给出识别结果的置信度。
一、概述
这个系统使用了OpenCV的LBPH(Local Binary Patterns Histograms)人脸识别算法,通过训练已知的人脸图像,然后对新的图像进行预测识别。
二、代码实现
import cv2
import numpy as np
# 加载训练用的人脸照片
images = []
images.append(cv2.imread('linyuner 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('linyuner 2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 2.jpg', cv2.IMREAD_GRAYSCALE))
# 对应标签(0代表林允儿,1代表陈都灵)
labels = [0, 0, 1, 1]
# 标签字典,用于将数字标签转换为可读名称
dic = {0: '林允儿', 1: '陈都灵', -1: '无法识别'}
# 加载待识别的人脸图像
predict_image = cv2.imread('chendulin 3.jpg', cv2.IMREAD_GRAYSCALE)
# 创建LBPH人脸识别器,设置阈值为80
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)
# 训练识别器
recognizer.train(images, np.array(labels))
# 进行预测
label, confidence = recognizer.predict(predict_image)
# 输出结果
print('这人是:', dic[label])
print('置信度', confidence)
1. 代码整体结构
这段代码实现了一个简单但完整的人脸识别系统,主要流程包括:
- 加载训练图像
- 准备对应标签
- 创建识别器
- 训练模型
- 预测新图像
- 输出结果
2. 导入库解析
import cv2
import numpy as np
- cv2:OpenCV库,提供计算机视觉相关功能,这里主要使用其人脸识别模块
- numpy:Python科学计算基础库,用于处理数组和矩阵运算
3. 训练数据准备
images = []
images.append(cv2.imread('linyuner 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('linyuner 2.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 1.jpg', cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('chendulin 2.jpg', cv2.IMREAD_GRAYSCALE))
- cv2.imread():读取图像文件
- 第一个参数:图像路径
- 第二个参数
cv2.IMREAD_GRAYSCALE
:以灰度模式读取图像,因为人脸识别通常不需要颜色信息
- 将读取的图像存储在
images
列表中
4. 标签系统
labels = [0, 0, 1, 1]
dic = {0: '林允儿', 1: '陈都灵', -1: '无法识别'}
- labels:与训练图像对应的数字标签
- 0代表"林允儿"
- 1代表"陈都灵"
- dic:字典,将数字标签映射为可读的名称
- -1表示无法识别的情况
5. 待识别图像加载
predict_image = cv2.imread('chendulin 3.jpg', cv2.IMREAD_GRAYSCALE)
- 同样以灰度模式加载待识别的图像
- 放入一张陈都灵的照片进行检验,后面代码会显示预测结果
6. LBPH识别器创建
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)
- LBPH(Local Binary Patterns Histograms):局部二值模式直方图
- 一种高效的人脸识别算法
- 对光照变化有一定鲁棒性
- threshold=80:设置识别阈值
- 当预测的置信度距离大于此值时,返回-1(无法识别)
- 这个值需要根据实际情况调整
7. 模型训练
recognizer.train(images, np.array(labels))
- 使用训练图像和对应标签训练模型
- 将Python列表转换为numpy数组,这是OpenCV函数常见的输入要求
8. 预测执行
label, confidence = recognizer.predict(predict_image)
- predict():对新的图像进行预测
- 返回两个值:
- label:预测的标签(对应之前的0或1)
- confidence:置信度(距离值),越小表示匹配度越高
9. 结果输出
print('这人是:', dic[label])
print('置信度', confidence)
- 使用字典将数字标签转换为可读名称
- 输出识别结果和置信度
- 结果输出如下:
三、 LBPH算法原理解析
LBPH工作的三个主要步骤:
-
局部二值模式(LBP)特征提取
- 对每个像素与其邻域像素比较
- 生成二进制模式
-
直方图构建
- 将图像分成多个小区域
- 为每个区域构建LBP直方图
-
比较直方图
- 比较输入图像与训练图像的直方图
- 使用卡方距离等度量方法
四、关键点解析
-
图像加载:所有图像都以灰度模式加载(
cv2.IMREAD_GRAYSCALE
),因为人脸识别通常不需要颜色信息。 -
标签系统:使用数字标签(0,1)对应不同人物,并通过字典转换为可读名称。
-
LBPH算法:Local Binary Patterns Histograms是一种高效的人脸识别算法,对光照变化有一定的鲁棒性。
-
阈值设置:阈值设为80,当预测的置信度高于此值时,返回-1(无法识别)。
-
训练与预测:先使用已知图像训练模型,然后对新的图像进行预测。
五、改进方向
- 增加更多的人脸样本以提高准确性
- 实现实时摄像头人脸识别
- 添加人脸检测功能,自动裁剪人脸区域
- 使用更先进的深度学习模型
总结
通过这个简单的示例,我们了解了如何使用OpenCV实现基础的人脸识别功能。虽然这个系统比较简单,但它展示了人脸识别的基本原理和工作流程。随着样本数量的增加和算法的优化,系统的识别准确率可以进一步提高。
希望这篇博客对你理解人脸识别技术有所帮助!如果你有任何问题或建议,欢迎在评论区留言。
万事胜意,得偿所愿!加油各位!!!🚀🚀🚀