介绍
Deepface 是一个用于 python 的轻量级人脸识别和人脸属性分析(年龄、性别、情感和种族)框架。它是一个混合人脸识别框架。
deepface包含最先进的模型:VGG-Face、Google FaceNet、OpenFace、Facebook DeepFace和DeepIDArcFaceDlib。所有这些模型都封装在一起,Deepface 的人脸识别准确率高达 97%,并且已被证明在人脸检测方面比一般的人脸识别框架更成功。Facebook 使用 Deepface 来防止其平台上的假冒和身份盗用。
一个图表示:(来源官网)
每个模型的评分:
环境搭建
我的软件环境:
- pycharm2021
- python3.9.6
模块安装:
pip install deepface
人脸验证
对两张图片进行比对,看是否同一个人,图片为:
以下三行代码即可实现,运行它会自动给你下载相关权重文件vgg_face_weights.h5:
from deepface import DeepFace
verification = DeepFace.verify(img1_path = "img1.jpg", img2_path = "img2.jpg")
print(verification)
结果如下:
{'verified': True, 'distance': 0.1600321561950978,
'threshold': 0.4, 'model': 'VGG-Face',
'detector_backend': 'opencv', 'similarity_metric': 'cosine'}
类型是个字典,我们来解析以下含义:
- verified=True:表示同一个人。这是验证结果。
- distance参数:这个值越小,代表相似度越高,越大则相似度越低。
- model:默认用的模型VGG-Face。你也可以试试别的模型。
- detector_backend:要有opencv支持的意思
你也可以自己设置模型,比如设置为OpenFace:
rom deepface import DeepFace
models=["VGG-Face", "Facenet", "Facenet512", "OpenFace", "DeepFace", "DeepID", "ArcFace", "Dlib"]
verification = DeepFace.verify(img1_path = "img.png", img2_path = "img_1.png",model_name=models[3])
print(verification)
运行如下:
看清楚:
第一个,下载到的位置:
To: C:\Users\hp\.deepface\weights\openface_weights.h5
第二个是结果:
{'verified': False, 'distance': 0.17080708434087122,
'threshold': 0.1, 'model': 'OpenFace',
'detector_backend': 'opencv',
'similarity_metric': 'cosine'}
人脸查找
from deepface import DeepFace
img_path1 = r'img.png'
img_path2 = r'img_1.png'
img_path1 = img_path1.replace('\\', '/')
img_path2 = img_path2.replace('\\', '/')
models=["VGG-Face", "Facenet", "Facenet512", "OpenFace", "DeepFace", "DeepID", "ArcFace", "Dlib"]
db_path = r'data'
db_path = db_path.replace('\\', '/')
recognition = DeepFace.find(img_path = img_path2, db_path = db_path, model_name = models[0], enforce_detection=False)
print(recognition)
输出如下:
ind function lasts 4.07146143913269 seconds
identity VGG-Face_cosine
0 data/img_2.png 0.160032
1 data/img.png 0.265129
identity表示身份的意思,VGG-Face_cosine表示的是相似度的意思应该,它会得到相似最高的图。
为什么要设enforce_detection= False?不设置会报错检测不到人脸,因为Deepface会将db_path指定的相片folder中所有的相片,取得每张相片特征后储存于相同路径下(副档名为pkl),下次再取用比对时便不需要重新跑模型取得特征了。但如果其中有无法侦测出脸孔的相片,此时若enforce_detection=False,执行时便会产生错误并停止执行,以提醒我们资料夹中有无法检测脸孔的相片,请重新review。待确认folder中的相片无误后,我们便可设定enforce_detection=False,告知Deepface不需要提醒,以提升后续执行的速度。
人脸属性(年龄,标签,性别,种族)识别
DeepFace 带有强大的面部属性分析模块,用于年龄、性别、情绪和种族/民族预测。虽然 DeepFace 的面部识别模块封装了现有的最先进模型,但其面部属性分析有自己的模型。目前,年龄预测模型的平均绝对误差为 +/- 4.6 岁;性别预测模型的准确率达到 97%。
Deepface 还提供面部属性分析,包括、、age(包括愤怒、恐惧、中性、悲伤、厌恶、快乐和惊讶)和(包括亚洲人、白人、中东人、印度人、拉丁裔和黑人)预测。
来测试以下男神的年龄大小吧:
from deepface import DeepFace
analysis = DeepFace.analyze(img_path="img.png", actions=["age", "gender", "emotion", "race"])
print(analysis)
输出为:
说明:年龄,21;性别,男;表情,自然;种族:亚洲人(官方只能提供到是哪个洲的人)
补充:如果你遇到报错OSError: Unable to open file (truncated file: eof = 5865472, sblock->base_addr = 0, stored_eof = 588,你就到weights路径下把原来的删除,重新执行代码下载文件
比如我报错:
重新执行代码下载即可,有时候会遇到下载失败:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败,可以多尝试几次(甚至十几次),毕竟github有些同学本来就谅解不稳定。实在不行还是报错,那就手动下载吧,我用wegt命令下载,比如:
使用如下命令下载到本地(或者直接点击链接去下载):
wget -c https://github.com/serengil/deepface_models/releases/download/v1.0/gender_model_weights.h5
下载好后放到weights文件夹下一样:
视频流识别
from deepface import DeepFace
a=DeepFace.stream()
print(a)
参考
https://pypi.org/project/deepface/
https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf