【技术分享】Python3 比对人脸 opencv + dlib实现 ( 第四课 )
【技术分享】Python3 比对人脸 opencv + dlib实现 ( 第四课 )
2022-07-22 / 2 评论 / 263 阅读 / 68 点赞

【技术分享】Python3 比对人脸 opencv + dlib实现 ( 第四课 )

发光的神
2022-07-22 / 2 评论 / 263 阅读 / 正在检测是否收录...

简介

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

二维公式

l5wjwgcg.png

三维公式

l5wjwyi2.png

将其扩展到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()

l5x9db65.png

68

评论 (2)

取消
  1. 头像
    HAO
    Windows 10 · Google Chrome

    都小于0.6是不是说明他们三个人是同一个人?表情

    回复
    1. 头像
      发光的神 作者
      Windows 10 · Google Chrome
      @ HAO

      不对,都像test,不代表他俩互相像,还要单独比对img1和img2

      回复
0:00