[深度应用]·实战掌握dlib人脸识别开发教程

xiaosongshine xiaosongshine     2022-11-30     127

关键词:

[深度应用]·实战掌握Dlib人脸识别开发教程

个人网站--> http://www.yansongsong.cn/

项目GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition

1.背景介绍

Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch。但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发。

上面所说的人脸识别开发,主要是指人脸验证,就是输入两张人脸照片,系统会对比输出0或者1,代表判断是否是同一个人。一般的人脸识别开发可以简单分为1.人脸特征建模2.使用人脸特征模型进行验证(其实还应包括人脸对齐等,这些也可以划分到1中)。使用Dlib进行开发时,我们直接可以使用训练好的人脸特征提取模型,主要的工作就变成了如何进行人脸的验证。

人脸的验证其实就是计算相似度,同一个人的相似度就会大,不同的人就会比较小。可以采用余弦相似度或者欧式距离来计算相似度。其中余弦相似度就是计算角度,欧式距离就是指平方差。都可以用来表示两个特征的相似度(距离)。

 

2.环境搭建

安装可以参考我的这篇博客:[深度学习工具]·极简安装Dlib人脸识别库,下面说一下需要注意的点::

此博文针对Windows10安装,其他平台可以仿照这个步骤来安装

  • 安装Miniconda

使用conda指令来安装Dlib库,使用Miniconda与Anaconda都可以,我习惯用Miniconda,简单占用内存小。
推荐使用清华源,下载安装,选择合适的平台版本。python==3.6

  • 安装dlib
    注意一定要以管理员身份进入CMD,执行(如果是Linux Mac 就使用 sudo)
conda install -c conda-forge dlib
技术图片
  • 需要imageio 库,可以使用下述命令安装
conda install imageio
技术图片

3.开发实战 

 

1.实现人脸检测标记

face_test.py

import dlib
from imageio import imread
import glob


detector = dlib.get_frontal_face_detector()
win = dlib.image_window()

path = "f1.jpg"
img = imread(path)
dets = detector(img)
print(‘检测到了 %d 个人脸‘ % len(dets))
for i, d in enumerate(dets):
	print(‘- %d:Left %d Top %d Right %d Bottom %d‘ % (i, d.left(), d.top(), d.right(), d.bottom()))

win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()

  

技术图片

代码很简单,通过imread读取照片,然后进行检测,输出结果为dets的list,有几张人脸就会有几个item, 每个item都有.left(), .top(), .right(), .bottom()四个元素,代表人脸框的四个边界位置。最后通过win.add_overlay(dets)可以将标记的框显示在原图上。

原始照片
技术图片技术图片?
输出照片
技术图片技术图片?

其实我们就可以使用这个功能做一个简单的应用,用来检测图片或者视频中人脸的个数。

2.人脸特征点提取

在实战1的基础上添加人脸特征提取功能。

import dlib
from imageio import imread
import glob


detector = dlib.get_frontal_face_detector()
win = dlib.image_window()

predictor_path = ‘shape_predictor_68_face_landmarks.dat‘
predictor = dlib.shape_predictor(predictor_path)

path = "f2.jpg"
img = imread(path)
dets = detector(img)
print(‘检测到了 %d 个人脸‘ % len(dets))


for i, d in enumerate(dets):
	print(‘- %d: Left %d Top %d Right %d Bottom %d‘ % (i, d.left(), d.top(), d.right(), d.bottom()))
	shape = predictor(img, d)
	# 第 0 个点和第 1 个点的坐标
	print(‘Part 0: , Part 1: ‘.format(shape.part(0), shape.part(1)))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
win.add_overlay(shape)


dlib.hit_enter_to_continue()

  

  

技术图片

这段代码就是在test.py基础上加入了shape_predictor功能,使之可以在检测出人脸基础上,找到人脸的68个特征点。反映在图中就是蓝色的线。

 

原始图片

技术图片技术图片?

输出图片

技术图片技术图片?

注意运行这段代码需要这个文件predictor_path = ‘shape_predictor_68_face_landmarks.dat‘,我会放在我的github中,方便大家下载使用。

3.人脸识别验证

在第二步的基础上,我们再进一步,实现将人脸提取为特征向量,从而我们就可以对特征向量进行比对来实现人脸的验证,这里采用的是对比欧式距离的方法。

face_recognition.py

import dlib
from imageio import imread
import glob
import numpy as np

detector = dlib.get_frontal_face_detector()
predictor_path = ‘shape_predictor_68_face_landmarks.dat‘
predictor = dlib.shape_predictor(predictor_path)
face_rec_model_path = ‘dlib_face_recognition_resnet_model_v1.dat‘
facerec = dlib.face_recognition_model_v1(face_rec_model_path)


