人脸识别 —— 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
还没有评论,来说两句吧...