【问题标题】:Implementing Vocabulary Tree in OpenCV在 OpenCV 中实现词汇树
【发布时间】:2011-08-15 19:53:03
【问题描述】:
我正在尝试基于论文“Scalable Recognition with a Vocabulary Tree”实现图像搜索。我正在使用 SURF 来提取特征和关键点。例如,对于一个图像,我得到 300 个关键点,每个关键点有 128 个描述符值。我的问题是如何将 K-Means 聚类算法应用于数据。我的意思是我是否需要对所有点应用聚类算法,即 300*128 值,或者我是否需要找到连续描述符值之间的距离并存储这些值并对其应用聚类算法。我很困惑,我们将不胜感激。
谢谢,
洛基。
【问题讨论】:
标签:
opencv
k-means
image-recognition
feature-detection
【解决方案1】:
从你的问题我想说你很困惑。词汇树技术基于使用 k-means 层次聚类和叶节点的 TF-IDF 加权方案。
简而言之,用于构建词汇树的聚类算法对所有 d-dimensional 数据(对于 SIFT 的情况为 d=128)运行一次 k-means,然后在每个获得的集群上再次运行 k-means直到某个深度水平。因此,词汇树构造的两个主要参数是分支因子k 和树深度L。一些改进只考虑了分支因子,而深度是通过切割树来自动确定的,以满足最小方差度量。
至于实现,来自 OpenCV 的 cv::BOWTrainer 是一个很好的起点,尽管对于分层 BoW 方案的情况不是很好概括,因为它强制将中心存储在一个简单的 cv::Mat 中,而词汇树是当节点数远低于深度为L 和分支的平衡树中的理论节点数时,通常不平衡并将其以逐级方式映射到矩阵可能效率不高因子k,即:
n << (1-k^L)/(1-k)
【解决方案3】:
查看libvot中的代码,在src/vocab_tree/clustering.*中,可以找到聚类算法的详细实现。