cover_image

基于DeepFace搭建轻量级人脸识别服务的探索

TakWolf 拍码场 2024年12月11日 08:21

引言

在信贷业务中,人脸识别是重要的认证手段之一。人脸识别作为人工智能的重要应用之一,通过对面部特征的精准捕捉和分析,为用户身份验证提供了可靠支持。它不仅能够简化传统信贷流程中繁琐的身份核验环节,还有效降低了欺诈风险,为金融机构提供了创新的风险控制手段。大多情况下,业务场景中使用 Face++ 或类似的第三方服务来实现人脸识别。这类第三方服务有着强大的技术团队作为背后支持,能够提供强大的功能和可靠的准确率。但是一方面,这类服务都是收费的,有一定的资金成本;另一方面,随着这几年人工智能相关技术的迅速发展,人脸识别已不再具有较高的技术门槛。通过开源项目和模型自主搭建人脸识别服务已不再是难事。以下是基于 DeepFace 搭建一个轻量级的人脸识别服务的探索。本文将简单介绍在这一过程中的一些经验和心得。


DeepFace 简介

DeepFace 是一个 Python 实现的开源人脸识别库,支持多种任务,包括:

  • 人脸验证 (Face Verification)
  • 人脸识别 (Face Recognition)
  • 面部属性分析 (Facial Attribute Analysis)
  • 人脸检测和对齐 (Face Detection and Alignment)
  • 人脸防欺骗 (Face Anti Spoofing) 此外,它是一个混合模型框架,包装的模型包括:VGG-Face、FaceNet、OpenFace、DeepFace、DeepID、ArcFace、Dlib、SFace 和 GhostFaceNet。所有模型的识别准确率均已达到或超越 97.53%。

环境搭建

安装使用

通过 PyPI 安装:

pip install deepface

安装库后,将其导入即可使用:

from deepface import DeepFace

下载预训练模型

DeepFace 默认会在首次运行时自动下载所需模型。若需离线部署,可预加载模型:

from deepface import DeepFacemodel = DeepFace.build_model("VGG-Face")

启动默认 API 服务

其源代码自带一个 API 服务。若想要启动它,我们需要通过源代码进行部署:

git clone https://github.com/serengil/deepface.git

然后通过其自带脚本启动 API 服务:

cd deepface/scripts./service.sh

API 默认服务终端节点包括:

  • http://localhost:5005/verify 用于人脸识别
  • http://localhost:5005/analyze 面部属性分析
  • http://localhost:5005/represent 矢量表示 API 参数接受图像文件,或确切的图像路径、URL 或 base64 编码的字符串。其默认的 API 功能有限,更多是用于快速演示。实际我们还是需要根据自身业务情况,定制化开发 API 接口。

核心功能

人脸验证

判断两个人脸是否为同一个人员。参数接受精确的图像路径、numpy 或 base64 编码的图像。

result_1 = DeepFace.verify(    img1_path='img/Long-1.jpg',    img2_path='img/Long-2.jpg',)result_2 = DeepFace.verify(    img1_path='img/Long-1.jpg',    img2_path='img/Hua-1.jpg',)print(result_1)print(result_2)

图片

{'verified': True, 'distance': 0.29760263071930937, 'threshold': 0.68, 'model': 'VGG-Face', 'detector_backend': 'opencv', 'similarity_metric': 'cosine', 'facial_areas': {'img1': {'x': 352, 'y': 122, 'w': 301, 'h': 301, 'left_eye': (547, 223), 'right_eye': (438, 245)}, 'img2': {'x': 158, 'y': 211, 'w': 324, 'h': 324, 'left_eye': (379, 320), 'right_eye': (250, 330)}}, 'time': 2.21}{'verified': False, 'distance': 0.9037278847859949, 'threshold': 0.68, 'model': 'VGG-Face', 'detector_backend': 'opencv', 'similarity_metric': 'cosine', 'facial_areas': {'img1': {'x': 352, 'y': 122, 'w': 301, 'h': 301, 'left_eye': (547, 223), 'right_eye': (438, 245)}, 'img2': {'x': 351, 'y': 123, 'w': 226, 'h': 226, 'left_eye': (511, 215), 'right_eye': (430, 215)}}, 'time': 0.6}

