deepface
DeepFace 是一个轻量级的 人脸识别 和面部属性分析 (年龄、性别、情绪 和 种族) 框架。它是一个混合人脸识别框架,包装了最先进的模型:VGG-Face
、FaceNet
、OpenFace
、DeepFace
、DeepID
、ArcFace
、Dlib
、SFace
和 GhostFaceNet
。
实验研究
显示 人类在面部识别任务中的准确率为 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
一个现代的面部识别流水线 - 演示
一个现代的 面部识别流水线 包含 5 个常见阶段:检测、对齐、归一化、表示 和 验证。虽然 DeepFace 在后台处理所有这些常见阶段,但你不需要掌握所有背后的过程。你只需调用其 verification,find 或 analysis 函数,用一句代码即可实现。
面部验证 - 演示
此函数验证面部对是否为同一人。它需要输入的确切图像路径。也可以传递 numpy 或 base64 编码图像。然后,它会返回一个字典,你只需检查其 verified 键。
result = DeepFace.verify(
img1_path = "img1.jpg",
img2_path = "img2.jpg",
)
面部识别 - 演示
面部识别 需要多次应用面部验证。在此过程中,deepface 提供了开箱即用的查找功能来处理此操作。它会在数据库路径中查找输入图像的身份,并返回 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], )
**面部属性分析** - [`演示`](https://youtu.be/GT2UeN85BdA)
DeepFace还带有一个强大的面部属性分析模块,包括[`年龄`](https://sefiks.com/2019/02/13/apparent-age-and-gender-prediction-in-keras/)、[`性别`](https://sefiks.com/2019/02/13/apparent-age-and-gender-prediction-in-keras/)、[`面部表情`](https://sefiks.com/2018/01/01/facial-expression-recognition-with-keras/)(包括愤怒、恐惧、中性、悲伤、厌恶、快乐和惊讶)和[`种族`](https://sefiks.com/2019/11/11/race-and-ethnicity-prediction-in-keras/)(包括亚洲人、白人、中东人、印度人、拉丁人和黑人)的预测。结果将是源图像中出现的面部大小。
```python
objs = DeepFace.analyze(
img_path = "img4.jpg",
actions = ['age', 'gender', 'race', 'emotion'],
)
年龄模型的均方误差为±4.65;性别模型的准确率为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',
'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在检测和对齐后根据目标尺寸参数添加黑色填充像素。
RetinaFace和MtCnn在检测和对齐阶段表现出色,但速度较慢。如果你的流水线速度更重要,那么你应该使用opencv或ssd。另一方面,如果考虑准确性,则应使用RetinaFace或MtCnn。
如以下插图所示,RetinaFace的性能在拥挤环境中也非常令人满意。此外,它还具有令人难以置信的面部标志检测性能。高亮的红点显示了一些面部标志,例如眼睛、鼻子和嘴巴。因此,RetinaFace的对齐得分也很高。
黄天使 - 费内巴切女子排球队
你可以在这个仓库找到更多关于RetinaFace的信息。
实时分析 - 演示
你也可以对实时视频运行DeepFace。Stream函数将访问你的网络摄像头,并同时应用人脸识别和面部属性分析。函数在能够连续聚焦脸部达5帧时开始分析某一帧,然后结果将在5秒钟内显示。
DeepFace.stream(db_path = "C:/User/Sefik/Desktop/database")
尽管人脸识别基于单次学习,你也可以使用一个人的多张面部照片。你应该按照以下所示重新安排目录结构。
user
├── database
│ ├── Alice
│ │ ├── Alice1.jpg
│ │ ├── Alice2.jpg
│ ├── Bob
│ │ ├── Bob.jpg
React用户界面 - 演示 part-i
,演示 part-ii
如果你打算直接从浏览器执行人脸验证任务,deepface-react-ui是一个基于DeepFace API的使用ReactJS构建的单独仓库。
人脸防伪 - 演示
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
用于向量表示。你可以将输入图像以确切的环境中的图片路径、base64编码字符串或网络图片形式传递。这里,你可以找到一个postman项目,了解这些方法应如何调用。
Docker化服务 - 演示
以下命令集将通过docker在localhost:5005
上提供DeepFace服务。然后,你将能够消费DeepFace服务,例如验证、分析和表示。此外,如果你想自行构建图像而不是使用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,你也可以运行这些命令。请按照在这个脚本中的指示进行操作。
大规模人脸识别 - 播放列表
如果你的任务需要处理大数据集上的人脸识别,你应该将DeepFace与向量索引或向量数据库结合使用。这种设置将执行近似最近邻搜索,而不是精确搜索,使你在包含数十亿条目地数据库中能够在毫秒内识别到一张面孔。常见的向量索引解决方案包括Annoy、Faiss、Voyager、NMSLIB、ElasticSearch。对于向量数据库,流行的选项包括Postgres及其pgvector扩展和RediSearch。
相反,如果你的任务涉及小到中等大小数据库的面部识别,你可以采用使用关系型数据库如Postgres或SQLite,或者NoSQL数据库如Mongo、Redis或Cassandra进行精确的最近邻搜索。
贡献
热烈欢迎拉取请求!如果你计划贡献一个大的补丁,请先创建一个问题,以提前解决任何问题或设计决策。
在创建PR之前,你应先运行单元测试和本地的linting,通过运行make test && make lint
命令。一旦发送PR,GitHub测试工作流将自动运行,并在批准之前可通过GitHub actions查看单元测试和linting作业。
支持
有很多方法可以支持一个项目 - 给GitHub仓库加星⭐️是其中之一🙏
如果你确实喜欢这项工作,那么可以在Patreon、GitHub Sponsors或Buy Me a Coffee上为其提供财政支持。
如果您的公司成为金、银或铜级赞助商,您的公司标志将显示在GitHub上的README中。引用
如果DeepFace对您的研究有所帮助,请在您的出版物中引用DeepFace - 有关详细信息,请参阅CITATIONS
。以下是其BibTex条目:
@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}
}
此外,如果您在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 License进行许可。