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

淩亂°似流年 2021-10-01 04:28 528阅读 0赞

Dlib介绍

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

程序

  1. import sys
  2. import os
  3. import dlib
  4. import glob
  5. import numpy
  6. from os import listdir
  7. # 1. 人脸关键点检测器
  8. predictor_path = "shape_predictor_5_face_landmarks.dat"
  9. # 2. 人脸识别模型
  10. face_rec_model_path = "dlib_face_recognition_resnet_model_v1.dat"
  11. # 3. 候选人脸文件夹
  12. faces_folder_path = "picture/known"
  13. # 4. 需识别的人脸
  14. img_path = "picture/unknown/1.jpg"
  15. # 1. 加载人脸检测器: detector有两种选择,其中dlib.cnn_face_detection_model_v1使用的cnn进行检测
  16. detector = dlib.get_frontal_face_detector()
  17. # detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")
  18. # 2. 加载人脸关键点检测器
  19. sp = dlib.shape_predictor(predictor_path)
  20. # 3. 加载人脸识别模型
  21. facerec = dlib.face_recognition_model_v1(face_rec_model_path)
  22. """
  23. 对文件夹下的每个人脸进行:
  24. 1. 人脸检测
  25. 2. 关键点检测
  26. 3. 描述子提取
  27. """
  28. # 候选人脸描述子list
  29. descriptors = []
  30. # 保存已知的人脸名字
  31. known_face_names=[]
  32. # win = dlib.image_window()
  33. def getKnownFaceNamesAndDescriptors(path, names, descriptors):
  34. fileNameList = listdir(path)
  35. for fileName in fileNameList:
  36. filePath = path + "/" + fileName
  37. # filePath = os.path.join(faces_folder_path, fileName)
  38. index = fileName.rfind('.')
  39. names.append(fileName[:index])
  40. print("Processing file: {}".format(filePath))
  41. img = dlib.load_rgb_image(filePath)
  42. # win.clear_overlay()
  43. # win.set_image(img)
  44. # 1. 人脸检测
  45. dets = detector(img, 1)
  46. print("Number of faces detected: {}".format(len(dets)))
  47. # 处理我们找到的每个人脸
  48. for k, d in enumerate(dets):
  49. # 2. 关键点检测
  50. shape = sp(img, d)
  51. # 画出人脸区域和关键点
  52. # win.clear_overlay()
  53. # win.add_overlay(d)
  54. # win.add_overlay(shape)
  55. # 3. 描述子提取,128D向量
  56. face_descriptor = facerec.compute_face_descriptor(img, shape)
  57. # 转换为numpy array
  58. v = numpy.array(face_descriptor)
  59. descriptors.append(v)
  60. def recognition(img):
  61. # 对需要识别的人脸进行同样处理: 人脸检测,关键点检测,描述子提取
  62. # img = dlib.load_rgb_image(img_path)
  63. dets = detector(img, 1)
  64. dist = []
  65. for k, d in enumerate(dets):
  66. shape = sp(img, d)
  67. face_descriptor = facerec.compute_face_descriptor(img, shape)
  68. d_test = numpy.array(face_descriptor)
  69. # 计算欧式距离
  70. for i in descriptors:
  71. dist_ = numpy.linalg.norm(i-d_test)
  72. dist.append(dist_)
  73. # 候选人和距离组成一个dict
  74. c_d = dict(zip(known_face_names, dist))
  75. cd_sorted = sorted(c_d.items(), key=lambda d:d[1])
  76. print("The preson is:",cd_sorted[0][0])
  77. # dlib.hit_enter_to_continue()
  78. if __name__ == "__main__":
  79. # 获取已知图片的名字和描述子
  80. getKnownFaceNamesAndDescriptors(faces_folder_path, known_face_names, descriptors)
  81. # 加载待识别的图像
  82. img = dlib.load_rgb_image(img_path)
  83. # 识别
  84. 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

发表评论

表情:
评论列表 (有 0 条评论,528人围观)

还没有评论,来说两句吧...

相关阅读

    相关 人脸识别

    计划 实现了一个基于 PCA 的人脸识别 方法 ,我 称之为 “ 特征点方法 ”, 所有的功能简单而且实用 。 下面,我使用一个简单的MATLAB脚本 说明 它的用法

    相关 人脸识别

    人脸检测 [长文干货!走近人脸检测:从 VJ 到深度学习(上)][VJ] [长文干货!走近人脸检测:从VJ到深度学习(下)][VJ 1]

    相关 人脸识别系统_人脸注册

        基于上次的人脸检测后,一直纠结人脸注册,照片存放方式,我想到了两种方式,1.数据库存照片存放的路径,2.数据库存放照片的二进制码。但是针对我的毕业设计我想要是存路径的话

    相关 人脸识别系统_人脸检测

    项目:基于人脸识别的无卡ATM机模拟系统 主要实现内容: 包括实现AMT机模拟人脸识别和密码输入、PC端模拟实现储户数据库服务器系统。 1. ATM模拟端实现采用手