Python 人脸识别系统:基于 dlib 库的实现
Python 人脸识别系统:基于 dlib 库的实现
本文将介绍使用 Python 和 dlib 库构建一个简单的人脸识别系统。该系统包括以下功能:
- 人脸检测:使用 dlib 库中的
get_frontal_face_detector()函数检测图像中的人脸。 - 特征提取:使用
shape_predictor_68_face_landmarks.dat模型提取人脸特征点,并使用dlib_face_recognition_resnet_model_v1.dat模型计算人脸特征向量。 - 特征比对:将新的人脸特征向量与已知人脸特征向量进行比较,判断是否匹配。
- 新增人脸:添加新的人脸特征向量和对应标签到数据库中。
以下是代码实现:
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.dat和dlib_face_recognition_resnet_model_v1.dat模型文件可以从 dlib 官网下载。- 代码中使用了
0.6的阈值来判断是否匹配。您可以根据实际情况调整阈值。
总结
本文介绍了如何使用 Python 和 dlib 库实现简单的人脸识别系统。您可以根据自己的需求扩展该系统,例如添加人脸数据库管理功能、视频流识别功能等。
原文地址: https://www.cveoy.top/t/topic/oC4T 著作权归作者所有。请勿转载和采集!