如何在多个嵌入身份上使用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",160))

#this finds embeddings for images
img1_embedding = model.predict(img1)
img2_embedding = model.predict(img2)

嵌入将是Facenet的128维向量。您可以运行任何聚类算法来嵌入。我已经将k-means应用于此类研究。我没有关于dbscan的任何经验,但是如果您有嵌入,可以使用它。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...