我当时正在读dlib的人脸聚类代码,注意到这个过程是这样的:
当试图对大量(>10,000)图像进行聚类时,中文耳语聚类可能需要相当长的时间。
在这篇吡咯搜索文章中,作者使用另一种聚类算法DBSCAN按人对多幅图像进行分组。
由于神经网络生成的向量可以用来计算两面之间的相似性,那么,如果只计算一个欧氏距离矩阵,然后搜索所有满足置信阈值的值(例如,70%置信度x< 0.3 ),岂不是更好?
为什么要使用聚类算法,因为您只需比较每一张脸和每一张脸,就可以确定哪一张是同一个人?DBSCAN和中文耳语聚类都比计算距离矩阵花费的时间长得多。根据我的30,000幅图片的数据集,“时代”杂志:
C-耳语-5分钟
距离矩阵+搜索-10-20秒
发布于 2019-04-02 06:15:27
DBSCAN实际上只需要比计算距离矩阵稍微长一点(当实现正确时,99%的计算是距离计算),而使用索引有时要快得多,因为如果索引能够修剪计算,则不需要每个成对的距离。
但是你不能仅仅从距离矩阵中“读出”集群。那里的数据可能是矛盾的:人脸检测器可能认为A和B相似,B类似于C,而A和C则不同!那你是做什么的?聚类算法试图解决这种情况。例如,单链路,在较小程度上,DBSCAN将使A和C成为相同的集群,而完全的链接将决定AB或BC。
发布于 2019-04-02 02:36:04
实际上,dlib的实现所做的事情与您所想的非常相似。这里是代码。它首先检查每对,然后拒绝距离大于阈值的对。这正是你提议的。但是,它正在对结果进行精细的聚类。那么,什么会改变呢?
如果数据点分离得很好,那么简单地按距离进行切断就可以了。但是,如果数据点彼此非常接近,这个问题就变得非常困难。想象一下一维功能。数据点是0到10之间的整数位置,如果距离最多为1.5,则希望将两个数据点放在一个集群中。那你会怎么做?如果你从一对开始,你可以形成一个集群。但是,如果你选择一个相邻的点,你会发现它会比你的阈值更接近你已经在集群中的一个点,而比另一个点的阈值更大。聚类就是解决这种模糊性的问题。
https://stackoverflow.com/questions/55465574
复制相似问题