当前位置: 首页 > 编程日记 > 正文

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

640?wx_fmt=jpeg

作者 | 小宋是呢
来源 | 转载自小宋是呢

项目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安装,其他平台可以仿照这个步骤来安装

使用conda指令来安装Dlib库,使用Miniconda与Anaconda都可以,我习惯用Miniconda,简单占用内存小。

推荐使用清华源,下载安装,选择合适的平台版本。python==3.6

注意一定要以管理员身份进入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)可以将标记的框显示在原图上。

原始照片

640?wx_fmt=jpeg

输出照片

640?wx_fmt=png

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

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个特征点。反映在图中就是蓝色的线。

原始图片

640?wx_fmt=jpeg

输出图片

640?wx_fmt=png

注意运行这段代码需要这个文件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)	
out1 = distance(feature_lists1[0],feature_lists1[1])	
out2 = distance(feature_lists2[0],feature_lists2[1])

输出结果

检测到了 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(https://github.com/xiaosongshine/dlib_face_recognition)中,方便大家使用。

我们从上面测试的结果可以看出,不同的距离为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

原文链接:https://blog.csdn.net/xiaosongshine/article/details/89496667


精彩推荐


参与投稿加入作者群,成为全宇宙最优秀的技术人~


640?wx_fmt=png


6月29-30日,2019以太坊技术及应用大会 特邀以太坊创始人V神与以太坊基金会核心成员,以及海内外知名专家齐聚北京,聚焦前沿技术,把握时代机遇,深耕行业应用,共话以太坊2.0新生态。


扫码或点击阅读原文,既享优惠购票!


640?wx_fmt=jpeg


推荐阅读


640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢

相关文章:

matlab内存管理

转自&#xff1a;http://my.donews.com/deng/2006/09/24/vijgqxehmkxiruywdauvxyiafogtskeymhyw/ 用 Matlab 进行大规模科学计算或仿真时&#xff0c;内存是一个需要时常注意的问题。当你写的 Matlab 程序跳出“Out of Memory” 时&#xff0c;以下几点措施是需要优先考虑的解决…

Koa2和Redux中间件源码研究

一、Koa2中间件源码分析 在Koa2中&#xff0c;中间件被存放在一个数组中。 使用koa中&#xff0c;最常见的就是app.use(fn)&#xff0c;use函数部分源码如下所示。首先中间件必须是个函数。若是generator函数&#xff0c;则需要进行转化。最后把该中间件推入middelaware数组中。…

matlab内存管理(二)

转自&#xff1a;http://hi.baidu.com/bi%CB%AB%C9%FA%BB%A8/blog/item/5ab86c38ac2f45e715cecbab.html 1&#xff0c;确保内存的连续性Matlab 中数组必须占用连续分配的内存段当无法为新建的数组分配连续的内存段的时候Out of Memory 就会出现由于反复分配和释放数组会使可用的…

校招经验分享—高考结束!校招还会远么~~

作者 | 石晓文来源 | 转载自小小挖掘机&#xff08;ID: wAIsjwj&#xff09;今天是6.11&#xff0c;高考已经结束了&#xff0c;那大考-校招还会远么&#xff1f;我们先来看一下去年的校招时间表&#xff1a;互联网大厂校招一般7月就开始了&#xff0c;也就是说&#xff01;如果…

数据科学究竟是什么?

数据科学是一门将数据变得有用的学科。它包含三个重要概念&#xff1a; 统计机器学习数据挖掘/分析数据科学的定义 如果你回顾一下数据科学这个术语的[早期历史]()&#xff0c;会发现有两个主题密切相连&#xff1a; 大数据意味着计算机的使用频率增加。统计学家很难将纸张上所…

SQL with NUll处理,Join系列,between,in对比exists以及少量题目

2019独角兽企业重金招聘Python工程师标准>>> 1.一些题目: 选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜) Selecta,b,c from tableta wherea(select max(a) from tabletb where tableb.b tableta.b ) 随机抽取出10条数据 Select to…

清华大学提出APDrawingGAN,人脸照片秒变艺术肖像画

作者 | 刘永进教授来源 | 转载自数据派THU&#xff08;ID:DatapiTHU&#xff09;清华大学提出APDrawingGAN&#xff0c;该项工作被CVPR 2019录取为oral paper。CVPR是计算机视觉和人工智能领域内的国际顶级会议&#xff0c;2019共收到投稿5160篇&#xff0c;录取1300篇&#xf…

