简介
在前面的几课中介绍了,如何使用dlib标定人脸 人脸检测 提取68个特征点。这次要在这两个工作的基础之上,将人脸的信息提取成一个128维的向量空间。在这个向量空间上,同一个人脸的更接近,不同人脸的距离更远。度量采用欧式距离,欧氏距离计算不算复杂。
二维公式

三维公式

将其扩展到128维的情况下
通常使用的判别阈值是0.6,即如果两个人脸的向量空间的欧式距离超过了0.6,即认定不是同一个人;如果欧氏距离小于0.6,则认为是同一个人。
完整代码
import cv2
import dlib
import numpy as np
def main():
img1 = cv2.imread("1.jpeg")
img2 = cv2.imread("2.jpeg")
test = cv2.imread("test.jpeg")
# BGR to RGB
img1 = img1[:, :, ::-1]
img2 = img2[:, :, ::-1]
test = test[:, :, ::-1]
detector = load_face_detector()
predictor = load_key_detector()
encoder = load_face_coding_feature_model()
img1_128D = encoder_face(img1,detector,predictor,encoder)[0]
img2_128D = encoder_face(img2,detector,predictor,encoder)[0]
test_128D = encoder_face(test,detector,predictor,encoder)[0]
all_image_128D = [img1_128D, img2_128D]
distance =compare_faces(all_image_128D,test_128D)
print(distance)
# 加载人脸检测器
def load_face_detector():
return dlib.get_frontal_face_detector()
# 加载关键点模型
def load_key_detector():
return dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 加载人脸编码特征模型
def load_face_coding_feature_model():
return dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
# 关键点编码为128D
def encoder_face(image,detector,predictor,encoder,upsample=1,jet=1):
# 检测人脸(检测到几张人脸)
faces = detector(image,upsample)
# 对检测的人脸进行关键点检测
faces_key_points = [predictor(image,face) for face in faces]
# 对每张检测点进行128D
return [np.array(encoder.compute_face_descriptor(image,faces_key_point,jet)) for faces_key_point in faces_key_points]
# 人脸比较,通过欧式距离
def compare_faces(face_encoding, test_encoding):
return list(np.linalg.norm(np.array(face_encoding) - np.array(test_encoding), axis=1))
if __name__ == '__main__':
main()

都小于0.6是不是说明他们三个人是同一个人?
不对,都像test,不代表他俩互相像,还要单独比对img1和img2