[博客翻译]DeepFace:Python的轻量级深度人脸识别库


原文地址:https://github.com/serengil/deepface


GPT-Academic Report

deepface

下载量 星标 许可 测试 DOI

博客 YouTube Twitter

在Patreon上支持我 GitHub赞助商 请我喝咖啡

Hacker News Product Hunt

DeepFace 是一个轻量级的人脸识别和面部属性分析(年龄性别情绪种族)框架,用于 Python。它是一个混合的人脸识别框架,封装了 最先进的模型VGG-FaceFaceNetOpenFaceDeepFaceDeepIDArcFaceDlibSFaceGhostFaceNet

实验表明,人类在人脸识别任务上的准确率为 97.53%,而这些模型的准确性已经达到了并超过了这一水平。

安装

安装 DeepFace 最简单的方法是从 PyPI 下载。这将同时安装库本身及其依赖项。

$ pip install deepface

或者,你也可以从源代码安装 DeepFace。源代码可能包含尚未发布到 PyPI 的新功能。

$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .

一旦安装好库后,你就可以导入它并使用其功能。

from deepface import DeepFace

现代面部识别管道 - 演示

一个现代的面部识别管道包括5个常见阶段:检测对齐归一化表示验证。尽管DeepFace在后台处理所有这些常见阶段,您不需要深入了解背后的所有流程。您只需用一行代码调用其验证、查找或分析功能即可。

面部验证 - 演示

此功能验证脸部对是否为同一个人或不同的人。它期望输入精确的图像路径。传递numpy或base64编码的图像也是可以的。然后,它将返回一个字典并且您只需检查它的verified键即可。

result = DeepFace.verify(
  img1_path = "img1.jpg",
  img2_path = "img2.jpg",
)

面部识别 - 演示

面部识别需要多次应用面部验证。因此,deepface内置了一个find函数来处理这个动作。它将在数据库路径中查找输入图像的身份,并返回pandas数据框列表作为输出。同时,面部数据库的面部嵌入存储在一个pickle文件中,以便下次更快搜索。结果将是源图像中出现的面孔数量。此外,数据库中的目标图像也可以包含多张面孔。

dfs = DeepFace.find(
  img_path = "img1.jpg",
  db_path = "C:/workspace/my_db",
)

嵌入 - 演示

面部识别模型基本上将面部图像表示为多维向量。有时,您需要直接获取这些嵌入向量。DeepFace提供了一个专用的表示功能。代表函数返回一个嵌入列表。结果将是图像路径中出现的面孔数量。

embedding_objs = DeepFace.represent(
  img_path = "img.jpg"
)

该函数返回一个作为嵌入的数组。根据模型名称,嵌入数组的大小会有所不同。例如,默认模型是VGG-Face,它将面部图像表示为4096维向量。

for embedding_obj in embedding_objs:
  embedding = embedding_obj["embedding"]
  assert isinstance(embedding, list)
  assert (
    model_name == "VGG-Face"
    and len(embedding) == 4096
  )

在这里,嵌入也以4096个水平槽的形式被绘制。每个槽对应嵌入向量的一个维度值,维度值在右侧的颜色条中解释。类似于二维条形码,垂直维度在图示中不存储信息。

面部识别模型 - 演示

DeepFace 是一个混合型的面部识别包。它目前封装了许多最先进的面部识别模型:VGG-FaceFaceNetOpenFaceDeepFaceDeepIDArcFaceDlibSFaceGhostFaceNet。默认配置使用 VGG-Face 模型。

models = [
  "VGG-Face", 
  "Facenet", 
  "Facenet512", 
  "OpenFace", 
  "DeepFace", 
  "DeepID", 
  "ArcFace", 
  "Dlib", 
  "SFace",
  "GhostFaceNet"
]

# 面部验证
result = DeepFace.verify(
  img1_path = "img1.jpg",
  img2_path = "img2.jpg",
  model_name = models[0],
)

# 面部识别
dfs = DeepFace.find(
  img_path = "img1.jpg",
  db_path = "C:/workspace/my_db", 
  model_name = models[1],
)

# 特征向量
embedding_objs = DeepFace.represent(
  img_path = "img.jpg",
  model_name = models[2],
)

根据实验,FaceNet、VGG-Face、ArcFace 和 Dlib 的性能表现尤为出色 - 更多详情请参阅 基准测试。下面的表格列出了 DeepFace 中各种模型的测量得分以及它们原始研究中报告的得分。

模型 实测得分 声明得分
Facenet512 98.4% 99.6%
人类 97.5% 97.5%
Facenet 97.4% 99.2%
Dlib 96.8% 99.3%
VGG-Face 96.7% 98.9%
ArcFace 96.7% 99.5%
GhostFaceNet 93.3% 99.7%
SFace 93.0% 99.5%
OpenFace 78.7% 92.9%
DeepFace 69.0% 97.3%
DeepID 66.5% 97.4%

与原研究相比,在 DeepFace 中使用这些模型进行实验可能揭示由于采用不同的检测或归一化技术而导致的差异。此外,一些模型仅发布了它们的主干,缺乏预训练权重。因此,我们使用它们的重新实现版本而不是原始预训练权重。

相似度 - 演示

