关键词:
文章目录
开源GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition
推荐补充阅读:『Python开发实战菜鸟教程』工具篇:手把手教学使用VSCode开发Python
0x01:引子
Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch。但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发。
上面所说的人脸识别开发,主要是指人脸验证,就是输入两张人脸照片,系统会对比输出0或者1,代表判断是否是同一个人。一般的人脸识别开发可以简单分为1.人脸特征建模与2.使用人脸特征模型进行验证(其实还应包括人脸对齐等,这些也可以划分到1中)。使用Dlib进行开发时,我们直接可以使用训练好的人脸特征提取模型,主要的工作就变成了如何进行人脸的验证。
人脸的验证其实就是计算相似度,同一个人的相似度就会大,不同的人就会比较小。可以采用余弦相似度或者欧式距离来计算相似度。其中余弦相似度就是计算角度,欧式距离就是指平方差。都可以用来表示两个特征的相似度(距离)。
0x02:环境搭建
安装可以参考我的这篇博客:[深度学习工具]·极简安装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
0x03:开发实战
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)
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中,方便大家使用。
我们从上面测试的结果可以看出,不同的距离为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]))
对比图片组1:f1 vs 赵丽颖1
对比图片组2:f2 vs 赵丽颖1
对比图片组3:赵丽颖2 vs 赵丽颖1
输出结果
f1 is 赵丽颖 False
f2 is 赵丽颖 False
赵丽颖照片.jpg is 赵丽颖测试.jpg True
从上面可以看出,已基本满足对人脸区分的功能,如果如要实用化则需要继续调优阈值与代码,调优的准则就是选择合适的阈值使错误识别为最低。
0x04:总结
这篇文章带着大家了解人脸识别应用原理及手把手教学如何实现自己的人脸识别项目,如果想更深入了解人脸识别算法及应用,可以参阅笔者往期博文。
下面是开源地址,完整代码及数据在上面,欢迎Star及Fork:
项目GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition
这个博客对你有用的话欢迎收藏转发,也麻烦可爱又爱学的你能赏个赞,菜小宋更博不易,在这里谢过啦。
如果你想学习更多开发技巧与AI算法,欢迎搜索关注笔者公众号“简明AI”,和爱学习讨论的小伙伴一起交流学习。
『python开发实战菜鸟教程』工具篇:手把手教学使用vscode开发python(代码片段)
...3;的赞同有收藏,博客列表如下:『Python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析CSDN与博客园博客阅读数据『Python开发实战菜鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自... 查看详情
unity实战100例教程专栏《导航帖》,带你深入学习unity实战经验(代码片段)
...用软件制作篇🎅总结🚀往期优质文章分享【游戏开发爱好者社区】活动进行中,每周打卡送书籍等礼品,期待你的加入📣前言本文章为Unity实战100例教程专栏导航帖,正在积极更新中!本系列博客争... 查看详情
unity实战100例教程专栏《导航帖》,带你深入学习unity实战经验(代码片段)
...用软件制作篇🎅总结🚀往期优质文章分享【游戏开发爱好者社区】活动进行中,每周打卡送书籍等礼品,期待你的加入📣前言本文章为Unity实战100例教程专栏导航帖,正在积极更新中!本系列博客争... 查看详情
『python开发实战菜鸟教程』工具篇:手把手教学使用vscode开发python(代码片段)
文章目录:0X01:引子Python学习资料及开发工具介绍 0x02:实操基于Conda的Python安装VSCode的安装使用安装插件管理按钮使用介绍VSCode如何管理项目文件VSCode如何切换使用PythonVSCode如何执行Python文件 0x03:尾巴0X01... 查看详情
『python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析csdn与博客园博客阅读数据(代码片段)
文章目录0x01:引子首先介绍一下网络爬虫是什么,可以用来做什么?这里简单探讨一下网络爬虫的合法性正式进入爬虫实战前,需要我们了解下网页结构HTMLCSSJScript写一个简单的HTML0x02:实操安装依赖爬虫的基... 查看详情
小白都能看懂的实战教程手把手教你pythonweb全栈开发(day4)(代码片段)
...guānjié),这个《小白都能看懂的实战教程手把手教你PythonWeb全栈开发》是一个零基础的实战教程,手把手带你开发一套系统,带你了解Pythonweb全栈开发,目前正在连续更新中,如果喜欢的话可以点赞关注博主&... 查看详情
『python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析csdn与博客园博客阅读数据(代码片段)
...阅读量0x03:后记推荐补充阅读:『Python开发实战菜鸟教程』工具篇:手把手教学使用VSCode开发Python0x01:引子这是一个网络爬虫快速入门实战教程,笔者希望读者能跟着这个博客进行实操,从而掌握网络爬... 查看详情
概念+实战讲解!一文带你了解rfm模型kaggle项目实战分享数据分析(代码片段)
...评分后输出目标用户基于RFM的常用策略补充三、kaggle项目实战讲解1数据探 查看详情
node.js实战一文带你开发博客项目之登录(前置知识)(代码片段)
...e.js(一)初识Node.jsNode.js(二)Node.js——开发博客项目之接口Node.js(三)Node.js——一文带你开发博客项目(使用假数据处理)Node.js(四)Node.js——开发博客项目之MySQL基础Node.js(五... 查看详情
node.js实战一文带你开发博客项目(mysql基础)(代码片段)
...e.js(一)初识Node.jsNode.js(二)Node.js——开发博客项目之接口Node.js(三)Node.js——一文带你开发博客项目(使用假数据处理)文章目录Node.js系列文章目录一、前言二、创建表1、创建users表2、创建... 查看详情
玩转rabbitmq系列02:rabbitmq保姆级安装教程与基本消息模型实战(代码片段)
...x1f3e0;个人主页:啊陈晓🎉学习方向:java后端开发🎁我的上一篇文章:【玩转Rabbitmq系列】01:一文带你敲响Rabbitmq的大门💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力【玩转Rabbitm... 查看详情
一文读懂:python爬虫超详细讲解带你实战爬知乎(零基础入门,男女老少都看的懂)(代码片段)
爬虫的基本流程网络爬虫的基本工作流程如下:首先选取一部分精心挑选的种子URL将种子URL加入任务队列从待抓取URL队列中取出待抓取的URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已... 查看详情
node.js实战一文带你开发博客项目(api对接mysql)(代码片段)
...e.js(一)初识Node.jsNode.js(二)Node.js——开发博客项目之接口Node.js(三)Node.js——一文带你开发博客项目(使用假数据处理)Node.js(四)Node.js——开发博客项目之MySQL基础文章目录Node.js... 查看详情
手摸手,带你用vue撸后台系列三(实战篇)
...它,说一下我选择Element的原因吧:有大厂背书:虽然核心开发只有三 查看详情
node.js实战一文带你开发博客项目之联调(导入htmlnginx反向代理cors解决跨域与前端联调)(代码片段)
个人简介👀个人主页:前端杂货铺🙋♂️学习方向:主攻前端方向,也会涉及到服务端📃个人状态:在校大学生一枚,已拿多个前端offer(秋招)🚀未来打算:为中国的工业软件... 查看详情
springcloudalibaba企业落地实战:一文带你掌握nacos基础应用(代码片段)
1.为什么使用选择nacosnacos在springcloud体系中作为注册中心与配置中心使用。相当于eureka与apollo的功能。一个老生常谈的问题nacos和eureka区别,下图是楼主在网上查找到。但是在楼主实际应用中还有以下有点特别称道:nacos... 查看详情
springcloudalibaba企业落地实战:一文带你掌握nacos基础应用(代码片段)
1.为什么使用选择nacosnacos在springcloud体系中作为注册中心与配置中心使用。相当于eureka与apollo的功能。一个老生常谈的问题nacos和eureka区别,下图是楼主在网上查找到。但是在楼主实际应用中还有以下有点特别称道:nacos... 查看详情
保姆级别指导开发ui应用实战指导建议收藏(代码片段)
正式的Python专栏第7篇,同学站住,别错过这个从0开始的文章!前面,学委写了两篇保姆级别UI教程,从入门【一个窗口放两个按钮,点击来提示不同消息】,到细讲UI掌握网格布局,都挺受欢迎的... 查看详情