DeepFace是一个轻量级的Python人脸识别和面部属性分析(年龄、性别、情感和种族)框架。它是一个混合人脸识别框架,包含最先进的模型: VGG-Face
、 FaceNet
、 OpenFace
、 DeepFace
、 DeepID
、 ArcFace
、 Dlib
、 SFace
和GhostFaceNet
。
Experiments
表明,人类在面部识别任务上的准确率高达 97.53% ,而这些模型已经达到并超过了这一准确率水平。
安装 deepface 最简单的方法是从PyPI
下载它。它将安装库本身及其先决条件。
$ pip install deepface
或者,您也可以从其源代码安装 deepface。源代码可能具有 pip 版本中尚未发布的新功能。
$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .
安装该库后,您将能够导入它并使用其功能。
from deepface import DeepFace
现代面部识别管道- Demo
现代人脸识别流程由 5 个常见阶段组成:检测、对齐、标准化、表示和验证。虽然 DeepFace 在后台处理所有这些常见阶段,但您无需深入了解其背后的所有流程。您只需使用一行代码即可调用其验证、查找或分析功能。
人脸验证- Demo
此功能可验证人脸对是同一个人还是不同人。它期望精确的图像路径作为输入。也欢迎传递 numpy 或 base64 编码图像。然后,它将返回一个字典,您应该仅检查其经过验证的密钥。
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
)
人脸识别- Demo
人脸识别需要多次进行人脸验证。在这里,deepface 有一个开箱即用的查找功能来处理此操作。它将在数据库路径中查找输入图像的标识,并将返回 pandas 数据帧列表作为输出。同时,面部数据库的面部嵌入存储在pickle文件中,以便下次更快地搜索。结果将是源图像中出现的面部尺寸。此外,数据库中的目标图像也可以有多个面孔。
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
)
嵌入- Demo
人脸识别模型基本上将面部图像表示为多维向量。有时,您直接需要这些嵌入向量。 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 个槽水平绘制。每个槽对应嵌入向量中的一个维度值,维度值在右侧的颜色栏中解释。与二维条形码类似,垂直尺寸在插图中不存储任何信息。
人脸识别模型- Demo
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" ,
]
#face verification
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
model_name = models [ 0 ],
)
#face recognition
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
model_name = models [ 1 ],
)
#embeddings
embedding_objs = DeepFace . represent (
img_path = "img.jpg" ,
model_name = models [ 2 ],
)
根据实验,FaceNet、VGG-Face、ArcFace 和 Dlib 均表现优异 - 有关更多详细信息,请参阅BENCHMARKS
。您可以在下表中找到 DeepFace 中各种模型的测量分数以及原始研究报告的分数。
模型 | 实测分数 | 公布分数 |
---|---|---|
Facenet512 | 98.4% | 99.6% |
人类 | 97.5% | 97.5% |
脸网 | 97.4% | 99.2% |
数据库 | 96.8% | 99.3% |
VGG-脸 | 96.7% | 98.9% |
弧面 | 96.7% | 99.5% |
鬼脸网 | 93.3% | 99.7% |
面 | 93.0% | 99.5% |
开放面 | 78.7% | 92.9% |
深脸 | 69.0% | 97.3% |
深度ID | 66.5% | 97.4% |
由于采用了不同的检测或归一化技术,在 DeepFace 中使用这些模型进行实验可能会揭示与原始研究相比的差异。此外,一些模型仅发布了主干网络,缺乏预先训练的权重。因此,我们利用它们的重新实现而不是原始的预训练权重。
相似度- Demo
人脸识别模型是常规的卷积神经网络,它们负责将人脸表示为向量。我们期望同一个人的一对面孔应该比不同人的一对面孔更相似。
相似度可以通过不同的度量来计算,例如余弦相似度、欧几里德距离或 L2 归一化欧几里德距离。默认配置使用余弦相似度。根据实验,没有任何距离度量比其他距离度量表现更好。
metrics = [ "cosine" , "euclidean" , "euclidean_l2" ]
#face verification
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
distance_metric = metrics [ 1 ],
)
#face recognition
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
distance_metric = metrics [ 2 ],
)
面部属性分析- Demo
DeepFace还配备了强大的面部属性分析模块,包括age
、 gender
、 facial expression
(包括愤怒、恐惧、中立、悲伤、厌恶、快乐和惊讶)和race
(包括亚洲人、白人、中东人、印度人、拉丁裔和黑人)预测。结果将是源图像中出现的面部尺寸。
objs = DeepFace . analyze (
img_path = "img4.jpg" ,
actions = [ 'age' , 'gender' , 'race' , 'emotion' ],
)
年龄模型得到±4.65 MAE;正如教程中提到的,性别模型的准确度为 97.44%,精确度为 96.29%,召回率为 95.05%。
人脸检测和对齐- Demo
人脸检测和对齐是现代人脸识别流程的重要早期阶段。实验表明,检测将人脸识别准确率提高了 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' ,
'yunet' ,
'centerface' ,
]
alignment_modes = [ True , False ]
#face verification
obj = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
detector_backend = backends [ 0 ],
align = alignment_modes [ 0 ],
)
#face recognition
dfs = DeepFace . find (
img_path = "img.jpg" ,
db_path = "my_db" ,
detector_backend = backends [ 1 ],
align = alignment_modes [ 0 ],
)
#embeddings
embedding_objs = DeepFace . represent (
img_path = "img.jpg" ,
detector_backend = backends [ 2 ],
align = alignment_modes [ 0 ],
)
#facial analysis
demographies = DeepFace . analyze (
img_path = "img4.jpg" ,
detector_backend = backends [ 3 ],
align = alignment_modes [ 0 ],
)
#face detection and alignment
face_objs = DeepFace . extract_faces (
img_path = "img.jpg" ,
detector_backend = backends [ 4 ],
align = alignment_modes [ 0 ],
)
人脸识别模型实际上是 CNN 模型,它们期望标准大小的输入。因此,在表示之前需要调整大小。为了避免变形,deepface 在检测和对齐后根据目标大小参数添加黑色填充像素。
RetinaFace 和 MtCnn 在检测和对齐阶段似乎表现出色,但速度要慢得多。如果管道的速度更重要,那么您应该使用 opencv 或 SSD。另一方面,如果考虑准确性,那么应该使用retinaface或mtcnn。
即使在人群中,RetinaFace 的表现也非常令人满意,如下图所示。此外,它还具有令人难以置信的面部标志检测性能。突出显示的红点显示一些面部标志,例如眼睛、鼻子和嘴巴。这就是为什么 RetinaFace 的对齐分数也很高。
黄色天使 - 费内巴切女排
您可以在此存储库中找到有关 RetinaFace 的更多信息。
实时分析- Demo
您也可以运行 deepface 来播放实时视频。流功能将访问您的网络摄像头并应用面部识别和面部属性分析。如果该函数可以连续对焦一张脸 5 帧,则该函数开始分析一帧。然后,它会显示结果 5 秒。
DeepFace . stream ( db_path = "C:/User/Sefik/Desktop/database" )
尽管人脸识别基于一次性学习,但您也可以使用一个人的多张人脸图片。您应该重新排列目录结构,如下所示。
user
├── database
│ ├── Alice
│ │ ├── Alice1.jpg
│ │ ├── Alice2.jpg
│ ├── Bob
│ │ ├── Bob.jpg
React UI - Demo part-i
、 Demo part-ii
如果您打算直接从浏览器执行人脸验证任务,deepface-react-ui 是一个使用 ReactJS 构建的独立存储库,具体取决于 deepface api。
人脸反欺骗- Demo
DeepFace 还包括一个反欺骗分析模块,用于了解给定图像的真假。要激活此功能,请在任何 DeepFace 任务中将anti_spoofing
参数设置为 True。
# anti spoofing test in face detection
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 )
# anti spoofing test in real time analysis
DeepFace . stream (
db_path = "C:/User/Sefik/Desktop/database" ,
anti_spoofing = True
)
API - Demo
DeepFace 也提供 API - 请参阅api folder
以了解更多详细信息。您可以克隆 Deepface 源代码并使用以下命令运行 api。它将使用gunicorn服务器来启动休息服务。通过这种方式,您可以从外部系统(例如移动应用程序或网络)调用 Deepface。
cd scripts
./service.sh
API中涵盖了人脸识别、人脸属性分析和矢量表示功能。您应该将这些函数称为 http post 方法。默认服务端点将是http://localhost:5005/verify
(用于面部识别)、 http://localhost:5005/analyze
(用于面部属性分析)和http://localhost:5005/represent
(用于矢量表示)。该 API 接受图像作为文件上传(通过表单数据),或作为精确的图像路径、URL 或 base64 编码字符串(通过 JSON 或表单数据),为不同的客户端需求提供多种选项。在这里,您可以找到一个邮递员项目来了解应该如何调用这些方法。
Docker 化服务- Demo
以下命令集将通过 docker 在localhost:5005
上为 deepface 提供服务。然后,您将能够使用 Deepface 服务,例如验证、分析和表示。另外,如果您想自己构建映像而不是从 docker hub 预构建映像,则可以在项目的根文件夹中使用 Dockerfile。
# docker build -t serengil/deepface . # build docker image from Dockerfile
docker pull serengil/deepface # use pre-built docker image from docker hub
docker run -p 5005:5000 serengil/deepface
命令行界面- Demo
DeepFace 还带有命令行界面。您可以在命令行中访问其功能,如下所示。命令 deepface 期望函数名称作为第一个参数,其后为函数参数。
# face verification
$ deepface verify -img1_path tests/dataset/img1.jpg -img2_path tests/dataset/img2.jpg
# facial analysis
$ deepface analyze -img_path tests/dataset/img1.jpg
如果您使用 docker 运行 deepface,也可以运行这些命令。请按照 shell 脚本中的说明进行操作。
大规模面部识别- Playlist
如果您的任务需要在大型数据集上进行面部识别,您应该将 DeepFace 与矢量索引或矢量数据库结合起来。此设置将执行近似最近邻搜索而不是精确搜索,使您可以在几毫秒内识别包含数十亿条目的数据库中的人脸。常见的向量索引解决方案包括 Annoy、Faiss、Voyager、NMSLIB、ElasticSearch。对于矢量数据库,流行的选择是带有 pgvector 扩展的 Postgres 和 RediSearch。
相反,如果您的任务涉及中小型数据库上的面部识别,您可以采用关系数据库(例如 Postgres 或 SQLite)或 NoSQL 数据库(例如 Mongo、Redis 或 Cassandra)来执行精确的最近邻搜索。
非常欢迎请求请求!如果您计划贡献一个大补丁,请先创建一个问题,以便首先解决任何预先问题或设计决策。
在创建 PR 之前,您应该通过运行make test && make lint
命令在本地运行单元测试和 linting。发送 PR 后,GitHub 测试工作流程将自动运行,单元测试和 linting 作业将在批准之前在 GitHub 操作中可用。
支持项目的方法有很多种 - GitHub 存储库只是其中之一
如果您确实喜欢这项工作,那么您可以在 Patreon、GitHub Sponsors 或 Buy Me a Coffee 上为其提供经济支持。
此外,如果您成为金级、银级或铜级赞助商,您公司的徽标将显示在 GitHub 和 PyPI 上的自述文件中。
如果 Deepface 对您的研究有帮助,请在您的出版物中引用它 - 有关更多详细信息,请参阅CITATIONS
。以下是其 BibTex 条目:
如果您在研究中使用 Deepface 进行面部识别或面部检测,请引用以下出版物:
@article { serengil2024lightface ,
title = { A Benchmark of Facial Recognition Pipelines and Co-Usability Performances of Modules } ,
author = { Serengil, Sefik and Ozpinar, Alper } ,
journal = { Journal of Information Technologies } ,
volume = { 17 } ,
number = { 2 } ,
pages = { 95-107 } ,
year = { 2024 } ,
doi = { 10.17671/gazibtd.1399077 } ,
url = { https://dergipark.org.tr/en/pub/gazibtd/issue/84331/1399077 } ,
publisher = { Gazi University }
}
@inproceedings { serengil2020lightface ,
title = { LightFace: A Hybrid Deep Face Recognition Framework } ,
author = { Serengil, Sefik Ilkin and Ozpinar, Alper } ,
booktitle = { 2020 Innovations in Intelligent Systems and Applications Conference (ASYU) } ,
pages = { 23-27 } ,
year = { 2020 } ,
doi = { 10.1109/ASYU50717.2020.9259802 } ,
url = { https://ieeexplore.ieee.org/document/9259802 } ,
organization = { IEEE }
}
另一方面,如果您在研究中使用 Deepface 进行面部属性分析,例如年龄、性别、情感或种族预测任务,请引用该出版物。
@inproceedings { serengil2021lightface ,
title = { HyperExtended LightFace: A Facial Attribute Analysis Framework } ,
author = { Serengil, Sefik Ilkin and Ozpinar, Alper } ,
booktitle = { 2021 International Conference on Engineering and Emerging Technologies (ICEET) } ,
pages = { 1-4 } ,
year = { 2021 } ,
doi = { 10.1109/ICEET53442.2021.9659697 } ,
url = { https://ieeexplore.ieee.org/document/9659697 } ,
organization = { IEEE }
}
另外,如果您在 GitHub 项目中使用 deepface,请在requirements.txt
中添加deepface
。
DeepFace 根据 MIT 许可证获得许可 - 有关更多详细信息,请参阅LICENSE
。
DeepFace 封装了一些外部人脸识别模型:VGG-Face、Facenet(128d 和 512d)、OpenFace、DeepFace、DeepID、ArcFace、Dlib、SFace 和 GhostFaceNet。此外,年龄、性别和种族/民族模型是在 VGG-Face 的基础上通过迁移学习进行训练的。同样,DeepFace 封装了许多人脸检测器:OpenCv、Ssd、Dlib、MtCnn、Fast MtCnn、RetinaFace、MediaPipe、YuNet、Yolo 和 CenterFace。最后,DeepFace 可以选择使用面部反欺骗来确定给定图像的真假。当您打算使用这些模型时,许可证类型将被继承。请检查这些型号的许可证类型以用于生产目的。
DeepFace 徽标由 Adrien Coquet 创建,并根据 Creative Commons:By Attribution 3.0 许可证获得许可。