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

[深度应用]·实战掌握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

原文地址:https://www.cnblogs.com/xiaosongshine/p/10765958.html

时间: 2024-10-08 23:30:58

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

实战 | 如何用最快的速度学会Dlib人脸识别开发?

项目GitHub地址:https://github.com/xiaosongshine/dlib_face_recognition 1.背景介绍 Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch.但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发.上面所说的人脸识别开发,主要是指人脸验证,就是输入两张人脸照片,系统会对比输出0或者1,代表判断是

[深度学习工具]&#183;极简安装Dlib人脸识别库

[深度学习工具]·极简安装Dlib人脸识别库 Dlib介绍 Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具.它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境.Dlib的开源许可证 允许您在任何应用程序中免费使用它.Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习.深度学习.图像处理等模块的开发. 安装 此博文针对Windows10安装,其他平台可以仿照这个步骤来安装 安装Minicond

dlib人脸识别

dlib人脸识别 1.dlib安装 ? 代码的编写在jupyter notebook中来完成 ? jupyter notebook是一个工具 ? pip install jupyter ------------>安装使用 ? 如何启动: ? 命令行输入:jupyter notebook ? 前提,环境变量配置成功 ? ? dlib安装-------------> pip install dlib ? dlib有不同的版本,最新版本(19.17.0),经过测试,dll包不完备,所以上次我在使用时

python3+dlib人脸识别及情绪分析

一.介绍 我想做的是基于人脸识别的表情(情绪)分析.看到网上也是有很多的开源库提供使用,为开发提供了很大的方便.我选择目前用的比较多的dlib库进行人脸识别与特征标定.使用python也缩短了开发周期. 官网对于dlib的介绍是:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起来非常简单.它用于各种应用,包括机器人技术,嵌入式设备,手机和大型高性能计算环境. 虽然应用都比较高大上,但是自己在PC上做个情绪分析的小软件还是挺有意

OpenCV 和 Dlib 人脸识别基础

00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测试 在键盘按 Win + R, 输入 cmd,回车,将会打开cmd窗口,输入 activate base, 如下所示,表明anaconda环境系统变量无误. IDE PyCharm的安装 自行百度搜索下载并破解. http://idea.lanyus.com/ OpenCV安装 C:\Users\A

微信日志开发之人脸识别开发

这节我们将简单介绍在微信日志中如何实现人脸识别功能 人脸识别我们将会使用Face++提供的api. 需要使用的id以及AppKey请到官网首页注册获取. (一)实现步骤 1.将用户发送信息获取并提交到服务器 2.服务器端处理信息并返回处理结果 3.将信息返还给用户 (二)实现代码 1.信息提取 在微信日志的主函数中我们有用户输入信息获取的函数,人脸识别的相关信息也可以在其中实现 public function __construct() { global $wpdb; if(isset($_GE

人脸识别开发套件中的在线版本与离线版人脸识别的区别及详解

关于什么是在线版人脸识别与离线版人脸识别想便是一直困扰着大家的,他们的区别是,如何收费的,采用哪种更为合适今天宁远电子就将为你详细说明. 在线版人脸识别技术是指在联网状态下,用户上传人脸图像至人脸识别系统供应商公有云服务器中完成图像识别工作,然后服务器再将人脸识别结果返回给用户,此时人脸图像一般会自动存储在公有云服务器中.目前企业选择在线API或在线SDK接口方式接入人脸识别系统,其实就是在线人脸识别技术. 离线人脸识别技术是指在离线状态下,用户上传的人脸图像不需要传输至人脸识别系统供应商公有云

JAVA性能测试实战之真实OA系统开发教程

JAVA项目性能测试实战之真实OA系统开发课程 课程观看地址:http://www.xuetuwuyou.com/course/31 课程出自学途无忧网:http://www.xuetuwuyou.com/ 通过一个真实在用的OA系统展示一个性能测试项目如何进行,包括但不限于环境搭建.性能需求分析.性能 指标制定.场景设计.脚本开发.监控部署以及性能结果分析与优化.没有废话更多的是实在接地气的知识 . 1-课程介绍与项目介绍 2-测试环境搭建和被测程序部署 3-性能测试需求分析 4-性能测试用例

全球首个实战类微信小程序开发教程

小木学堂专注于企业实战开发和经验传授,所以微信小程序诞生这么大的事怎么能不带着大家一起学习学习呢,所以小木学堂讲师连夜赶工学习并实战开发了微信小应用的第一个程序,并录制了课程现免费分享给大家.这个速度绝对是国内领先哦,来看看尝鲜开发,闲话少说,上地址.                在线免费观看地址 百度云下载:http://pan.baidu.com/s/1jIIzIKI 腾讯视频:http://v.qq.com/x/page/o03315osn5v.html csdn课程地址:http://