我正在尝试基于论文“使用词汇树进行可扩展识别”来实现图像搜索。我正在使用 SURF 来提取特征和关键点。例如,对于一个图像,我得到 300 个关键点,每个关键点有 128 个描述符值。我的问题是如何对数据应用 K-Means 聚类算法。我的意思是我是否需要在所有点上应用聚类算法,即 300*128 值,或者我是否需要找到连续描述符值之间的距离并存储这些值并对其应用聚类算法。我很困惑,任何帮助将不胜感激。
谢谢,
洛基。
最佳答案
从你的问题来看,我会说你很困惑。词汇树技术基于 k-means 层次聚类和叶节点的 TF-IDF 加权方案的使用。
简而言之,用于构建词汇树的聚类算法对所有 d-dimensional
数据( d=128
用于 SIFT)运行一次 k-means,然后在每个获得的集群上再次运行 k-means,直到某个深度级别。因此,词汇树构建的两个主要参数是分支因子 k
和树深度 L
。一些改进只考虑了分支因子,而深度是通过切割树来自动确定的,以满足最小方差度量。
至于实现,来自 OpenCV 的 cv::BOWTrainer
是一个很好的起点,但对于分层 BoW 方案的情况并没有很好地概括,因为它强制将中心存储在一个简单的 cv::Mat
中,而词汇树通常是不平衡的并将其映射到一个当节点数远低于具有深度 L
和分支因子 k
的平衡树中的理论节点数时,从内存使用的角度来看,逐级方式的矩阵可能效率不高,即:n << (1-k^L)/(1-k)