在信贷业务中,人脸识别是重要的认证手段之一。人脸识别作为人工智能的重要应用之一,通过对面部特征的精准捕捉和分析,为用户身份验证提供了可靠支持。它不仅能够简化传统信贷流程中繁琐的身份核验环节,还有效降低了欺诈风险,为金融机构提供了创新的风险控制手段。大多情况下,业务场景中使用 Face++ 或类似的第三方服务来实现人脸识别。这类第三方服务有着强大的技术团队作为背后支持,能够提供强大的功能和可靠的准确率。但是一方面,这类服务都是收费的,有一定的资金成本;另一方面,随着这几年人工智能相关技术的迅速发展,人脸识别已不再具有较高的技术门槛。通过开源项目和模型自主搭建人脸识别服务已不再是难事。以下是基于 DeepFace 搭建一个轻量级的人脸识别服务的探索。本文将简单介绍在这一过程中的一些经验和心得。
DeepFace 是一个 Python 实现的开源人脸识别库,支持多种任务,包括:
通过 PyPI 安装:
pip install deepface
安装库后,将其导入即可使用:
from deepface import DeepFace
DeepFace 默认会在首次运行时自动下载所需模型。若需离线部署,可预加载模型:
from deepface import DeepFace
model = DeepFace.build_model("VGG-Face")
其源代码自带一个 API 服务。若想要启动它,我们需要通过源代码进行部署:
git clone https://github.com/serengil/deepface.git
然后通过其自带脚本启动 API 服务:
cd deepface/scripts
./service.sh
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)
24-11-28 14:41:28 - find function duration 1.3992230892181396 seconds
[ identity ... distance
0 img/Trump-1.jpg ... 0.000000
1 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 verification
result = DeepFace.verify(
img1_path='img/Trump-1.jpg',
img2_path='img/Trump-2.jpg',
distance_metric = metrics[1],
)
#face recognition
dfs = DeepFace.find(
img_path='img/Trump-1.jpg',
db_path='img',
distance_metric = metrics[2],
)
DeepFace 还有一些其他功能,包括面部属性分析、人脸检测和对齐和大规模面部识别等等。这些目前不是业务上关注的重点,在此不详细阐述。你可以在其项目文档中了解更多内容。
实际探索下来仍然发现存在大量识别不正确的情况。尤其是在识别亚洲人像的场景,这可能和模型训练集有关系。我们猜测模型训练主要以外国人像为主。后续可能仍然需要对模型进行训练和微调,来提高模型识别准确性。
总体来说,DeepFace 目前适合用于一些轻量级的人脸识别场景,其高可扩展性和强大的特性使得这一过程变得简单高效。但是,目前仍然需要辅助其他认证要素,来提供授信流程的可靠性。未来,我们也将持续研究和探讨 DeepFace 的技术以及应用场景。希望本文能够对你有所帮助,也欢迎对此技术感兴趣的同学一起交流。
TakWolf,北京团队后端研发专家