Python3+Dlib实现简单人脸识别案例
随着计算机视觉技术的不断发展,人脸识别技术已经越来越被重视,应用也越来越广泛,如门禁系统、安检系统等。本文介绍如何使用Python3和Dlib库实现简单的人脸识别。
1. Dlib简介
Dlib是一个跨平台的C++工具包,提供了一系列机器学习算法和工具,包括计算机视觉、图像处理、机器学习、数据分析等,并且提供了Python接口。
Dlib中提供了人脸检测、人脸关键点检测、人脸识别等功能。人脸识别是通过计算图像中人脸的特征值实现的,通常需要训练样本来提取人脸特征,并进行模型训练。在本文中,我们将使用已经训练好的人脸识别模型来识别人脸。
2. 安装Dlib
我们可以使用pip命令安装dlib库:
pip install dlib
安装完成后,我们需要下载人脸检测模型和人脸识别模型。我们可以从Dlib官网下载模型:
- 人脸检测模型:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
- 人脸识别模型:http://dlib.net/files/dlib_face_recognition_resnet_model_v1.dat.bz2
3. 实现简单人脸识别
接下来,我们来实现一个基于Dlib的简单人脸识别程序。
3.1 程序简介
本程序通过Dlib库中的人脸检测功能和人脸识别功能实现人脸识别的功能。程序使用OpenCV加载图像,并使用Dlib获取人脸位置和人脸特征。然后,将人脸特征与已有的人脸特征进行比对,找到与输入人脸最相似的人脸,并输出名字。
3.2 程序实现步骤
以下是程序的实现步骤:
- 加载已知人脸的图像,提取人脸特征;
- 加载待识别的图像,提取人脸特征;
- 计算人脸特征之间的欧氏距离,找到最相似的人脸;
- 输出识别的结果。
程序实现中,主要需要使用Dlib库的以下函数:
- dlib.get_frontal_face_detector():获取人脸检测器;
- dlib.shape_predictor():获取人脸关键点检测器;
- dlib.face_recognition_model_v1():获取人脸识别模型;
- detector(img,1):使用人脸检测器检测图像中的人脸;
- sp(img, face_rect):使用人脸关键点检测器获取人脸区域的关键点信息;
- face_descriptor = facerec.compute_face_descriptor(img, shape):计算图像中人脸的特征。
3.3 完整代码实现
import dlib
import cv2
import numpy as np
# 加载人脸检测器
detector = dlib.get_frontal_face_detector()
# 加载关键点检测器
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 加载人脸识别模型
facerec = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')
# 加载已知人脸图像和名字
img_known = cv2.imread('known.jpg')
img_known = cv2.cvtColor(img_known,cv2.COLOR_BGR2RGB)
# 检测已知人脸
dets_known = detector(img_known,1)
# 获取已知人脸特征
shapes_known = []
face_descriptors_known = []
for index, face in enumerate(dets_known):
shape = predictor(img_known, face)
face_descriptor = facerec.compute_face_descriptor(img_known, shape)
face_descriptors_known.append(face_descriptor)
# 加载待识别图像
img_unknown = cv2.imread('unknown.jpg')
img_unknown = cv2.cvtColor(img_unknown,cv2.COLOR_BGR2RGB)
# 检测待识别人脸
dets_unknown = detector(img_unknown,1)
# 获取待识别人脸特征
shapes_unknown = []
face_descriptors_unknown = []
for index, face in enumerate(dets_unknown):
shape = predictor(img_unknown, face)
face_descriptor = facerec.compute_face_descriptor(img_unknown, shape)
face_descriptors_unknown.append(face_descriptor)
# 计算已知人脸与待识别人脸之间的欧氏距离
dist = []
for i in range(len(dets_unknown)):
dist_temp = []
for j in range(len(dets_known)):
dist_temp.append(np.linalg.norm(np.array(face_descriptors_unknown[i])-np.array(face_descriptors_known[j])))
dist.append(dist_temp)
# 找到距离最小的已知人脸
min_dist_index = np.argmin(np.array(dist))
# 输出结果
if dist[min_dist_index] < 0.6:
print('我猜这是%s' % 'ZhangSan')
else:
print('我不认识这个人')
其中,’known.jpg’和’unknown.jpg’分别是已知人脸和待识别的人脸图像,本程序中已经提前准备好。
3.4 实验结果
程序输出结果正确,证明了程序的正常运行。
总结
本文主要介绍了如何使用Python3和Dlib库实现简单的人脸识别,使用Dlib库封装好的人脸识别模型和检测器,能够快速开发人脸识别应用。但是实现一个准确有效的人脸识别系统需要更多深入的研究和实验验证,本文中的人脸识别仅作为一个示例应用。