5

我正在尝试制作一个程序,可以从图像数据集中找到类似的图像。步骤是

  • 提取所有图像的 SURF 描述符
  • 存储描述符
  • 对存储的描述符应用 knn
  • 使用 kNN 将存储的描述符与查询图像描述符匹配

现在每个图像 SURF 描述符将存储为分层 k-means 树,现在我是否将每个树存储为单独的文件,或者是否可以使用所有图像描述符构建某种单树,并随着图像添加到数据集而更新。

这是我作为程序基础的论文。

4

2 回答 2

7

你确定要使用 SURF 描述符吗?我自己正在开发一个类似的应用程序,它基于这篇论文(Nister,Stewenius),他们发誓SIFT 描述符是要走的路。但是,我想您也可以使用任何其他描述符来做到这一点。

查看您引用的论文,我链接到的工作较新,但它既没有引用Nister论文也没有引用这项工作(Sivic,Zisserman),据我所知,它们是所有基于内容的图像的基础工作检索问题。

为了更好地理解问题,在开始实施之前,我首先阅读了Sivic, Zisserman以了解系统背后的总体思路。他们只在从所有特征中提取所有 SIFT 描述符后应用简单的聚类。他们使用两种不同类型的特征来提高准确性,形状适应(以角状特征为中心)和最大稳定(对应于高对比度的斑点 - 你可以在本文中查找它们 Matas 等人))。由于每个功能都直接存储,因此他们系统的可扩展性并不是那么好,但他们引入了反转文件的概念,这是一种来自文本分析的技术(您可以在此处阅读它的基础知识),它显着简化了查找过程。

在完成这项工作之后,我建议继续前往Nister 和 Stewenius,他们在 L 级中引入了分层 k 均值聚类的概念,用于存储特征,以及用于图像数据库的后期搜索。现在,除非我非常非常错误,否则您不会存储每个描述符作为单独的树。相反,您根据现有特征制作树(每个级别中的集群中心实际上是每个集群的代表“中心”特征)。一旦树被构建到所需的深度(他们建议 10 个集群超过 6 层),最后一层的集群中心代表了极少数的特征 - 因此,您实际上可以忘记所有原始特征!(或至少,它们的描述符)。每个原始特征都可以由相应的聚类中心表示,而不是描述符,对于每个图像,您只需要存储有关它包含哪些聚类中心的信息 - 特征 - 即可。这要容易得多,因为您只需要存储一两个整数每个功能 - 编码它通过树的路径。最简单的查看方法是,如果您只对每个级别的特征所属的集群的编号进行编码 - 其中有 10 个(4 位) - 对于每个级别(其中 6 个,4*6 < 32 位,所以它适合整数)。您当然可以以任何您认为合适的方式实现实际编码。哦,他们还在 MSER 区域上使用 SIFT 描述符。

此外,如果您用于构建词汇树的图像具有代表性(例如,您正在处理开放空间图片的数据集,并且您仅从图像的代表性部分构建树,但您知道没有工业图片在数据集的其余部分中种植工作场所),您可以非常快速地添加新图片。在数据集中添加任何新图片唯一需要做的就是确定哪个计算出的聚类中心最能代表图像特征(如前所述,最后一级的聚类中心非常精确)并存储有关聚类中心(前面提到的整数)。查找聚类中心应该非常快 - 6 个级别中的每个级别只有 10 个比较。

希望有一天这对某人真的有用,因为这个问题才一年多。:)

于 2012-04-06T09:47:55.517 回答
2

请改用KD-Tree。您将能够构建分层的 K 维树,您只需要弄清楚将哪种信息发送到树下以进行存储。您可以将图像的向量/描述符保存到磁盘上,每次启动程序时加载 KD-Tree。新的计算机向量/描述符既可以发送到树也可以发送到磁盘

总结

  • 创建描述符
  • 将新的描述符提供给 KD-Tree
  • 将相同的描述符保存到磁盘\
  • 每次重新启动时,将所有描述符加载到树中
  • 查询树给你最好的匹配

希望这可以帮助

于 2012-04-06T11:27:02.463 回答