Python调⽤dlib库实现⼈脸识别—AI初学者快速体验⼈⼯智能
实现
⼀  ⼈脸识别基本概念
⼆  ⼯具和环境安装准备
1. 安装CMake
2. 安装dlib
3. 安装scikit-image
三  ⼈脸识别实践 (⼈脸识别与⽐较)
1. 实验准备
2. 识别逻辑简述
3. 具体代码
4. 运⾏与结果
四  ⼈脸识别实践⼆  (特征点描绘)
1. face_detector.py
2. face_landmark_detection.py
⼀  ⼈脸识别基本概念
基本概念先说明下,⼈脸检测解决的问题是确定⼀张图上有⽊有⼈脸,⽽⼈脸识别解决的问题是这个脸是谁的。可以说⼈脸检测是是⼈识别的前期⼯作。下⾯要做的是⼈脸识别。
要实现⼈脸识别,⼈脸对齐(face alignment)是基本的算法,⽬前主要的算法有ERT、SDM、LBF等,其中由于dlib开源库实现了ERT算法,效果不错,这⾥使⽤dlib,并通过python来实现。
⽤Dlib来实现⼈脸识别,它已经替我们做好了绝⼤部分的⼯作,我们只需要去调⽤就⾏了。Dlib⾥⾯有⼈脸检测器,有训练好的⼈脸关键点检测器,也有训练好的⼈脸识别模型。这⾥主要记录实现过程,不分析细节原理。可以到官⽹查看源码以及实现的参考⽂献。
具体算法后⾯有时间要研究下。
另,这篇⽂章推荐来看看:浙⼤⼀篇毕业论⽂ ⼀种基于随机森林的实时⼈脸关键点定位实现.docx
⼆  ⼯具和环境安装准备
CMake
Dlib
scikit-image
以上是正确的安装流程。如果先安装Dlib,会报如下错误:(截取最后⼏⾏):
1. 安装CMake
下载链接
⽤的windows机器,直接双击安装,注意:安装完了⼀定要设置path变量中CMake的路径。
DLIB下载安装
2. DLIB下载安装
(下载链接⼆解包后有全套说明⼿册再docs⽬录,推荐)
下载链接⼀:
下载后保存:
或下载链接⼆:如下
执⾏  python setup.py install  成功。
3.  安装 scikit-image
pip install scikit-image
三  ⼈脸识别实践
1. 实验准备
所有需要的⽂件及⽬录如下:
所有⽂件都可以在以下⽹址下载:。然后准备⼏个⼈的⼈脸图⽚作为候选⼈脸,最好是正脸。放到girls⽂件夹中。
这⾥,shape_predictor_68_face_landmarks.dat是已经训练好的⼈脸关键点检测器。dlib_face_recognition_resnet_model_v1.dat 是训练好的ResNet⼈脸识别模型。(说明:ResNet是何凯明在微软的时候提出的深度残差⽹络,获得了 ImageNet 2015 冠军,通过让⽹络对残差进⾏学习,在深度和精度上做到了⽐ CNN 更加强⼤。)
六个候选⼈特征图⽚放在girls⽂件夹中,然后需要识别的⼈脸图⽚test1.jpg、test2.jpg、test3.jpg、test4.jpg。下⾯⼯作就是检测到test*.jpg中的⼈脸,然后判断她到底是候选⼈中的谁。girl-face-rec.py是实现⼈脸识别的python脚本。
六个候选⼈特征如下:
四个待测试⼈脸如下:
识别逻辑简述
2. 识别逻辑简述
以上数据准备完毕。识别的⼤致流程是这样的:
1)先对候选⼈进⾏⼈脸检测、关键点提取、描述⼦⽣成后,把候选⼈描述⼦保存起来。
2)然后对测试⼈脸进⾏⼈脸检测、关键点提取、描述⼦⽣成。
3)最后求测试图像⼈脸描述⼦和候选⼈脸描述⼦之间的欧⽒距离,距离最⼩者判定为同⼀个⼈。
3. 具体代码
具体代码
# -*- coding: UTF-8 -*-
import sys,os,dlib,glob,numpy
from skimage import io
if len(sys.argv) != 5:
print('请检查参数是否正确')
exit()
# 1.⼈脸关键点检测器
predictor_path = sys.argv[1]
# 2.⼈脸识别模型
face_rec_model_path = sys.argv[2]
# 3.候选⼈脸⽂件夹
faces_folder_path = sys.argv[3]python新手快速入门
# 4.需识别的⼈脸
img_path = sys.argv[4]
# 1.加载正脸检测器
detector = _frontal_face_detector()
# 2.加载⼈脸关键点检测器
sp = dlib.shape_predictor(predictor_path)
# 3. 加载⼈脸识别模型
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
# win = dlib.image_window()
# 候选⼈脸描述⼦list
descriptors = []
# 对⽂件夹下的每⼀个⼈脸进⾏:
# 1.⼈脸检测
# 2.关键点检测
# 3.描述⼦提取
for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")):
print("Processing file: {}".format(f))
img = io.imread(f)
#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 = facerecpute_face_descriptor(img, shape)
# 转换为numpy array
v = numpy.array(face_descriptor)
descriptors.append(v)
# 对需识别⼈脸进⾏同样处理
# 提取描述⼦,不再注释
img = io.imread(img_path)
dets = detector(img, 1)
dets = detector(img, 1)
dist = []
for k, d in enumerate(dets):
shape = sp(img, d)
face_descriptor = facerecpute_face_descriptor(img, shape)
d_test = numpy.array(face_descriptor)
# 计算欧式距离
for i in descriptors:
dist_ = (i-d_test)
dist.append(dist_)
# 候选⼈名单
candidate = ['Unknown1','Unknown2','Shishi','Unknown4','Bingbing','Feifei']
# 候选⼈和距离组成⼀个dict
c_d = dict(zip(candidate,dist))
cd_sorted = sorted(c_d.items(), key=lambda d:d[1])
print('\n The person is: %s' % ( cd_sorted[0][0] )  )
dlib.hit_enter_to_continue()
4. 运⾏与结果
执⾏命令:python girl-face-rec.py
shape_predictor_68_face_landmarks.dat dlib_face_recognition_resnet_model_v1.dat ./girls test1.jpg 运⾏结果如下:(识别出test1.jpg 是girls5.jpg ...  前⾯三个都正确)
四  ⼈脸识别实践⼆
在官⽹上下载的包⾥有python的sample代码,介绍了如何使⽤dlib进⾏⼈脸识别。
下⾯实践两个: 代码分析如下,具体分析见代码注释: