Python 人脸识别系统:基于 dlib 库的实现

本文将介绍使用 Python 和 dlib 库构建一个简单的人脸识别系统。该系统包括以下功能:

  1. 人脸检测:使用 dlib 库中的 get_frontal_face_detector() 函数检测图像中的人脸。
  2. 特征提取:使用 shape_predictor_68_face_landmarks.dat 模型提取人脸特征点,并使用 dlib_face_recognition_resnet_model_v1.dat 模型计算人脸特征向量。
  3. 特征比对:将新的人脸特征向量与已知人脸特征向量进行比较,判断是否匹配。
  4. 新增人脸:添加新的人脸特征向量和对应标签到数据库中。

以下是代码实现:

import cv2
import dlib
import numpy as np
import pickle

# 加载人脸检测器和人脸识别器模型
detector = dlib.get_frontal_face_detector()  # 人脸检测器
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')  # 人脸特征点检测器
face_recognizer = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')  # 人脸识别器

# 加载已有的人脸特征向量
with open('face_encodings.pickle', 'rb') as f:
    known_face_encodings = pickle.load(f)
    
# 加载已有的人脸标签
with open('face_labels.pickle', 'rb') as f:
    known_face_labels = pickle.load(f)

# 提取人脸特征向量
def extract_face_encodings(img):
    # 缩放图像,加快检测速度
    img_small = cv2.resize(img, (0, 0), fx=0.25, fy=0.25)
    # 转换为灰度图像
    img_gray = cv2.cvtColor(img_small, cv2.COLOR_BGR2GRAY)
    # 检测人脸
    faces = detector(img_gray, 1)
    if len(faces) == 0:
        return None
    # 提取人脸特征向量
    face_encodings = []
    for face in faces:
        landmarks = predictor(img_small, face)
        face_encoding = face_recognizer.compute_face_descriptor(img_small, landmarks)
        face_encodings.append(face_encoding)
    return face_encodings

# 添加新的人脸特征向量
def add_face_encodings(face_encodings, label):
    known_face_encodings.append(face_encodings)
    known_face_labels.append(label)
    # 保存已有的人脸特征向量和标签
    with open('face_encodings.pickle', 'wb') as f:
        pickle.dump(known_face_encodings, f)
    with open('face_labels.pickle', 'wb') as f:
        pickle.dump(known_face_labels, f)

# 识别人脸
def recognize_face(img):
    # 提取人脸特征向量
    face_encodings = extract_face_encodings(img)
    if face_encodings is None:
        return None
    # 与已有的特征向量进行比对
    face_distances = np.linalg.norm(known_face_encodings - face_encodings, axis=1)
    best_match_index = np.argmin(face_distances)
    if face_distances[best_match_index] < 0.6:
        return known_face_labels[best_match_index]
    else:
        return None

# 测试程序
if __name__ == '__main__':
    # 添加新的人脸特征向量
    img1 = cv2.imread('person1.jpg')
    face_encodings1 = extract_face_encodings(img1)
    add_face_encodings(face_encodings1[0], 'person1')

    # 识别人脸
    img2 = cv2.imread('person2.jpg')
    label = recognize_face(img2)
    print(label)

说明

  • face_labels.pickle 是一个保存已知人脸标签的文件,需要自己创建并保存。可以在添加新的人脸特征向量时,将对应的人脸标签一起保存。在识别人脸时,需要加载已有的人脸标签(即通过 pickle.load() 从文件中读取),以便进行人脸比对。
  • shape_predictor_68_face_landmarks.datdlib_face_recognition_resnet_model_v1.dat 模型文件可以从 dlib 官网下载。
  • 代码中使用了 0.6 的阈值来判断是否匹配。您可以根据实际情况调整阈值。

总结

本文介绍了如何使用 Python 和 dlib 库实现简单的人脸识别系统。您可以根据自己的需求扩展该系统,例如添加人脸数据库管理功能、视频流识别功能等。


原文地址: https://www.cveoy.top/t/topic/oC4T 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录