def get_feature(path):
	img = imread(path)
	dets = detector(img)
	print(‘检测到了 %d 个人脸‘ % len(dets))
	# 这里假设每张图只有一个人脸
	shape = predictor(img, dets[0])
	face_vector = facerec.compute_face_descriptor(img, shape)
	return(face_vector)

def distance(a,b):
	a,b = np.array(a), np.array(b)
	sub = np.sum((a-b)**2)
	add = (np.sum(a**2)+np.sum(b**2))/2.
	return sub/add

path_lists1 = ["f1.jpg","f2.jpg"]
path_lists2 = ["赵丽颖照片.jpg","赵丽颖测试.jpg"]

feature_lists1 = [get_feature(path) for path in path_lists1]
feature_lists2 = [get_feature(path) for path in path_lists2]

print("feature 1 shape",feature_lists1[0].shape)

out1 = distance(feature_lists1[0],feature_lists1[1])
out2 = distance(feature_lists2[0],feature_lists2[1])

print("diff distance is",out1)
print("same distance is",out2)

  

 

  

技术图片

输出结果

检测到了 1 个人脸
检测到了 1 个人脸
检测到了 1 个人脸
检测到了 1 个人脸

feature 1 shape (128, 1)

diff distance is 0.254767715912
same distance is 0.0620976363391
技术图片

我们可以看出,每张人脸都被提取为了128维的向量,我们可以理解为128维的坐标(xyz是三维,128维就是有128个轴组成),我们下面需要做的就是计算两个特征的距离,设定好合适的阈值,小于这个阈值则识别为同一个人。代码正确运行需要这个文件face_rec_model_path = ‘dlib_face_recognition_resnet_model_v1.dat‘,我已经放在自己的github中,方便大家使用。

我们从上面测试的结果可以看出,不同的距离为0.25,同一个人为0.06,阈值就可以先设置为其间的一个值。我这里先设置为0.09,这个阈值也是需要大量数据来计算的,选择的准则为使错误识别为最低。

下面我们把阈值设置为0.09,来测试系统能否区分出不同的人:在face_recognition.py加入下面代码

def classifier(a,b,t = 0.09):
  if(distance(a,b)<=t):
    ret = True
  else :
    ret = False
	return(ret)

  

print("f1 is 赵丽颖",classifier(feature_lists1[0],feature_lists2[1])) print("f2 is 赵丽颖",classifier(feature_lists1[1],feature_lists2[1])) print("赵丽颖照片.jpg is 赵丽颖测试.jpg",classifier(feature_lists2[0],feature_lists2[1]))
技术图片

输出结果

f1 is 赵丽颖 False
f2 is 赵丽颖 False
赵丽颖照片.jpg is 赵丽颖测试.jpg True
技术图片

从上面可以看出,已基本满足对人脸区分的功能,如果如要实用化则需要继续调优阈值与代码,调优的准则就是选择合适的阈值使错误识别为最低。

Hope this helps

个人网站--> http://www.yansongsong.cn/

项目GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition

人脸识别完整项目实战:完整项目案例运行演示

...的算法原理和实现机制,让大家对人脸识别与机器学习、深度学习进行有效关联;学习框架篇:系统介绍主流深度学习框架,重点就本课程用到Dlib深度学习框架进行介绍,通过dlib深度学习实战案例1和dlib深度学习实战案例2,两... 查看详情

dlib人脸识别(代码片段)

...人脸,启用算法时,人脸特征数据:haar?dlib底层使用的是深度神经网络?所以dlib识别准确率,要比opencv(cv2)高?pipinstallopencv-python?我们就可以在代码中,导包了?dlib调用相应方法,识别人脸?face_detector=dlib.get_frontal_face_detector()?调... 查看详情

人脸识别完整项目实战(14):实时人脸特征点标定程序设计

一、前言本文是《人脸识别完整项目实战》系列博文第14章《实时人脸特征点标定程序设计》,本章内容详细介绍Win10环境下,基于VisualStudio2015+Opencv+Dlib开发环境,如何实现实时视频流人脸特征点标定程序的设计。本文内容已经... 查看详情

dlib+opencv深度学习人脸识别

