如何在多个嵌入标识上使用FaceNet和DBSCAN



我有以下设置:

  1. 监控系统会拍摄人们的面部照片(每个人都有不同数量的照片(
  2. 我为每张照片运行FaceNet,并获得每个人的嵌入向量列表(每个人都由嵌入列表表示,而不是由单个嵌入列表表示(

问题:

我想使用DBSCAN对被观察到的人进行聚类,但我需要保证来自同一个人的人脸嵌入会进入同一个聚类(记住,我们可以有同一人的多张照片,我们已经知道他们一定属于同一个集群(。

一种解决方案可以是获得";平均值;或者每个人的平均嵌入,但我相信这种数据丢失会产生糟糕的结果。

另一种解决方案可以是将N个嵌入(具有N常数(连接在一个向量中,并将该512xN向量传递给DBSCAN,但问题是嵌入附加到该向量的顺序将产生不同的结果。

有人遇到过同样的问题吗?

deepface包装了facenet人脸识别模型。常规人脸识别过程如下所示。

#!pip install deepface
from deepface import DeepFace
my_set = [
["img1.jpg", "img2.jpg"],
["img1.jpg", "img3.jpg"],
]
obj = DeepFace.verify(my_set, model_name = 'Facenet')
for i in obj:
print(i["distance"])

如果你需要facenet生成的嵌入,你也可以采用deepface。

from deepface.commons import functions
from deepface.basemodels import Facenet
model = Facenet.loadModel() 
#this detects and aligns faces. Facenet expects 160x160x3 shaped inputs.
img1 = functions.preprocess_face("img1.jpg", target_size = (160, 160))
img2 = functions.preprocess_face("img2.jpg", target_size = (160, 160))
#this finds embeddings for images
img1_embedding = model.predict(img1)
img2_embedding = model.predict(img2)

嵌入将是Facenet的128维向量。您可以对嵌入运行任何聚类算法。我在这类研究中应用了k均值。我对dbscan没有任何经验,但如果你有嵌入,你可以应用它。

此外,你可以在deepface中采用不同的人脸识别模型,如vgg人脸、openface、facebook deepface、deepid和dlib。

最新更新