介绍
DeepFace是一个专为Python设计的轻量级人脸识别和人脸属性分析框架,能够进行年龄、性别、情感以及种族的识别。这个库集成了多个先进的人脸识别模型,包括VGG-Face、Google FaceNet、OpenFace、Facebook DeepFace和DeepIDArcFaceDlib。这些模型的存在使得DeepFace在人脸识别上的准确率高达97%,并被证实在人脸检测方面优于一般的人脸识别框架。
DeepFace还具备人脸对齐的功能,这是为了提高识别准确性而设置的一步操作。通过对检测到的人脸进行对齐操作,可以消除姿态、光照和表情等因素对识别结果的影响。

功能
这个库主要是做人脸识别和面部属性分析的,它集合了目前全球最顶尖的开源人脸识别算法,使用卷积神经网络(CNN)对图像进行特征提取,以实现高精度的人脸识别。实验表明,人类在面部识别任务上的准确率为 97.53%,而这些模型已经达到并超过了该准确率水平。
而该库提供非常丰富的功能,比如:
人脸检测:deepface 可以在图像中检测出人脸的位置,为后续的人脸识别任务提供基础。
人脸对齐:为了提高识别准确性,deepface 会将检测到的人脸进行对齐操作,消除姿态、光照和表情等因素对识别结果的影响。
特征提取:deepface 使用卷积神经网络(CNN)对齐后的人脸图像进行特征提取,将人脸转换为高维特征向量。
人脸识别:通过比较特征向量之间的相似度,deepface 可以识别出图像中的人脸是否属于同一个人。
人脸验证:deepface 可以用于人脸验证任务,即判断给定的两张人脸图像是否属于同一个人。
人脸搜索:deepface 可以在大型人脸数据库中搜索特定人物,通过比较特征向量找到与目标人物最相似的人脸。
人脸聚类:deepface 可以对人脸进行聚类分析,将相似的人脸分组在一起,以便进行进一步的分析和处理。
人脸属性识别:deepface 还可以识别人脸的一些属性,如性别、年龄、表情等。年龄模型得到 ±4.65 MAE;性别模型可达 97.44% 的准确率、96.29% 的准确率和 95.05% 的召回率。
人脸跟踪:deepface 可以在视频序列中跟踪人脸,实现实时的人脸识别和分析。
人脸年龄分析:deepface 可以估计图像中的人脸年纪。
人脸表情识别:deepface 可以估计图像中的人脸表情。
人种识别:deepface 可以识别出图像中的人脸属于什么人种。
性别分析:deepface 可以识别出图像中的人脸是什么性别。
下面我们就来实际测试一个该库,看看它的效果如何?不过使用之前需要安装,直接 pip install deepface 即可。在安装的时候,会安装一些依赖,比如 OpenCV-Python、Tensorflow 等等,这些库比较大,所以要保证网络通畅,否则耗时会比较长。
对比两张图片上的人脸是否是同一个人
假设我们有两张图片,想判断两张图片上人是否为同一人,要怎么做呢?

当前有两个文件,分别是 yui1.png 和 yui2.png,来验证一下它们是否为同一个人。
from pprint import pprint
# deep 库的所有功能都在 deep.DeepFace 子模块下面
from deepface import DeepFace
# 传入两张图片即可进行对比
result = DeepFace.verify("yui1.png", "yui2.png")
pprint(result)
现代人脸识别流程包括 5 个常见阶段:检测、对齐、归一化、表示和验证。deepface 会在后台处理好一切,我们不需要深入了解其背后的所有过程,只需要用一行代码即可调用它的验证、查找或分析函数。
然后是 DeepFace.verify 函数,它负责对两张图片上的人进行比对,判断是否为同一个人。该函数接收如下参数:

