CentOS下-Python-人脸识别-DLib的使用
1. 人脸识别的流程原理
# 人脸识别的原理
本质上是获取人脸图像的特征点位(向量), 将多张图像直接的特征点位进行欧式距离计算, 设定阈值范围, 小于这个范围认同是一个人,否则不是
# Dlib 人脸识别的思路梳理:
1. 准备人脸识别的训练数据和特征检测数据
2. 分别获取已有图片和被检测图片的人脸特征向量
3. 计算它们之间的欧式距离
4. 判断阈值
准备已有图片 和 被检测图片的素材
1.准备工作
需要提前准备人脸5特征点检测器数据和 人脸识别模型数据, 具体数据见底部链接
shape_predictor_5_face_landmarks.dat
shape_predictor_68_face_landmarks.dat
dlib_face_recognition_resnet_model_v1.dat
2. 识别类创建
import os
import cv2
import numpy
import dlib
class FaceRecogination(object):
def __init__(self):
# 1. 创建 Dlib 的正向人脸检测器
self.detector = dlib.get_frontal_face_detector()
# 2. 创建 Dlib 的人脸5特征点检测器
self.predictor = dlib.shape_predictor("api/utils/data_dlib/shape_predictor_5_face_landmarks.dat")
# 3. 导入 Dlib 预先学习的人脸识别模型
self.face_rec = dlib.face_recognition_model_v1("api/utils/data_dlib/dlib_face_recognition_resnet_model_v1.dat")
# 根据 参数(图片路径) 返回单张人脸图像的128D特征
def get_face_128d_features(self, image_path):
"""
根据上传的图片 识别单张人脸 的 128D特征
:param image_path: 图片路径
:return: "-0.0123421 0.087358 ... 0.087349 0.045566"
"""
# 1.采用 opencv 读取图片中的数据
img_read = cv2.imdecode(numpy.fromfile(image_path, dtype=numpy.uint8), -1)
# 2.由于 opencv 读取图片色值默认为 bgr 顺序,这里采用 opencv 的 cvtColor 把图片改为rgb顺序图
img_gray = cv2.cvtColor(img_read, cv2.COLOR_BGR2RGB)
# 3.采用 Dlib 的正向人脸检测器 预先检测人脸情况并存入 faces 列表
faces_list = self.detector(img_gray, 1)
# 4. 根据 faces_list的长度判断 是否是人脸, 是1个, 还是多个
if len(faces_list) == 0:
# 检测不到人脸 删除图片
os.remove(image_path)
return 0
if len(faces_list) > 1:
# 检测人脸数大于2 删除图片
os.remove(image_path)
return 1
if len(faces_list) == 1:
# 如果人脸数为 1
# 5. 采用 Dlib 的人脸5特征点检测器
shape = self.predictor(img_gray, faces_list[0])
# 6.生成单张人脸图像的128D特征
face_128d_f = self.face_rec.compute_face_descriptor(img_gray, shape)
return face_128d_f
3. 计算 特征点位之间的欧式距离
def compare_euclidean_distance(self, save_photo_features, not_detected_features):
"""
计算欧式距离
:param save_photo_features: 已有图片的特征向量
:param not_detected_features: 未检测的图片特征向量
:return: bool True 通过, False 未通过
"""
distance = np.linalg.norm(save_photo_features-not_detected_features)
standard = 0.6 # 阈值范围在LFW数据集的设置是0.6 精准度99.38%, 建议亚洲设定低一些
return distance <= standard
4. 测试
4.1 准备测试图片
4.2 分别计算3张图片的特征向量--再把后2张的特征向量和第一张计算欧氏距离
face_rec_obj = FaceRecogination()
tou_128D = face_rec_obj.get_face_128d_features('./tou.jpg')
print(list(tou_128D))
tou2_128D = face_rec_obj.get_face_128d_features('./tou2.jpg')
print(list(tou2_128D))
tou3_128D = face_rec_obj.get_face_128d_features('./tou3.jpg')
print(list(tou3_128D))
print(face_rec_obj.compare_euclidean_distance(np.array(list(tou_128D)), np.array(list(tou2_128D))))
# True 识别通过
print(face_rec_obj.compare_euclidean_distance(np.array(list(tou_128D)), np.array(list(tou3_128D))))
# False 识别不通过
数据下载地址
链接:https://pan.baidu.com/s/1a1fWBLpFMkMtceiqP-_u6Q?pwd=btg4
提取码:btg4