项目:基于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方法的阈值,或者给数据集来波数据增强。

项目跑起来效果可能不够理想,但重在理解流程。想提升识别率可以试试这些骚操作:

  1. 采集数据时加点椒盐噪声
  2. 训练时调整LBPH的grid参数(比如改成8x8)
  3. 给预测结果加个置信度阈值,低于阈值的显示"未知"
  4. 用dlib做人脸对齐预处理

最后提醒新人:别在弱光环境下测试,LBPH对光照变化敏感得跟女朋友似的。遇到问题先看报错信息,八成是路径问题或者库版本冲突。祝各位编码愉快,早日实现自己的"人脸通"!"

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