目录(?)[+]DlibOpenCV深度学习人脸识别前言人脸数据库导入人脸检测人脸识别异常处理  Dlib+OpenCV深度学习人脸识别   前言人脸识别在LWF(LabeledFacesintheWild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非... 查看详情

『python开发实战菜鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自己的人脸识别项目(代码片段)

...1a;手把手教学使用VSCode开发Python0x01:引子 Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch。但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸... 查看详情

深度学习项目演练:如何使用python和opencv进行人脸识别(代码片段)

...脸识别-在实时实时视频中检测和识别出一个人。在这个深度学习项目中,我们将学习如何使用Python识别实时视频中的人脸。我们将使用pythondlib的面部识别网络构建这个项目。Dlib是一个通用的软件库。使用dlib工具包,我... 查看详情

人脸识别实战:使用pythonopencv和深度学习进行人脸识别(代码片段)

在本教程中,您将学习如何使用OpenCV、Python和深度学习执行面部识别。我们将首先简要讨论基于深度学习的面部识别的工作原理,包括“深度度量学习”的概念。从那里,我将帮助您安装实际执行人脸识别所需的库。... 查看详情

视频是不能p的系列:使用dlib实现人脸识别

...实现对人脸的检测,并在此基础上实现了某种相对有趣的应用。譬如,利用人脸特征点提取面部轮廓并生成表情包、将图片中的人脸批量替换为精神污染神烦狗等等。当然,在真实的应用场景中,如果只是检测到人脸,那显然远... 查看详情

视频是不能p的系列:使用dlib实现人脸识别

...实现对人脸的检测,并在此基础上实现了某种相对有趣的应用。譬如,利用人脸特征点提取面部轮廓并生成表情包、将图片中的人脸批量替换为精神污染神烦狗等等。当然,在真实的应用场景中,如果只是检测到人脸,那显然远... 查看详情

基于python_opencv人脸录入识别系统(应用dlib机器学习库)(代码片段)

基于python_opencv人脸录入、识别系统(应用dlib机器学习库)近几年应用opencv机器学习方法识别人脸的技术成为了热潮,本人根据当今的识别技术与方法,历时四个多月开发出一套基于dlib机器学习库的识别项目。希... 查看详情

win10+anaconda+cuda配置dlib,使用gpu对dlib的深度学习算法进行加速(以人脸检测为例)

...就是dlib,与opencv相比其包含了很多最新的算法,尤其是深度学习方面的,因此很有必要学习一下。恰好最近换了一台笔记本,内含一块GTX1060的显卡,可以用来更快地跑深度学习算法。以前用公司HP的工作站配置过dlib,GPU是QuadroK... 查看详情

视频是不能p的系列:使用dlib实现人脸识别

...实现对人脸的检测,并在此基础上实现了某种相对有趣的应用。譬如,利用人脸特征点提取面部轮廓并生成表情包、将图片中的人脸批量替换为精神污染神烦狗等等。当然,在真实的应用场景中,如果只是检测到人脸,那显然远... 查看详情

pytorch深度学习实战|基于resnet的人脸关键点检测

...均将人脸关键点检测作为其前序步骤来实现。本文将通过深度学习的方法来搭建一个人脸关键点检测模型。1995年,Cootes提出ASM(activeshapemodel)模型用于人脸关键点检测,掀起了一波持续多年的研究浪潮。这一阶段的检测算... 查看详情

基于dlib人脸检测(图像视频)demo(代码片段)

1、Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口2、由于Dlib对于人脸特征提取支持很好,很多训练好的人脸特征提取模型提供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发官网... 查看详情

基于dlib人脸检测(图像视频)demo(代码片段)

1、Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口2、由于Dlib对于人脸特征提取支持很好,很多训练好的人脸特征提取模型提供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发官网... 查看详情

opencv联合dlib视频人脸识别例子(代码片段)

本篇文章是在上一篇文章opencv联合dlib人脸识别例子的基础上做了一个实时视频人脸识别功能。原理是利用opencv实时提取视频中的视频流,然后进入人脸检测步骤,步骤类似上篇文章。本篇文章中的程序是在VMware虚拟机下... 查看详情

dlib库的68特征原理人脸关键点检测原理

...脸识别模型。(说明:ResNet是何凯明在微软的时候提出的深度残差网络,获得了ImageNet2015冠军,通过让网络对残差进行学习,在深度和精度上做到了比 CNN更加强大。)///////////////////////////////////////////////////////////////////////////... 查看详情

dlib问题的Android人脸识别

...2018-12-0707:38:07【问题描述】:我正在使用以下链接在我的应用中实现人脸识别Thislinkisforandroidfacerecognition问题:我无法在androidstudio中运行/编译/构建此目录,因为它不包含build.gradle文件。我也尝试过导入其应用级模块(其中包含g 查看详情