img1_path 和 img2_path:就是两张图片的路径,当然除了路径,还可以是 numpy 数组或 base64 字符串。verify 函数会将图像上的人脸部分表示为向量,然后计算相似度。如果其中一张图片出现了多张脸,比如 img1_path 里面有一张脸,但 img2_path 里面有三张脸,那么每一张脸都会进行比对,找到最相似的那一个。
model_name:
deepface 已经集成了大量顶尖的人脸模型用于训练,比如:
"VGG-Face"、"OpenFace"、"Facenet"、"Facenet512"、"DeepFace"、"DeepID"
"Dlib"、"ArcFace"、"SFace"、"Emotion"、"Age"、"Gender"、"Race"
喜欢哪个就用哪个,但是模型需要下载,如果 deepface 检测到当前机器上没有指定的模型,那么会自动下载。所以当前第一次执行上面代码的时候,会下载 VGG-Face 模型(大小有好几百 M)。关于这些模型的区别,有兴趣可以自己了解一下,我们直接使用默认的即可。
detector_backend:检测器后端,负责提供人脸识别算法,因为 deepface 所使用的算法是由其它模块提供的,默认是 opencv。但除了 opencv 之外,还有其它选择。
"opencv", "retinaface", "mtcnn", "ssd", "dlib", "mediapipe"
这些人脸检测器之间的区别,还是很重要的,我们来解释一下。
"opencv":最轻量级的人脸检测器,使用不基于深度学习技术的 haar-cascade 算法,因此速度很快,但准确率较低。而为了使 OpenCV 正常工作,需要正面图像,如果脸侧了一下或者局部发生遮挡,准确率就会受到影响。此外也不擅长对眼睛的检测,容易导致对齐问题。目前 DeepFace 使用的默认检测器就是 OpenCV。
"dlib":该检测器在后台使用 hog 算法,与 OpenCV 类似,它也不是基于深度学习的,但它的检测和对齐分数相对较高。
"ssd":单次检测器,它是一种流行的基于深度学习的检测器,但性能可与 OpenCV 相媲美。只是 SSD 不支持面部特征点,并且依赖于 OpenCV 的眼睛检测模块来对齐,因此尽管其检测性能很高,但对准分数仅为平均水平。
"mtcnn":基于深度学习的人脸检测器,并带有面部特征点,所以它的检测和对齐得分都很高但是,但速度比 OpenCV,SSD 和 Dlib 慢。另外 MTCNN 是一种多任务级联卷积神经网络的人脸检测算法,能够同时实现人脸检测、关键点定位和人脸对齐等功能。其对于大尺寸人脸的检测效果较好,并且模型规模相对于 RetinaFace 的较小。
"retinaface":一种基于卷积神经网络的人脸检测算法,具有高精度的特点,被公认为是最先进的人脸检测算法,但需要很高的计算能力。相比 MTCNN,检测小尺寸人脸的效果更好。
因此如果你希望结果更加精确,那么使用 RetinaFace 或 MTCNN;如果希望检测速度更快,比如清洗一部分没有人脸的照片,那么可以使用 OpenCV 或 SSD。
distance_metric:距离(面部嵌入)度量方法,可以是 cosine、euclidean 或 euclidean_l2。
enforce_detection:如果没有检测到人脸时,是否引发异常,可以将其设置为 False。
align:是否执行面部对齐。
normalization:用于预处理图像的归一化技术。
from pprint import pprint
from deepface import DeepFace
result = DeepFace.verify("yui1.png", "yui2.png")
pprint(result)
"""
{'detector_backend': 'opencv',
'distance': 0.2437701450344817,
'facial_areas': {'img1': {'h': 115, 'w': 115, 'x': 73, 'y': 408},
'img2': {'h': 327, 'w': 327, 'x': 159, 'y': 38}},
'model': 'VGG-Face',
'similarity_metric': 'cosine',
'threshold': 0.4,
'time': 1.25,
'verified': True}
"""
返回的是一个字典,里面有两个重要字段:
我们修改一下代码,将人脸所在的矩形描绘出来。
from deepface import DeepFace
import cv2
result = DeepFace.verify("yui1.png", "yui2.png",
detector_backend="mtcnn")
if not result["verified"]:
print("人脸不一致")
exit(0)
# 获取人脸位置坐标
rect_img1 = result["facial_areas"]["img1"]
rect_img2 = result["facial_areas"]["img2"]
# cv2 将图片读取进来之后,会得到一个三维数组
# 第一个维度表示图片的每一行,第二个维度表示图片的每一列,第三个维度就是图片的像素点
im1 = cv2.imread("yui1.png")
im2 = cv2.imread("yui2.png")
# 将人脸所在的矩形绘制出来,调用 cv2.rectangle 函数,该函数接收 5 个参数
# 分别是:原始图像、矩形的左上顶点、矩形的右下顶点、线条颜色、线条粗细
cv2.rectangle(
im1, (rect_img1["x"], rect_img1["y"]),
(rect_img1["x"] + rect_img1["w"], rect_img1["y"] + rect_img1["h"]),
(0, 255, 0), 3
)
cv2.rectangle(
im2, (rect_img2["x"], rect_img2["y"]),
(rect_img2["x"] + rect_img2["w"], rect_img2["y"] + rect_img2["h"]),
(255, 0, 0), 3
)
cv2.imshow("yui1.png", im1)
cv2.imshow("yui2.png", im2)
cv2.waitKey(0)
看一下结果:

你也可以将 detector_backend 换成别的,看看效果。首先换成 retinaface,结果也是正常的,但如果换成 opencv 结果就有问题了。换成 opencv 的话,也是提示人物是同一人,但第一张图片在返回面部所在矩形位置的时候出现了很大的问题,它返回的位置是人物手中的饮料所在的矩形区域。

这就有点离谱了,当然这只是我当前的结果是这样的,总之建议在识别的时候使用 MTCNN 和 Retinaface。
应用场景
Deepface是一种基于深度学习的人脸识别和人脸属性分析框架,由于其轻量级、高效和准确的特点,被广泛应用于多个领域。以下是一些典型的应用场景:
1. 安全监控:Deepface可用于人脸验证和识别,提高安全监控的准确性和效率。例如,在安防系统中快速识别可疑人员。
2. 金融应用:在金融领域,Deepface可用于身份验证和客户识别,提高金融服务的安全性和个性化服务的质量。
3. 用户验证:在金融、电子商务等领域,Deepface可用于身份验证,提高系统安全性。
4. 情感计算:通过分析面部表情,Deepface可以应用于人机交互、客户满意度调查等场景。
5. 社交媒体:自动标记照片中的人物,提升用户体验。
6. 人口统计分析:Deepface的年龄、性别和种族分析功能可用于市场研究和人口统计学研究。
7. 实时监控和交互式应用:Deepface支持实时视频流分析,可以应用于实时监控和交互式应用中。
Deepface的技术特点包括轻量级模型、多任务学习、数据增强、损失函数优化以及端到端训练,这些特点使其在处理大规模人脸数据时具有出色的性能表现。
开源地址
猜您喜欢:
【开源】100%开源企业级低代码快速开发平台,包含页面可视化配置、自定义表单、自定义报表、权限管理脚手架应用、前后端代码自动生成
【开源】一个RBAC中后台框架。结合了最新的技术栈,包括后端的Spring Boot 3、JDK 21,以及前端的Vue 3
【开源】基于Java+Vue+Uni-app开发的商城,在多端端都能使用,代码全开源无加密,独立部署,二开方便,支持免费商用
【开源】依托SpringBoot 技术,以OAuth2 认证结合 RBAC 权限设计为基础的一个轻量级、高可用的单点认证授权中心
【开源】一个前后端分离的开发基础平台和移动应用平台,集成jwt鉴权,动态路由,动态菜单,casbin鉴权,消息队列,定时任务等
添加微信进相关交流群,
备注“微服务”进群交流
备注“低开”进低开群交流
备注“AI”进AI大数据,数据治理群交流
备注“数字”进物联网和数字孪生群交流
备注“安全”进安全相关群交流
备注“自动”进自动化运维群交流
备注“试用”可以申请产品试用
备注“渠道”可以合作渠道信息
备注“助手”进代码助手和插件交流群
备注“定制”可以定制项目,全源码交付