面部识别模型是常规的卷积神经网络,负责将人脸表示为向量。我们期望同一个人的脸对应该比不同人的脸对更相似。

相似度可以通过不同的指标来计算,例如余弦相似度、欧几里得距离或 L2 归一化欧几里得距离。默认配置使用余弦相似度。根据实验,没有一种距离度量表现出显著优于其他。

metrics = ["cosine", "euclidean", "euclidean_l2"]

# 面部验证
result = DeepFace.verify(
  img1_path = "img1.jpg", 
  img2_path = "img2.jpg", 
  distance_metric = metrics[1],
)

# 面部识别
dfs = DeepFace.find(
  img_path = "img1.jpg", 
  db_path = "C:/workspace/my_db", 
  distance_metric = metrics[2],
)

面部属性分析 - 演示

DeepFace 还包含一个强大的面部属性分析模块,包括年龄性别面部表情(包括愤怒、恐惧、中性、悲伤、厌恶、开心和惊讶)和 种族(包括亚洲人、白人、中东人、印度人、拉丁美洲人和黑人)预测。结果将是出现在源图像中的脸部数量。

objs = DeepFace.analyze(
  img_path = "img4.jpg", 
  actions = ['age', 'gender', 'race', 'emotion'],
)

年龄模型获得了 ± 4.65 的平均绝对误差(MAE);性别模型获得了 97.44% 的准确率、96.29% 的精确率和 95.05% 的召回率,具体内容可参见其教程

人脸检测与对齐 - 演示

人脸检测和对齐是现代人脸识别流水线中的重要早期阶段。实验表明,检测可以将人脸识别的准确性提高多达 42%,而对齐可以将其提高多达 6%。OpenCVSsdDlibMtCnnFaster MtCnnRetinaFaceMediaPipeYoloYuNetCenterFace 检测器被封装在 deepface 中。

所有 deepface 函数都接受可选的检测器后端和对齐输入参数。您可以使用这些参数在不同的检测器和对齐模式之间切换。默认情况下,OpenCV 是检测器,并且默认启用对齐功能。

backends = [
  'opencv', 
  'ssd', 
  'dlib', 
  'mtcnn', 
  'fastmtcnn',
  'retinaface', 
  'mediapipe',
  'yolov8',
  'yolov11s',
  'yolov11n',
  'yolov11m',
  'yunet',
  'centerface',
]

alignment_modes = [True, False]

# 人脸验证
obj = DeepFace.verify(
  img1_path = "img1.jpg", 
  img2_path = "img2.jpg", 
  detector_backend = backends[0],
  align = alignment_modes[0],
)

# 人脸识别
dfs = DeepFace.find(
  img_path = "img.jpg", 
  db_path = "my_db", 
  detector_backend = backends[1],
  align = alignment_modes[0],
)

# 嵌入
embedding_objs = DeepFace.represent(
  img_path = "img.jpg", 
  detector_backend = backends[2],
  align = alignment_modes[0],
)

# 面部分析
demographies = DeepFace.analyze(
  img_path = "img4.jpg", 
  detector_backend = backends[3],
  align = alignment_modes[0],
)

# 面部检测和对齐
face_objs = DeepFace.extract_faces(
  img_path = "img.jpg", 
  detector_backend = backends[4],
  align = alignment_modes[0],
)

面部分析模型实际上是卷积神经网络CNN模型它们期望接受标准尺寸的输入因此在表示之前需要进行调整大小为了避免变形deepface 在检测和对齐后根据目标尺寸参数添加黑色填充像素

[![](https://raw.githubusercontent.com/serengil/deepface/master/icon/detector-outputs-20240414.jpg)](https://raw.githubusercontent.com/serengil/deepface/master/icon/detector-outputs-20240414.jpg)

[RetinaFace](https://sefiks.com/2021/04/27/deep-face-detection-with-retinaface-in-python/)  [MtCnn](https://sefiks.com/2020/09/09/deep-face-detection-with-mtcnn-in-python/) 在检测和对齐阶段表现优异但速度较慢如果您的流水线速度更重要那么应该使用 opencv  ssd另一方面如果您更看重准确性则应使用 retinaface  mtcnn

如以下插图所示即使在人群中RetinaFace 的表现也非常令人满意此外它还具有惊人的面部标志检测性能突出显示的红色点表示眼睛鼻子和嘴巴等面部标志因此RetinaFace 的对齐评分也较高

[![](https://raw.githubusercontent.com/serengil/deepface/master/icon/retinaface-results.jpeg)](https://raw.githubusercontent.com/serengil/deepface/master/icon/retinaface-results.jpeg)
*黄色天使——费内巴切女子排球队*

您可以在这个 [repo](https://github.com/serengil/retinaface) 上了解更多关于 RetinaFace 的信息

**实时分析** - [`演示`](https://youtu.be/-c9sSJcx6wI)

您可以使用 deepface 进行实时视频分析Stream 函数将访问您的网络摄像头并应用面部识别和面部属性分析该函数会在连续 5 帧中成功对焦到面部后开始分析一帧然后它会显示结果持续 5 

```python notranslate position-relative overflow-auto
DeepFace.stream(db_path = "C:/User/Sefik/Desktop/database")

[](https://raw.gi