图像处理和图像识别中常用的OpenCV函数

1. cvLoadImage&#xff1a;将图像文件加载至内存&#xff1b; 2. cvNamedWindow&#xff1a;在屏幕上创建一个窗口&#xff1b; 3. cvDestroyWindow&#xff1a;销毁显示图像文件的窗口&#xff1b; 4. cvDestroyAllWindows&#xff1a;销毁显示图像文件的所有窗口…

SQLServer之DEFAULT约束

原文:SQLServer之DEFAULT约束DEFAULT约束添加规则 1、若在表中定义了默认值约束&#xff0c;用户在插入新的数据行时&#xff0c;如果该行没有指定数据&#xff0c;那么系统将默认值赋给该列&#xff0c;如果我们不设置默认值&#xff0c;系统默认为NULL。 2、如果“默认值”字…

tmux/screen里面如何用鼠标滚轮来卷动窗口内容

tmux里面用鼠标滚轮来卷动窗口内容在 tmux里面&#xff0c;因为每个窗口(tmux window)的历史内容已经被tmux接管了&#xff0c;所以原来console/terminal提供的ShiftPgUp/PgDn所显示的内容并不是当前窗口的历史内容&#xff0c;所以要用C-b [ 进入copy-mode&#xff0c;然后才能…

图像空间变换--imtransform

转自&#xff1a;http://juyishaanxi.blog.163.com/blog/static/602733002010522105439617/(非原处)空间几何变换将(w,z)坐标系上的图像变换为(x,y)坐标系上的图像&#xff0c;可以表示为&#xff1a; (x,y) T{(w,z) 比如&#xff1a; (x,y) T{(w,z)} (w/2, z/2) 仿射变…

谷歌用1.2万个模型“推翻”现有无监督研究成果!斩获ICML 2019最佳论文

作者 | 夕颜、Just出品 | AI科技大本营(ID:rgznai100)6 月 11 日&#xff0c;在美国加州长滩举行的 ICML 公布了 2019 年最佳论文奖&#xff0c;来自苏黎世联邦理工大学、谷歌大脑等的团队和英国剑桥大学团队摘得最佳论文奖项&#xff0c;此外&#xff0c;大会还公布了 7 篇获最…

实战:掌握PyTorch图片分类的简明教程 | 附完整代码

作者 | 小宋是呢转载自CSDN博客1.引文深度学习的比赛中&#xff0c;图片分类是很常见的比赛&#xff0c;同时也是很难取得特别高名次的比赛&#xff0c;因为图片分类已经被大家研究的很透彻&#xff0c;一些开源的网络很容易取得高分。如果大家还掌握不了使用开源的网络进行训练…

python group()

正则表达式中&#xff0c;group&#xff08;&#xff09;用来提出分组截获的字符串&#xff0c;&#xff08;&#xff09;用来分组 import re a "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体 print re.sea…

图像配准的方法

转自&#xff1a;http://blog.sina.com.cn/s/blog_4b9b714a0100d5k5.html 图像配准的方法 1 基于特征的图像配准 基于特征的图像配准首先提取图像信息的特征&#xff0c;然后以这些特征为模型进行配准。特征提取的结果是一含有特征的表和对图像的描述&#xff0c;每个特征由…

微软发布Visual Studio 2017 15.8

2019独角兽企业重金招聘Python工程师标准>>> 对于C#/VB/C项目&#xff0c;在Git分支检出和分支切换操作后不再需要重新加载解决方案&#xff0c;这加快了操作的完成。15.8支持新推出的F# 4.5&#xff0c;这无疑将会受到F#开发人员的欢迎。此外&#xff0c;用于F#项目…

推荐系统产品与算法概述 | 深度

作者丨gongyouliu转载自大数据与人工智能&#xff08;ID:gh_b8b5b02c348b&#xff09;作者在《推荐系统的工程实现》&#xff08;点击蓝字可回顾&#xff09;这篇文章的第五部分“推荐系统范式”中讲到工业级推荐系统有非个性化范式、完全个性化范式、群组个性化范式、标的物关…

【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...

本篇主要介绍Cocos2dx项目开发过程中或者说项目务必遇到的一些知识点&#xff08;ps.貌似Himi博客写的都是务必的 :tx: Himi认为写别人没写的才更容易吸引人不是&#xff5e;&#xff09; OK&#xff0c;不多说废话&#xff0c;第一个介绍的是修改项目配置让你的Android项目支…

