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

时间:2019-04-02 01:11:58

标签: python algorithm cluster-analysis face-recognition dlib

我在阅读dlib's face clustering code时发现过程是这样的:

  1. 使用经过训练的网络将人脸转换为矢量
  2. 使用中文耳语聚类算法基于距离计算群体

当试图对大量(> 10,000)图像进行聚类时,中国耳语聚类会花费相当长的时间。

在此pyimagesearch文章中,作者使用DBSCAN(DBSCAN),这是另一种聚类算法,可以按人对许多图像进行分组。

由于神经网络生成的向量可用于计算两个脸部之间的相似度,所以只计算euclidean distance matrix并搜索满足置信度阈值的所有值(例如,x <0.3表示70%置信度)?

当您只需将每张面孔与其他面孔进行比较以确定哪些人是同一个人时,为什么要完全使用聚类算法? DBSCAN和中国耳语聚类都比计算距离矩阵要花费更长的时间。用我的30,000张图像数据集,时间是:

耳语-5分钟

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

2 个答案:

答案 0 :(得分:2)

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

但是您不能只是从距离矩阵中“读取”簇。那里的数据可能是矛盾的:面部检测器可能认为A和B相似,而B与C相似,但是A和C不相似!那你怎么办呢?聚类算法试图完全解决这种情况。例如,单链接和较小范围的DBSCAN,将使A和C成为同一群集,而完全链接将决定AB还是BC。

答案 1 :(得分:1)

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

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