在python中存储面部编码列表以进行面部识别

问题描述 投票:0回答:1

我正在一个项目中,该项目可能具有大量用于人脸识别的人脸编码列表,我正在使用face_recognition模块。将图像传递给它会返回面部编码,该面部编码本质上是一个对象。我目前的想法是在存储编码的列表中使用pickle模块,然后在构造函数中再次将其加载到列表中。我觉得这种方法无法很好地扩展,最好使用某种数据库来存储它们。

有人对此有任何想法吗?如果我要使用数据库,我将如何在该数据库中存储对象?

更具体地说,编码类型为numpy.ndarray

谢谢!

python database sqlite numpy face-recognition
1个回答
0
投票

如果您要将程序用作一般的面部识别方法,将它们作为单独的记录存储在数据库中可能不是一个好主意。考虑这种情况:您有100,000个编码矢量,并且您想检查新照片在以前看到的面孔中是否有相应的记录。由于您需要将新向量与所有已存储向量进行比较,因此您需要根据每个请求将所有向量都加载,或者将它们加载一次并将其缓存在内存中,以对所有向量进行矢量化操作(例如,获得欧氏距离) 。

如您所见,没有使用诸如索引,在字段中搜索,事务等数据库操作。因此,我建议在磁盘上保留pickle对象以保持持久性,并在调用程序时将它们加载一次。如果要从存储中添加/删除内容,建议使用NoSQL数据库(如MongoDB)存储对象。这使您可以避免创建没有意义的表/处理BLOB等对您没有任何好处的表。这是一个用于处理mongo的入门程序(您需要在运行代码之前安装它):

from pymongo import MongoClient
import numpy as np

client = MongoClient('localhost', 27018)
db = client['face_db']

faces = db.face

first_person_name = "John"
first_sample_face_embedding = np.random.rand(128).tolist() 

second_person_name = "Julia"
second_sample_face_embedding = np.random.rand(128).tolist()

faces.insert_many([
    {"name": first_person_name, "embedding": first_sample_face_embedding},
    {"name": second_person_name, "embedding": second_sample_face_embedding}
])

#### load data back

all_docs = list(faces.find({}))
names, embeddings = [doc["name"] for doc in all_docs], [doc["embedding"] for doc in all_docs]

embeddings = np.array(embeddings)


target_embedding = np.random.rand(128)

# do stuff here

您可以阅读this帖子以获取有关在python中使用mongo的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.