人脸识别 —— dlib(Python版本)

Dlib介绍

       Dlib是一个现代C++框架,解决包含机器学习算法以及开发复杂软件的现实问题,它被广泛应用在工业和学术研究领域,包括机器人、嵌入式设备、移动手机以及大规模高性能计算环境中,DLib的开源使得在使用过程中方便,自由。它的主要特点有:文档说明全,高质量的代码,机器学习算法,科学计算算法,图模型推理算法,图像处理,线程,网络编程,图形用户接口,数据压缩与整合算法等,可以参考官网说明:http://dlib.net
 

程序

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)

备注 

你可以从以下路径下载需要的文件:

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

发布了47 篇原创文章 · 获赞 121 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/guoyunfei123/article/details/99572791