人脸识别

在数据库路径中查找输入图像的标识,并将返回 pandas 数据帧列表作为输出。 db_path 是一个包含图片的文件夹路径。

result = DeepFace.find(    img_path='img/Trump-1.jpg',    db_path='img',)print(result)

图片

11-28 14:41:26 - Searching img/Trump-1.jpg in 5 length datastore
24-11-28 14:41:28 - find function duration 1.3992230892181396 seconds[          identity  ...  distance0  img/Trump-1.jpg  ...  0.0000001  img/Trump-2.jpg  ...  0.230247[2 rows x 12 columns]]

查询完成后,在数据库目录中生成了一个 ds_model_vggface_detector_opencv_aligned_normalization_base_expand_0.pkl 文件。这是引擎将面部数据库的面部嵌入存储在 pickle 文件中,以便下次更快地搜索。

反欺诈

DeepFace 还包括一个反欺骗分析模块,用于了解给定图像是真是假。这在业务场景中非常有用,我们通常需要判断给出的图片是否是一个这人。下面的图片是通过生成式 AI 制作的人像图片,我们来测试一下:

图片

face_objs_1 = DeepFace.extract_faces(    img_path='img/AI-1.jpg',    anti_spoofing=True,)print(face_objs_1)    face_objs_2 = DeepFace.extract_faces(    img_path='img/AI-2.jpg',    anti_spoofing=True,)print(face_objs_2)

输出结果:

[{'is_real': True, 'antispoof_score': np.float64(0.9997049868106842)}][{'is_real': False, 'antispoof_score': np.float64(0.2883934259414673)}]

你会发现,他就第一张识别为真人,而第二章识别为假人。但是两张其实都是 AI 生成的。只能说目前生成式 AI 的发展确实很快,很多图片已经以假乱真了。实际业务环境中,还需要其他认证要素来辅助,并不能完全依赖这个反欺诈模块。

嵌入式向量

模型本质上仍然是将人脸图像表示为多维向量。你可以直接生成这个向量,这方便我们后续制作专用的人脸数据库或者知识库。注意,DeepFace 带有专用的表示功能,返回结果是将图片中的面部区域做向量化。

embedding_objs = DeepFace.represent(    img_path='img/Trump-1.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

相似性算法

人脸识别模型是常规的卷积神经网络,它们负责将人脸表示为向量。我们期望同一个人的面孔对应该比不同人的面孔对更相似。相似度可以通过不同的指标来计算,例如余弦相似度、欧几里得距离或 L2 归一化欧几里得。默认配置使用余弦相似性。根据实验,没有距离指标的表现优于其他指标。你可以在函数中指定具体的相似性算法。

metrics = ["cosine", "euclidean", "euclidean_l2"]#face verificationresult = DeepFace.verify(    img1_path='img/Trump-1.jpg',    img2_path='img/Trump-2.jpg',    distance_metric = metrics[1],)#face recognitiondfs = DeepFace.find(    img_path='img/Trump-1.jpg',     db_path='img',     distance_metric = metrics[2],)

其他功能

DeepFace 还有一些其他功能,包括面部属性分析、人脸检测和对齐和大规模面部识别等等。这些目前不是业务上关注的重点,在此不详细阐述。你可以在其项目文档中了解更多内容。

局限性

实际探索下来仍然发现存在大量识别不正确的情况。尤其是在识别亚洲人像的场景,这可能和模型训练集有关系。我们猜测模型训练主要以外国人像为主。后续可能仍然需要对模型进行训练和微调,来提高模型识别准确性。

总结

总体来说,DeepFace 目前适合用于一些轻量级的人脸识别场景,其高可扩展性和强大的特性使得这一过程变得简单高效。但是,目前仍然需要辅助其他认证要素,来提供授信流程的可靠性。未来,我们也将持续研究和探讨 DeepFace 的技术以及应用场景。希望本文能够对你有所帮助,也欢迎对此技术感兴趣的同学一起交流。

作者介绍

TakWolf,北京团队后端研发专家

招聘信息


人工智能 · 目录
上一篇AI Agent在问答与排障中的实践探索下一篇AI Agent在知识挖掘领域的落地实践——信安小卫士
继续滑动看下一个
拍码场
向上滑动看下一个