我有以下设置:
- 监控系统会拍摄人们的面部照片(每个人都有不同数量的照片(
- 我为每张照片运行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。