聚类 512-D 面部 Embeddings/Vectors

Clustering 512-D Facial Embeddings/Vectors

我有一套 1900+ 512-D 面部护理 embeddings/vectors,我想将所有类似的东西分组 individuals/faces。还有未知数量的不同面孔。

我已经雇用了 sklearn.cluster.DBSCAN similar to the suggestion in PyImageSearch Face Clustering with Python。但是,它无法有效聚类,返回 0 个聚类。我相信矩阵太稀疏了。相信有几个选择:

现在正在尝试不同的方法,但也许有一个众所周知的method/approach我错过了?

首先,我认为检查人脸识别使用的相似性度量来确定两个嵌入是否属于同一个人很重要。一些引擎使用余弦相似度而不是欧氏距离。(例如 Sphereface 或 Arcface)

其次,我会检查此相似性测量的阈值是多少,人脸识别引擎认为两个嵌入是同一个人。通常这样做是为了在标记数据集上平衡 TP 和 FP。

利用以上两点我将做如下算法:

  1. 在所有嵌入 A1900x1900 矩阵之间创建相似性矩阵,其中条目 I,j 的值对应于嵌入 I 和嵌入 j 之间测量的相似性。
  2. 使用适当的值(上面的第二点)对矩阵进行阈值处理。矩阵中高于阈值的每个条目将获得 1,低于阈值的将获得零
  3. 将阈值矩阵视为图的邻接矩阵,运行图连通分量算法(使用 BFS 或 DFS)求分量数。每个组件对应一个唯一标识。

关于第二点的注意事项:您可以使用一些人脸识别数据集(如 LFW 或名人 a)自己找到阈值,并通过平衡 FP 和 TP 来准确决定您希望如何微调阈值。

DBSCAN 在特征规范化后似乎可以工作,但是由于在某些情况下它无法足够具体,因此在我们的应用程序中造成了一些困难。