模型
dlib_face_recognition_resnet_model_v1.dat
shape_predictor_68_face_landmarks.dat
代码
import cv2
import dlib
import numpy as np
def main():
img1 = cv2.imread("img/img1.jpg")
img2 = cv2.imread("img/img2.jpg")
test = cv2.imread("img/test.jpg")
# 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()