matlab图像处理命令(一)

转自&#xff1a;http://blog.csdn.net/langyuewu/archive/2009/05/02/4144120.aspx(非原处) 1.applylut 功能: 在二进制图像中利用lookup表进行边沿操作. 语法: A applylut(BW,lut) 举例 lut makelut(sum(x(:)) 4,2); BW1 imread(text.tif); BW2 applylut(BW1,lut); imsh…

MYSQL 查询数据排序数据和分组数据

在mysql查询过程中&#xff0c;可以对数据进行过滤&#xff0c;也可以对数据进行排序&#xff0c;可以对数据分组&#xff0c;下面分别讲述排序数据和分组数据例子。1&#xff0c;数据的排序 使用 ORDER BYselect * from where id10 order by id (正序&#xff0c;倒序)正序 AS…

Oracle RAC系列之:利用srvctl管理RAC数据库

srvctl即Server Control&#xff0c;是Oracle提供的一个命令行工具&#xff0c;用以用于管理Oracle的RAC环境。srvctl在Oracle 9i中被引入&#xff0c;Oracle10g、11g对其功能进行了很大的增强和改进。下面介绍下此命令的简单用法。 一、 查看实例状态&#xff08;srvctl statu…

matlab图像处理命令(二)

转自&#xff1a;http://blog.163.com/crazyzcs126/blog/static/1297420502010229104452729/ (非原处) 图像增强 1. 直方图均衡化的 Matlab 实现 1.1 imhist 函数 功能&#xff1a;计算和显示图像的色彩直方图 格式&#xff1a;imhist(I,n) imhist(X,map) 说明&#x…

10万人的1000万张图像,微软悄然删除最大公开人脸数据集

作者 | 神经小姐姐转载自HyperAI超神经&#xff08;ID&#xff1a;HyperAI&#xff09;前几日&#xff0c;微软静悄悄地删除了一个公开的名人图片数据集。这个本为世界上最大的公开人脸识别数据集&#xff0c;现在已经不能通过微软的渠道访问。这个数据集包含了 10 万张名人面部…

密码学原理学习笔记

攻击的类型: 唯密文攻击(COA)&#xff1a;攻击者只知道密文 已知明文攻击(KPA)&#xff1a;攻击者知道同一密钥下密文对应的明文。 选择明文攻击(CPA)&#xff1a;攻击者可以事先任意选择一定数量的明文&#xff0c;让被攻击的加密算法加密&#xff0c;并得到相应的密文。 选择…

终于申请博客了

今天终于下定决心在51CTO博客安家了。以后要坚持不断的写博客。以此来督促自己不断的学习和总结。把自己所掌握的技术和过往经验总结出来。转载于:https://blog.51cto.com/weijishui/971044

一种二维条码图像处理流程

目前&#xff0c;二维条码主要分两类&#xff1a; (1)、堆叠式二维条码&#xff1a;PDF417、Code 49&#xff1b; (2)、矩阵式二维条码&#xff1a;QR Code、Maxicode、Data Matrix。 本条码类似于Maxicode&#xff0c;处理过程大致为&#xff1a; (1)、图像灰度化&#xff…

vue中 静态文件引用注意事项

&#xff08;一&#xff09;assets文件夹与static文件夹的区别区别一&#xff1a;assets文件是src下的&#xff0c;所以最后运行时需要进行打包&#xff0c;而static文件不需要打包就直接放在最终的文件中了区别二&#xff1a;assets中的文件在vue中的template/style下用../这种…

百度AI快车道—企业深度学习实战营,推荐系统主题专场即将开课

身处信息过载的时代&#xff0c;在各大门户网站上&#xff0c;每天会有十万左右的新闻报道产出&#xff0c;京东淘宝等购物平台每小时就有上百万的商品上架出售&#xff0c;在B站、优酷、爱奇艺、搜狐等视频网站上每秒就有几百个小时的视频上线。所有人都正在经历一场信息变革。…

SIFT特征提取算法总结

转自&#xff1a;http://www.jellon.cn/index.php/archives/374 一、综述 Scale-invariant feature transform(简称SIFT)是一种图像特征提取与匹配算法。SIFT算法由David.G.Lowe于1999年提出&#xff0c;2004年完善总结&#xff0c;后来Y.Ke(2004)将其描述子部分用PCA代替直方…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你会发现你原来的想法很可能…