我正在阅读dlib's face clustering code并注意到这个过程是这样的:
在尝试聚类大量(> 10,000)图像时,中文耳语群集可能需要相当长的时间。
在这篇pyimagesearch文章中,作者使用DBSCAN,另一种聚类算法按人分组了许多图像。
由于神经网络生成的向量可用于计算两个面之间的相似性,因此计算euclidean distance matrix不是更好,然后搜索满足置信度阈值的所有值(例如x <0.3表示70%置信度)?
为什么只要将每个面部与其他面部进行比较以确定哪些是同一个人,为什么要使用聚类算法呢? DBSCAN和中文耳语聚类比计算距离矩阵花费更长的时间。使用我的30,000张图像的数据集,时间是:
C-耳语 - 5分钟
距离矩阵+搜索 - 10-20秒
DBSCAN实际上只比计算距离矩阵略长(当正确实现时,99%的计算是距离计算)并且索引有时可以更快,因为如果索引可以修剪计算,它不需要每个成对距离。
但你不能只是从距离矩阵“读出”集群。数据可能存在矛盾:人脸探测器可能认为A和B类似,B类似C,但A和C不同!那你怎么办呢?聚类算法试图解决这种情况。例如,单链路和较小范围的DBSCAN将使A和C成为相同的集群,而完全链接将决定AB或BC。
实际上,dlib的实现正在做一些与您的想法非常相似的事情。 Here是代码。它首先检查每一对并拒绝距离大于阈值的对。这正是你提出的。但随后它正在对结果进行精细聚类。那么,会有什么变化?
如果您有完全分离的数据点,只需按距离切断就可以工作。但是,如果您的数据点非常接近,则此问题变得非常困难。想象一下一维功能。您的数据点是0到10之间的整数位置,如果距离最多为1.5,则希望将两个数据点放在一个簇中。那么,你会做什么?如果你从一对开始,你可以建立一个集群。但是,如果您选择一个相邻点,您将看到它将比您的阈值更接近已经在群集中的一个点并且大于另一个点的阈值。聚类是为了解决这种模糊性。