社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【开源】一个专为Python设计的轻量级人脸识别和人脸属性分析框架,能够进行年龄、性别、情感以及种族的识别。

soft张三丰 • 6 月前 • 597 次点击  

介绍

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 pprintfrom 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}"""

返回的是一个字典,里面有两个重要字段:

  • verified:表示比对结果,即两张图片上的人是否为同一人。

  • facial_areas:由矩形表示的面部区域,x、y 表示矩形的左上顶点的坐标,w 和 h 分别表示矩形的宽度和高度。

我们修改一下代码,将人脸所在的矩形描绘出来。

from deepface import DeepFaceimport 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的技术特点包括轻量级模型、多任务学习、数据增强、损失函数优化以及端到端训练,这些特点使其在处理大规模人脸数据时具有出色的性能表现。

开源地址

关注公众号 回复 20241029 获得


猜您喜欢:

【开源】100%开源企业级低代码快速开发平台,包含页面可视化配置、自定义表单、自定义报表、权限管理脚手架应用、前后端代码自动生成

【开源】一个RBAC中后台框架。结合了最新的技术栈,包括后端的Spring Boot 3、JDK 21,以及前端的Vue 3

【开源】基于Java+Vue+Uni-app开发的商城,在多端端都能使用,代码全开源无加密,独立部署,二开方便,支持免费商用

【开源】依托SpringBoot 技术,以OAuth2 认证结合 RBAC 权限设计为基础的一个轻量级、高可用的单点认证授权中心

【开源】一个前后端分离的开发基础平台和移动应用平台,集成jwt鉴权,动态路由,动态菜单,casbin鉴权,消息队列,定时任务等


添加微信进相关交流群,

备注“微服务”进群交流

备注“低开”进低开群交流

备注“AI”进AI大数据,数据治理群交流

备注“数字”进物联网和数字孪生群交流

备注“安全”进安全相关群交流

备注“自动”进自动化运维群交流

备注“试用”可以申请产品试用

备注“渠道”可以合作渠道信息

备注助手”进代码助手和插件交流群

备注“定制”可以定制项目,全源码交付

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/175426
 
597 次点击