实验表明,人类在人脸识别任务上的准确率为 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-Face ,FaceNet, OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace 和 GhostFaceNet。默认配置使用 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%。OpenCV、Ssd、Dlib、 MtCnn、Faster MtCnn、RetinaFace、 MediaPipe、Yolo、YuNet 和 CenterFace 检测器被封装在 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)
[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)
*黄色天使——费内巴切女子排球队*
您可以在这个 [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")
尽管面部识别基于一次性学习,您也可以使用一个人的多张面部图片。您应该按照如下所示的目录结构重新整理文件。
用户
├── 数据库
│ ├── Alice
│ │ ├── Alice1.jpg
│ │ ├── Alice2.jpg
│ ├── Bob
│ │ ├── Bob.jpg
如果你打算直接从浏览器进行面部验证任务,deepface-react-ui 是一个使用 ReactJS 构建的独立仓库,依赖于 deepface API。
面部防欺骗 - 演示
DeepFace 还包括一个防欺骗分析模块,用于判断给定的图像是真实的还是伪造的。要激活此功能,在任何 DeepFace 任务中将 anti_spoofing 参数设置为 True。
# 面部检测中的防欺骗测试
face_objs = DeepFace.extract_faces(
img_path="dataset/img1.jpg",
anti_spoofing = True
)
assert all(face_obj["is_real"] is True for face_obj in face_objs)
# 实时分析中的防欺骗测试
DeepFace.stream(
db_path = "C:/User/Sefik/Desktop/database",
anti_spoofing = True
)
API - 演示
DeepFace 还提供 API 服务,请参阅 api 文件夹 获取更多详细信息。你可以克隆 deepface 源代码并使用以下命令运行 API。它将使用 gunicorn 服务器启动 REST 服务。通过这种方式,你可以从外部系统(如移动应用程序或网站)调用 deepface。
cd scripts
./service.sh
API 中涵盖了人脸识、面部属性分析和向量表示功能。你预计以 HTTP POST 方法调用这些功能。默认服务端点将为 http://localhost:5005/verify(用于人脸识别)、http://localhost:5005/analyze(用于面部属性分析)和 http://localhost:5005/represent(用于向量表示)。API 接受通过文件上传(通过表单数据)或作为确切图像路径、URL 或 base64 编码字符串(通过 JSON 或表单数据)提供的图像,为不同的客户端需求提供灵活的选项。这里提供了 Postman 项目,帮助你了解如何调用这些方法。
容器化服务 - 演示
以下命令集会通过 Docker 在 localhost:5005 上运行 DeepFace。然后,你将能够使用诸如 verify(验证)、analyze(分析)和 represent(表示)等功能。如果你想自行构建镜像而不是使用 Docker Hub 上的预构建镜像,也提供了项目的根文件夹中的 Dockerfile。
# docker build -t serengil/deepface . # 从 Dockerfile 构建 Docker 镜像
docker pull serengil/deepface # 使用来自 Docker Hub 的预构建 Docker 镜像
docker run -p 5005:5000 serengil/deepface
命令行界面 - 演示
DeepFace 还提供了一个命令行界面。你可以在命令行中访问其功能,如下所示。deepface 命令期待第一个参数是函数名称,后面跟函数参数。
# 人脸验证
$ deepface verify -img1_path tests/dataset/img1.jpg -img2_path tests/dataset/img2.jpg
# 面部分析
$ deepface analyze -img_path tests/dataset/img1.jpg
如果你通过 Docker 运行 DeepFace,也可以运行这些命令,请参考该 Shell 脚本中的说明。
大规模人脸识别 - 播放列表
如果你的任务需要在大型数据集上进行面部识别,你应该将 DeepFace 与向量索引或向量数据库结合使用。这种设置将执行近似最近邻搜索而不是精确搜索,使你能够在包含数十亿条记录的数据库中于毫秒内识别一张脸。常见的向量索引解决方案包括 Annoy,Faiss,Voyager,NMSLIB,和 ElasticSearch。对于向量数据库,流行的选择有带有其 pgvector 扩展的 Postgres 和 RediSearch。
相反,如果你的任务涉及在中小型数据库上进行面部识别,你可以使用关系型数据库,如 Postgres 或 SQLite,或 NoSQL 数据库,如 Mongo,Redis 或 Cassandra,来进行精确的最近邻搜索。

