[深度学习] Python人脸识别库Deepface使用教程
off999 2024-10-20 08:09 33 浏览 0 评论
deepface是一个Python轻量级人脸识别和人脸属性分析(年龄、性别、情感和种族)框架,提供非常简单的接口就可以实现各种人脸识别算法的应用。deepface官方仓库为?deepface???。deepface提供了多种模型,模型下载地址为??deepface_models??。
安装方式: pip install deepface -i https://pypi.tuna.tsinghua.edu.cn/simple
deepface主要提供以下人脸识别算法,具体对应接口为:
- DeepFace.verify:人脸验证
- DeepFace.find:人脸识别
- DeepFace.analyze:人脸属性分析
- DeepFace.detectFace:人脸检测
- DeepFace.represent:人脸特征提取
- DeepFace.stream:人脸实时分析
总体而言,这个项目的人脸识别模型识别效果还行,但是离工程应用还是有一定的距离,不过还是非常推荐学习该库内部代码。
某些网站会判定本文人脸图片违规,这是网站识别算法自身问题。
本文所有算法展示效果和代码见:
github: ??Python-Study-Notes??
此外可以看一看另外一个人脸识别库,功能更加齐全:[深度学习] Python人脸识别库face_recognition使用教程
文章目录
- 0 数据准备
- 1 人脸验证DeepFace.verify
- 2 人脸识别DeepFace.find
- 3 人脸属性分析DeepFace.analyze
- 4 人脸检测DeepFace.detectFace
- 5 人脸特征提取DeepFace.represent
- 6 参考
0 数据准备
# deep库的导入就一行代码
from deepface import DeepFace
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw
import os
import cv2
import numpy as np所使用的数据集为网络明星图片,共五个明星,每个明星三张人脸,数据集的路径如下:
root
├── images
│ ├── baijingting
│ │ ├── 0000.jpg
│ │ ├── 0001.jpg
│ ├── jiangwei
│ │ ├── 0000.jpg
│
├── code数据展示结果如下:
# --- 展示图片
def show_img(imgs: list, img_names: list) -> None:
imgs_count = len(imgs)
for i in range(imgs_count):
ax = plt.subplot(1, imgs_count, i+1)
ax.imshow(imgs[i])
ax.set_title(img_names[i])
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout(h_pad=3)
plt.show()
img_path = "images"
for person_dir in os.listdir(img_path):
imgs = []
img_names = []
for file in os.listdir(os.path.join(img_path, person_dir)):
imgs.append(Image.open(os.path.join(img_path, person_dir, file)))
img_names.append(person_dir + '/' + file)
show_img(imgs, img_names))
)
1 人脸验证DeepFace.verify
此函数用于验证图像对是同一个人还是不同的人。函数接口为:
verify(img1_path, img2_path = '', model_name = 'VGG-Face', distance_metric = 'cosine', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, prog_bar = True, normalization = 'base')输入参数介绍:
img1_path:传递的图像路径、numpy数组(BGR)或based64编码图像
model_name:模型名,支持VGG-Face, Facenet, OpenFace, DeepFace, DeepID, Dlib, ArcFace,Ensemble等
distance_metric:度量标准,支持cosine, euclidean, euclidean_l2
model:构建deepface模型。每次调用verify函数都会重新建立人脸识别模型。可以选择传递预构建的人脸识别模型。如DeepFace.build_model('VGG-Face')构建模型
enforce_detection:如果在图像中检测不到任何人脸,则验证函数将返回异常。将此设置为False将不会出现此异常
detector_backend:人脸识别算法后端,支持retinaface, mtcnn, opencv, ssd,dlib
align:是否人脸对齐
prog_bar:启用或禁用进度条
normalization:人脸归一化的方式输出结果介绍:
如果img1_path是输入一张人脸就是返回一个字典,如果输入列表则返回一个字典列表。具体参数如下:
verified:是否同一个人
distance:人脸距离,越小越相似
max_threshold_to_verify:判断为同一个人的阈值
model: 所用模型
similarity_metric: 相似性度量标准各识别模型的精度如下,LFW和YTF都是小型数据集。Human-beings表示人类识别精度。
Model | LFW Score | YTF Score |
Facenet512 | 99.65% | - |
SFace | 99.60% | - |
ArcFace | 99.41% | - |
Dlib | 99.38 % | - |
Facenet | 99.20% | - |
VGG-Face | 98.78% | 97.40% |
Human-beings | 97.53% | - |
OpenFace | 93.80% | - |
DeepID | - | 97.05% |
demo1
# 模型名
models_name = ["VGG-Face", "Facenet", "Facenet512", "OpenFace",
"DeepFace", "DeepID", "ArcFace", "Dlib", "SFace", 'Ensemble']
model_name = models_name[5]
result = DeepFace.verify(img1_path="images/baijingting/0001.jpg",
img2_path="images/pengyuyan/0001.jpg",
model_name=model_name)
# 展示结果,两个人不是同一个人
print(result)1/1 [==============================] - 0s 170ms/step
1/1 [==============================] - 0s 20ms/step
{'verified': False, 'distance': 0.0751386867894902, 'threshold': 0.015, 'model': 'DeepID', 'detector_backend': 'opencv', 'similarity_metric': 'cosine'}demo2
models_name = ["VGG-Face", "Facenet", "Facenet512", "OpenFace",
"DeepFace", "DeepID", "ArcFace", "Dlib", "SFace", 'Ensemble']
# 提前加载模型,避免重复加载
model_name = models_name[1]
# 创建模型
model = DeepFace.build_model(model_name)
# 列表中每一个子项表示用于对比的图像
img_paths = [["images/baijingting/0000.jpg", "images/baijingting/0001.jpg"],
["images/baijingting/0000.jpg", "images/zhaoliying/0001.jpg"]]
# 度量标准
metrics = ["cosine", "euclidean", "euclidean_l2"]
results = DeepFace.verify(img_paths,
model_name=model_name,
model=model,
distance_metric=metrics[2],
prog_bar=False)
# 展示结果
for result in results.items():
print(result)1/1 [==============================] - 2s 2s/step
1/1 [==============================] - 0s 52ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 66ms/step
('pair_1', {'verified': True, 'distance': 0.6328494898310356, 'threshold': 0.8, 'model': 'Facenet', 'detector_backend': 'opencv', 'similarity_metric': 'euclidean_l2'})
('pair_2', {'verified': False, 'distance': 1.1700473293978308, 'threshold': 0.8, 'model': 'Facenet', 'detector_backend': 'opencv', 'similarity_metric': 'euclidean_l2'})2 人脸识别DeepFace.find
此函数用于从数据集中检索当前人脸相似的图片。函数接口为:
find(img_path, db_path, model_name ='VGG-Face', distance_metric = 'cosine', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, prog_bar = True, normalization = 'base', silent=False):输入参数和verify差不多,主要多了人脸检索库路径地址:
db_path:检索库路径,
silent: 是否静默显示数据,输出结果介绍:
一个包含相似图像的pandas dataframe数据体,包括图像路径和距离值,models_name = ["VGG-Face", "Facenet", "Facenet512", "OpenFace",
"DeepFace", "DeepID", "ArcFace", "Dlib", "SFace", 'Ensemble']
# db_path是库文件地址
# 第一次会提取各个图像的特征,并保存到本地pkl文件以供下次直接调用
result = DeepFace.find(img_path="images/baijingting/0000.jpg",
db_path="images", model_name=models_name[1])1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 58ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 59ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 51ms/step
1/1 [==============================] - 0s 52ms/step
1/1 [==============================] - 0s 53ms/step
1/1 [==============================] - 0s 52ms/step
1/1 [==============================] - 0s 55ms/step
Representations stored in images / representations_facenet.pkl file. Please delete this file when you add new identities in your database.
1/1 [==============================] - 0s 56ms/step
find function lasts 3.254298448562622 seconds# 展示结果,第一个是识别图像本身,后面两个是相似图片
print(result)identity Facenet_cosine
0 images\baijingting/0000.jpg -2.220446e-16
1 images\baijingting/0001.jpg 2.002492e-01
2 images\baijingting/0002.jpg 2.328966e-013 人脸属性分析DeepFace.analyze
此函数用于分析当前人脸的面部属性,包括年龄,性别,面部表情(包括愤怒、恐惧、正常、悲伤、厌恶、快乐和惊讶),种族(包括亚洲人、白人、中东人、印度人、拉丁裔和黑人)。函数接口为:
analyze(img_path, actions = ('emotion', 'age', 'gender', 'race') , models = None, enforce_detection = True, detector_backend = 'opencv', prog_bar = True)输入参数和verify差不多,主要多了属性设置actions:
actions:识别属性,包括age, gender, emotion, race输出结果介绍:
如果img_path是输入一张人脸就是返回一个字典,如果输入列表则返回一个字典列表。具体参数如下:
region:人脸坐标,wywh格式
age:年龄
gender:性别
dominant_emotion: 主导情绪,也就是情绪识别结果
emotion:各个情绪度量值,值越大表示越倾向
dominant_race:种族结果
race:各个种族度量值# 输入检测图像,这里只识别情绪,因为其他模型实在太大了,下载下来要很久。
result = DeepFace.analyze(img_path = "images/jiangwen/0000.jpg", actions = ['emotion'])
print(result)1/1 [==============================] - 0s 113ms/step
{'emotion': {'angry': 2.147514166495057e-06, 'disgust': 3.124029827739067e-14, 'fear': 1.990160924947304e-06, 'happy': 99.9697208404541, 'sad': 1.9864262412738753e-05, 'surprise': 0.01537421194370836, 'neutral': 0.014887277211528271}, 'dominant_emotion': 'happy', 'region': {'x': 198, 'y': 34, 'w': 185, 'h': 185}}数据可视化看看结果
im = Image.open( "images/jiangwen/0000.jpg")
# 坐标位置
x,y,w,h = result['region']['x'],result['region']['y'],result['region']['w'],result['region']['h']
draw = ImageDraw.Draw(im)
# 画框
draw.rectangle((x,y,x+w,y+h), outline="red", width=3)
print("表情:{}".format(result["dominant_emotion"]))
show_img([im],["jiangwen"])表情:happy4 人脸检测DeepFace.detectFace
此函数用于检测人脸,如果图像中有多个人脸只会返回一个,函数接口为:
detectFace(img_path, target_size = (224, 224), detector_backend = 'opencv', enforce_detection = True, align = True)输入参数和verify差不多,主要多了可以设置返回图像的尺寸的参数target_size,输出返回一张RGB的numpy数组图像
result = DeepFace.detectFace(img_path = "images/zhangziyi/0000.jpg",align = True)
print(result.shape)
show_img([result],["zhangziyi"])(224, 224, 3)# 不进行人脸对齐
result = DeepFace.detectFace(img_path = "images/zhangziyi/0000.jpg",align = False)
print(result.shape)
show_img([result],["zhangziyi"])(224, 224, 3)5 人脸特征提取DeepFace.represent
该函数用于将面部图像表示为特征向量,函数接口为:
represent(img_path, model_name = 'VGG-Face', model = None, enforce_detection = True, detector_backend = 'opencv', align = True, normalization = 'base')输入参数和verify差不多。输出返回图像特征多维向量,特征向量的维度根据模型而变化。
models_name = ["VGG-Face", "Facenet", "Facenet512", "OpenFace",
"DeepFace", "DeepID", "ArcFace", "Dlib", "SFace", 'Ensemble']
result = DeepFace.represent(img_path="images/baijingting/0000.jpg", model_name=models_name[1])
print("特征维度为:{}".format(len(result)))1/1 [==============================] - 0s 61ms/step
特征维度为:128当然提取特征可以自己计算距离,设置阈值。示例如下。
# 计算l2距离
def l2_distance(input1: np.ndarray, input2: np.ndarray) -> float:
# 手动计算 np.sqrt(np.sum((result1- result2)**2))
return np.linalg.norm(input1-input2)
# 计算l1距离
def l1_distance(input1: np.ndarray, input2: np.ndarray) -> float:
# 手动计算 np.sum(abs(input1-input2))
return np.linalg.norm(input1-input2, ord=1)
# 计算余弦距离
def IP_distance(input1: np.ndarray, input2: np.ndarray) -> float:
return 1 - np.dot(input1, input2)/np.linalg.norm(input1)/np.linalg.norm(input2)models_name = ["VGG-Face", "Facenet", "Facenet512", "OpenFace",
"DeepFace", "DeepID", "ArcFace", "Dlib", "SFace", 'Ensemble']
# 提前加载模型,避免重复加载
model_name = models_name[1]
# 创建模型
model = DeepFace.build_model(model_name)
# res1和res3为同一个人
res1 = DeepFace.represent(
img_path="images/baijingting/0000.jpg", model_name=models_name[1], model=model)
res2 = DeepFace.represent(
img_path="images/zhangziyi/0000.jpg", model_name=models_name[1], model=model)
res3 = DeepFace.represent(
img_path="images/baijingting/0001.jpg", model_name=models_name[1], model=model)
# 转换为numpy类型
res1 = np.array(res1)
res2 = np.array(res2)
res3 = np.array(res3)
print("res1与res2的余弦距离为:{}".format(IP_distance(res1,res2)))
print("res1与res3的余弦距离为:{}".format(IP_distance(res1,res3)))
print("res1与res2的l2距离为:{}".format(l2_distance(res1,res2)))
print("res1与res3的l2距离为:{}".format(l2_distance(res1,res3)))
print("res1与res2的l1距离为:{}".format(l1_distance(res1,res2)))
print("res1与res3的l1距离为:{}".format(l1_distance(res1,res3)))1/1 [==============================] - 0s 54ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 52ms/step
res1与res2的余弦距离为:0.6868675298615137
res1与res3的余弦距离为:0.2002492383897012
res1与res2的l2距离为:12.135816884638682
res1与res3的l2距离为:6.657409646028565
res1与res2的l1距离为:110.3180431430228
res1与res3的l1距离为:58.203803710639486 参考
- ??deepface??
- ??deepface_models??
- [深度学习] Python人脸识别库face_recognition使用教程
- ??Python-Study-Notes??
相关推荐
- win2008ghost版下载(ghost 2008r2版本下载)
-
点击IE的“工具→Internet选项→安全”,将“Internet”区域的安全级别滑块由“高”拉动到“中”。以下设置随系统不同而稍有不同进入“控制面板→添加或删除程序→添加/删除Window...
- 不用u盘给新硬盘装系统(不用硬盘重装系统)
-
没有U盘,也可以使用硬盘安装器(HDDInstaller)来给新硬盘安装系统。以下是使用硬盘安装器的步骤:1.下载并安装硬盘安装器。可以在官网或其他可靠的下载网站下载硬盘安装器。2.打开硬盘安装...
- 爱思助手苹果版app下载(爱思助手下载手机苹果版)
-
不能在手机端直接下载,需要先下载PC端。安装步骤如下:第1步,安装爱思助手PC端用电脑访问爱思助手官网在产品中心下载并安装“爱思助手PC端V7版”第2步,安装爱思助手移动端打开爱思助手PC端用数据线连...
- windows7家庭版官网下载(原版win7家庭版)
-
家用电脑提供的下载是微软发布的正式版本的原版ISOnbsp;镜像,可以保障是没有病毒和任何修改的原版系统。至于你所说的是不是正版,正版并不是指一张光盘,而是指安装的系统是否有微软的正版授权,简单说也就...
-
- 电脑怎么下载word官方免费版
-
可以从官网或者360软件管家下载,还有激活使用。MicrosoftWord是微软公司的一个文字处理器应用程序。它最初是由RichardBrodie为了运行DOS的IBM计算机而在1983年编写的。随后的版本可运行于AppleMacin...
-
2025-11-07 21:51 off999
- 电脑网络已连接但无法访问互联网
-
因为网络配置有问题造成的,解决的方法也很简单,可以直接进入win7系统的“控制面板”—“网络”中,然后将除开拨号适配器以外的全部选项全部删除掉,然后重新启动计算机后再添加microsoft的“TCP/...
- win7隐藏文件怎么显示(win7中显示隐藏文件)
-
要在Win7中显示隐藏文件,需依次打开“我的电脑”或“计算机”→点击“工具”→选择“文件夹选项”→在弹出的“文件夹选项”窗口中点击“查看”标签→在“隐藏文件和文件夹”选项中选择“显示隐藏的文件、文件夹...
-
- 邮箱163注册怎么注册(邮箱163如何注册)
-
1.打开浏览器,搜索163邮箱,进入登录页面,点击去注册2.进入163邮箱注册页面后,输入想要的邮箱地址,输入密码,手机号,点击立即注册选项,就可以申请注册163邮箱了。操作方法01登陆163邮箱的官方网站,点击“注册”02可通过手机...
-
2025-11-07 20:03 off999
- 音频设备有哪些(音频设备有哪些类型)
-
用录音机,MP3,手机之类的,通常需采用话筒,麦克风等设备,现在自然声音的收集方式主要是用麦克风等声音采集设备捕捉声波,将声波的振动转化为模拟信号,然后用磁带将模拟信号记录下来,或者用电脑将模拟信号记...
- 华硕笔记本电脑不显示wifi列表
-
您好!可以在启动项处,右键,属性,选择自定义通知图标,查看声音和电池图标,选择显示或总是显示。确定。然后重启机器尝试。如果还是没有反应,则可能是相关的文件出现错误。比如使用了驱动软件更新系统的补丁或驱...
- 电脑自动关机怎么解除(电脑自动关机解除方法)
-
要取消电脑关机后的还原,首先尝试迅速按下键盘上的Ctrl+Alt+Delete组合键,然后选择任务管理器以打开它。在任务管理器中,点击"文件"菜单,选择"新任务"选项。...
- 苹果笔记本电脑重装系统教程
-
苹果笔记本电脑系统可以通过以下步骤进行重装:1.备份数据:在开始重装前,需要备份你的重要数据。你可以将数据存储到外部硬盘、云存储或其他可靠的设备中。2.下载安装器:从AppStore中下载macOS...
- win7和win8系统哪个好用些(win7和win8.1哪个好用)
-
iqoo7用的是OriginOS系统。OriginOS系统给人的感觉还是相当耳目一新的。除了基本的设置、应用商店、i主题、闹钟、天气这些外,还多出了控制台、交互池、变形器、镜头包等。一加八出厂预装的...
- 电脑摄像头万能驱动(电脑摄像头驱动程序)
-
清理一下垃圾,点一下设置设置一下就可以了
- qq下载官方下载(qq下载官网2020安卓版)
-
建议关闭杀毒软件,但是也不要轻易下载QQ群文件、陌生QQ邮件的附件以及陌生人发送的文件,很可能是病毒,如果提示有病毒,千万不要下载,避免电脑中毒。如果真的需要下载就暂时关闭杀毒软件。最终还是希望通过正...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
