Face Recognition - dlib (versão Python)

Dlib Introdução

       Dlib é um moderno C ++ quadro ao endereço incluem algoritmos de aprendizado de máquina e desenvolvimento de software de verdadeiro problema complexo, que é amplamente utilizado na pesquisa acadêmica e industrial, incluindo a robótica, dispositivos embarcados, telefones móveis e ambientes de grande escala de alta performance de computação, DLib open Fonte torna o processo fácil de usar, livre. Suas principais características são: documentação de código completo, de alta qualidade, aprendizagem de máquina algoritmos, algoritmos de computação científica, algoritmos modelo gráfico de inferência, processamento de imagem, threads, programação de rede, interface gráfica do usuário, compressão de dados e algoritmo de integração, pode consultar o site oficial Descrição: http: //dlib.net
 

programa

import sys
import os
import dlib
import glob
import numpy
from os import listdir

# 1. 人脸关键点检测器
predictor_path = "shape_predictor_5_face_landmarks.dat"

# 2. 人脸识别模型
face_rec_model_path = "dlib_face_recognition_resnet_model_v1.dat"

# 3. 候选人脸文件夹
faces_folder_path = "picture/known"

# 4. 需识别的人脸
img_path = "picture/unknown/1.jpg"


# 1. 加载人脸检测器: detector有两种选择,其中dlib.cnn_face_detection_model_v1使用的cnn进行检测
detector = dlib.get_frontal_face_detector()
# detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")

# 2. 加载人脸关键点检测器
sp = dlib.shape_predictor(predictor_path)

# 3. 加载人脸识别模型
facerec = dlib.face_recognition_model_v1(face_rec_model_path)

"""
    对文件夹下的每个人脸进行:
    1. 人脸检测
    2. 关键点检测
    3. 描述子提取
"""
# 候选人脸描述子list
descriptors = []

# 保存已知的人脸名字
known_face_names=[]

# win = dlib.image_window()

def getKnownFaceNamesAndDescriptors(path, names, descriptors):
    fileNameList = listdir(path)
    for fileName in fileNameList:
        filePath = path + "/" + fileName
        # filePath = os.path.join(faces_folder_path, fileName)
        index = fileName.rfind('.')
        names.append(fileName[:index])

        print("Processing file: {}".format(filePath))
        img = dlib.load_rgb_image(filePath)
        # win.clear_overlay()
        # win.set_image(img)

        # 1. 人脸检测
        dets = detector(img, 1)
        print("Number of faces detected: {}".format(len(dets)))

        # 处理我们找到的每个人脸
        for k, d in enumerate(dets):
            # 2. 关键点检测
            shape = sp(img, d)

            # 画出人脸区域和关键点
            # win.clear_overlay()
            # win.add_overlay(d)
            # win.add_overlay(shape)

            # 3. 描述子提取,128D向量
            face_descriptor = facerec.compute_face_descriptor(img, shape)

            # 转换为numpy array
            v = numpy.array(face_descriptor)
            descriptors.append(v)


def recognition(img):
    # 对需要识别的人脸进行同样处理: 人脸检测,关键点检测,描述子提取
    # img = dlib.load_rgb_image(img_path)
    dets = detector(img, 1)

    dist = []
    for k, d in enumerate(dets):
        shape = sp(img, d)
        face_descriptor = facerec.compute_face_descriptor(img, shape)
        d_test = numpy.array(face_descriptor)

        # 计算欧式距离
        for i in descriptors:
            dist_ = numpy.linalg.norm(i-d_test)
            dist.append(dist_)

    # 候选人和距离组成一个dict
    c_d = dict(zip(known_face_names, dist))

    cd_sorted = sorted(c_d.items(), key=lambda d:d[1])
    print("The preson is:",cd_sorted[0][0])
# dlib.hit_enter_to_continue()

if __name__ == "__main__":
    # 获取已知图片的名字和描述子
    getKnownFaceNamesAndDescriptors(faces_folder_path, known_face_names, descriptors)

    # 加载待识别的图像
    img = dlib.load_rgb_image(img_path)
    # 识别
    recognition(img)

observação 

Você pode baixar os arquivos necessários a partir do seguinte caminho:

http://dlib.net/files/shape_predictor_5_face_landmarks.dat.bz2
http://dlib.net/files/dlib_face_recognition_resnet_model_v1.dat.bz2

Publicado 47 artigos originais · Louvor obteve 121 · vista 680 000 +

Acho que você gosta

Origin blog.csdn.net/guoyunfei123/article/details/99572791
Recomendado
Clasificación