为什么人脸聚类算法不使用距离矩阵而不是聚类算法?

Why don't Face Clustering Algorithms use Distance matrices rather than clustering algorithms?

我正在阅读 dlib's face clustering code 并注意到过程是这样的:

  1. 使用经过训练的网络将面孔转换为矢量
  2. 使用中文耳语聚类算法根据距离计算分组

在尝试对大量(>10,000)图像进行聚类时,中文耳语聚类可能需要相当长的时间。

在这篇 pyimagesearch 文章中,作者使用另一种聚类算法 DBSCAN 来按人物对大量图像进行分组。

既然神经网络生成的向量可以用来计算两张人脸的相似度,那么直接计算一个euclidean distance matrix,然后搜索所有满足某个置信度的值岂不是更好阈值(例如,对于 70% 的置信度,x < 0.3)?

当您只需将每张脸与其他每张脸进行比较以确定哪些是同一个人时,为什么还要使用聚类算法呢? DBSCAN 和 chinese whisper clustering 都比计算距离矩阵花费更长的时间。对于我的 30,000 张图像数据集,时间是:

C-耳语 - 5 分钟

距离矩阵 + 搜索 - 10-20 秒

实际上,dlib 的实现与您的想法非常相似。 Here 是代码。它首先检查每一对并拒绝距离大于阈值的对。这正是您提出的建议。但随后它对结果进行了很好的聚类。那么,会发生什么变化?

如果您的数据点分离良好,则可以简单地按距离切断。但是,如果您的数据点彼此非常接近,这个问题就会变得非常困难。想象一个一维特征。您的数据点是 0 到 10 之间的整数位置,如果它们的距离最多为 1.5,您希望将两个数据点放在一个簇中。那么,你会怎么做?如果你从一对开始,你可以做一个集群。但是如果你选择一个相邻的点,你会发现它比你的阈值更接近集群中已经存在的一个点,并且比另一个点的阈值大。聚类就是要解决这个歧义。

DBSCAN 实际上只比计算距离矩阵稍微长一点(正确实施时,99% 的计算是距离计算)并且使用索引有时会快得多,因为如果索引,它不需要每对距离可以修剪计算。

但是你不能只从距离矩阵中 "read off" 聚类。那里的数据可能是矛盾的:人脸检测器可能认为 A 和 B 相似,B 和 C 相似,但 A 和 C 不相似!那你怎么办呢?聚类算法试图准确地解决这种情况。例如,单一 Link 和更小的 DBSCAN 扩展将使 A 和 C 成为相同的集群,而完整的链接将决定 AB 或 BC。