如何高效存储 FaceNet 数据?

How to store FaceNet data efficiently?

我正在使用Facenet算法进行人脸识别。我想基于此创建应用程序,但问题是 Facenet 算法 returns 一个长度为 128 的数组,这是每个人的面部嵌入。

对于人物识别,我必须找到两个人脸嵌入之间的欧几里德差异,然后检查它是否大于阈值。如果是,那么人是一样的;如果小于则人不同。

假设我必须在 10k 人的数据库中找到人 x。我必须计算每个人的嵌入的差异,效率不高。

有没有什么办法可以高效的存储这个人脸embedding,寻找人的效率更高?

我想阅读此博客会对其他人有所帮助。

它很详细,也涵盖了实施的大部分方面。

Face recognition on 330 million faces at 400 images per second

听起来你想要最近邻搜索。您可以查看各种 space 分区数据结构,例如 kd-trees

首先制作一个包含 10000 个面部编码的字典,如 Face_recognition 示例所示,然后将其存储为泡菜文件。当加载到内存中时,需要 sacond 才能找到 X 人脸编码与 10000 个预编码之间的距离。 take a look how it works我正在以这种方式操作数百万张面孔。

建议您将它们存储在redis或cassandra中。它们的性能将优于关系数据库。

那些键值存储可以将多维向量存储为一个值。

您可以使用 deepface 找到嵌入向量。我在下面分享了一个示例代码片段。

#!pip install deepface
from deepface import DeepFace
img_list = ["img1.jpg", "img2.jpg", ...]

model = DeepFace.build_model("Facenet")
for img_path in img_list:
    img_embedding = DeepFace.represent(img_path, model = model)
    #store img_embedding into the redis here