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

2024-07-04 15:53:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读dlib's face clustering code,注意到过程如下:

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

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

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

由于神经网络生成的向量可以用来计算两个人脸之间的相似度,那么仅仅计算一个euclidean distance matrix,然后搜索所有满足置信阈值的值(例如x<;0.3表示70%的置信度)不是更好吗?在

为什么要使用聚类算法,因为你可以将每个人脸与其他人脸进行比较,以确定哪些是同一个人?DBSCAN和chinese-whisper聚类都比计算距离矩阵花费的时间长得多。在我的30000张图片的数据集中,纽约时报是:

C-whisper-5分钟

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


Tags: 图像算法利用距离时间code矩阵聚类
2条回答

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

但是你不能仅仅从距离矩阵中“读出”簇。这里的数据可能是矛盾的:人脸检测器可能认为A和B相似,B与C相似,但A和C不同!那你是做什么的?聚类算法试图准确地解决这种情况。例如,单个链路,以及较小范围的DBSCAN,将使a和C成为同一个集群,而完整的链路将决定AB或BC。在

实际上,dlib的实现与您所想的非常相似。Here是代码。它首先检查每个对,并拒绝距离大于阈值的对。这正是你提议的。但是它对结果进行了精细的聚类。那么,会有什么改变呢?在

如果数据点分离得很好,那么简单地按距离切断就可以了。但是,如果数据点彼此非常接近,这个问题就变得非常困难。想象一下1D特性。数据点是0到10之间的整数位置,如果两个数据点的距离最大为1.5,则需要将它们放在一个簇中。那么,你会怎么做?如果你从一对开始,你可以形成一个集群。但是如果你选择了一个相邻的点,你会发现它比你的阈值更接近簇中已有的一个点,而大于另一个点的阈值。聚类就是为了解决这种模糊性。在

相关问题 更多 >

    热门问题