基于Python的LBPH人脸识别系统
据库,通过人脸识别算法,把当前摄像头的人脸和数据库的人脸进行匹配,并把匹配度最高的人脸ID显示出来(只能输入数字ID),识别率不高。据库,通过人脸识别算法,把当前摄像头的人脸和数据库的人脸进行匹配,并把匹配度最高的人脸ID显示出来(只能输入数字ID),识别率不高。库文件:numpy、opencv-contrib-python、 opencv-python、pillow、PyQt5。库文件:nump
项目:基于Python的人脸识别 算法:LBPH算法 环境:Windows或linux或mac、pycharm 技术:opencv、PyQt5 库文件:numpy、opencv-contrib-python、 opencv-python、pillow、PyQt5 功能:先要采集人脸数据,丰富人脸基本的数 据库,通过人脸识别算法,把当前摄像头的人脸和数据库的人脸进行匹配,并把匹配度最高的人脸ID显示出来(只能输入数字ID),识别率不高。 这个项目可以做到在图像中识别出人脸,还可以识别出这是谁的人脸 本产品面向Python爱好者,和在校大学生。 不懂技术的就别问我了。 不仔细看介绍的人,也不用问我。 附带说明文档 仔细看看说明文档,我已经完善多次了,一般看着说明文档操作不会出现问题。

"哥们儿最近整了个能跑人脸识别的Python项目,用LBPH算法整活儿。这玩意儿虽然识别率不算特别顶,但胜在实现简单,特别适合拿来练手。咱们先从数据采集开始搞,毕竟没数据模型就是个弟弟。

上硬货!先整个数据采集脚本:
import cv2
import os
def collect_data(user_id):
cam = cv2.VideoCapture(0)
detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
if not os.path.exists('dataset'):
os.makedirs('dataset')
count = 0
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
cv2.imwrite(f"dataset/User.{user_id}.{count}.jpg", gray[y:y+h,x:x+w])
cv2.imshow('Collecting', img)
if cv2.waitKey(100) == 27 or count >= 100: # 按ESC或采集100张
break
cam.release()
cv2.destroyAllWindows()
这脚本用Haar级联检测器实时抓脸,存成200x200的灰度图。注意user_id必须纯数字,不然后面训练要扑街。采集的时候建议多换几个角度,别跟个木头似的杵着不动。

项目:基于Python的人脸识别 算法:LBPH算法 环境:Windows或linux或mac、pycharm 技术:opencv、PyQt5 库文件:numpy、opencv-contrib-python、 opencv-python、pillow、PyQt5 功能:先要采集人脸数据,丰富人脸基本的数 据库,通过人脸识别算法,把当前摄像头的人脸和数据库的人脸进行匹配,并把匹配度最高的人脸ID显示出来(只能输入数字ID),识别率不高。 这个项目可以做到在图像中识别出人脸,还可以识别出这是谁的人脸 本产品面向Python爱好者,和在校大学生。 不懂技术的就别问我了。 不仔细看介绍的人,也不用问我。 附带说明文档 仔细看看说明文档,我已经完善多次了,一般看着说明文档操作不会出现问题。

训练模型这块更带劲:
import cv2
import numpy as np
from PIL import Image
def train_model():
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
def get_images_labels(dataset_path):
image_paths = [os.path.join(dataset_path, f) for f in os.listdir(dataset_path)]
face_samples = []
ids = []
for path in image_paths:
pil_img = Image.open(path).convert('L') # 转灰度
img_numpy = np.array(pil_img, 'uint8')
user_id = int(os.path.split(path)[-1].split(".")[1])
faces = detector.detectMultiScale(img_numpy)
for (x,y,w,h) in faces:
face_samples.append(img_numpy[y:y+h,x:x+w])
ids.append(user_id)
return face_samples, ids
faces, ids = get_images_labels("dataset")
recognizer.train(faces, np.array(ids))
recognizer.write("trainer.yml")
LBPH算法在这三步走:提取局部二值模式直方图、计算直方图差异、k-NN分类。训练完会生成个yml文件,这就是咱们的"认脸宝典"。不过要注意,数据集质量不行的话,训练出来的模型跟瞎子差不多。

实时识别界面用PyQt5整活:
from PyQt5 import QtCore, QtWidgets
import cv2
class RecognitionThread(QtCore.QThread):
change_pixmap_signal = QtCore.pyqtSignal(QtGui.QImage)
def run(self):
cap = cv2.VideoCapture(0)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
for (x, y, w, h) in faces:
id_, confidence = recognizer.predict(gray[y:y+h,x:x+w])
cv2.putText(frame, f"ID:{id_} Conf:{confidence}", (x+5,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
# 转成Qt能显示的格式
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
qt_img = QtGui.QImage(rgb_image.data, w, h, ch*w, QtGui.QImage.Format_RGB888)
self.change_pixmap_signal.emit(qt_img)
这里有个坑爹点:confidence值越小表示匹配度越高,跟直觉相反。如果识别结果抽风,试着调整predict方法的阈值,或者给数据集来波数据增强。
项目跑起来效果可能不够理想,但重在理解流程。想提升识别率可以试试这些骚操作:
- 采集数据时加点椒盐噪声
- 训练时调整LBPH的grid参数(比如改成8x8)
- 给预测结果加个置信度阈值,低于阈值的显示"未知"
- 用dlib做人脸对齐预处理
最后提醒新人:别在弱光环境下测试,LBPH对光照变化敏感得跟女朋友似的。遇到问题先看报错信息,八成是路径问题或者库版本冲突。祝各位编码愉快,早日实现自己的"人脸通"!"
更多推荐
所有评论(0)