【问题标题】:How to store FaceNet data efficiently?如何高效存储 FaceNet 数据?
【发布时间】:2021-07-31 09:12:35
【问题描述】:

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

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

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

有没有什么办法可以高效的存储这个人脸嵌入,搜索效率更高的人?

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

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

Face recognition on 330 million faces at 400 images per second

【问题讨论】:

    标签: database algorithm database-design database-schema face-recognition


    【解决方案1】:

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

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

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

    #!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
    

    【讨论】:

    • 我只是不想存储人脸嵌入,但我还需要遍历所有并找到与当前人脸嵌入的差异,用于人员识别。所以你觉得redis可以帮助高效搜索还是说traverse高效?
    • 这可以通过 redis、cassandra 或 mongodb 来完成。它们都有一个数组数据类型。
    【解决方案2】:

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

    【讨论】:

    • 可以分享一些对此方法的时间分析。这对我有很大帮助。谢谢.....
    • 通常在 aprox. 170 个数据文件,总共 400 万张面孔,耗时 10 秒。然而,170 个数据文件意味着 170 个加载/解酸周期。所以,如果你有更少的面孔或足够大的 RAM 来一次加载所有编码数据 - 面孔比较将需要几毫秒。
    • ...实际上是 12 - 15 秒。
    【解决方案3】:

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

    【讨论】:

    • 你能详细描述一下这种方法吗,因为网上找不到kdtree的数组版本。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2015-05-25
    • 2012-10-23
    • 2011-12-12
    • 2015-02-04
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多