4

我想制作一个程序,它会从图像数据集中找到相似的图像。这些步骤是如何使用Opencv存储大量图像的分层K均值树?

  • 所有图像
  • 商店描述
  • 适用于存储的描述
  • 匹配的存储的描述来使用的kNN

查询图像描述KNN提取SURF描述符现在,每个图像SURF描述符将被存储为分层k-均值树,现在我是否将每棵树存储为单独的文件,或者是否可以构建某种具有所有图像描述符的单一树当图像被添加到数据集时更新。

This is the paper I am basing the program on.

回答

2

改为使用KD-Tree。你将能够构建分层的K维树,你只需要找出哪些信息被发送到树中存储。您可以将图像的矢量/描述符保存到磁盘上,每次启动程序时加载KD-Tree。新计算机矢量/描述既可以是发送到树和磁盘

总结

  • 创建描述
  • 订阅新的描述,以KD树
  • 保存与磁盘相同的描述符\
  • 在每次重新启动时,将所有描述符加载到树中
  • 查询树给你的最佳匹配

希望这有助于

+1

我没有最终使用KD树,我这样做的时候,但无论如何感谢。 – AquaAsh 2012-04-12 08:32:32

+0

不错,你已经做到了这一点:) – 2012-04-12 17:30:24

+1

虽然你可以回答自己的问题,但不要让它坐在那里没有答案...... – penelope 2012-04-19 09:01:41

6

你肯定要与SURF描述符做呢?我只是在自己开发一个类似的应用程序,它基于this论文(Nister,Stewenius),他们发誓 SIFT描述符是要走的路。但是,我想你也可以用其他描述符来完成。

看看你引用的文章,我链接到的作品更新,但它并没有参考Nister paperthis work(Sivic,Zisserman),据我所知,这些作品都适用于所有内容基于图像检索的问题。

为了更好地理解问题,在开始实施之前,我首先阅读了Sivic, Zisserman以获得系统背后的总体思路。在从所有特征中提取所有SIFT描述符后,它们只应用简单的聚类。他们使用两种不同类型的特征以获得更好的精度,Shape Adapted(以特征为中心的角落)和Maximally Stable(对应于高对比度斑点 - 您可以在this论文(Matas等人)中查找它们)。由于每个功能的直接存储,他们的系统的可扩展性并不是很好,但他们引入了反转文件的概念,这是一种来自文本分析的技术(您可以阅读它的基本知识here),这极大地简化了查找过程。

在征服了这项工作之后,我建议继续到Nister, Stewenius,他们在这里介绍了L级分层k-均值聚类的概念以存储特征,以及后面的图像数据库搜索。现在,除非我非常误解,否则不会将每个描述符作为单独的树存储在之内。相反,您基于现有功能(每个集群中的集群中心实际上是每个集群的代表性“中心”特征)生成树。一旦树构建到所需的深度(他们推荐10个集群,超过6个级别),最后一级的集群中心仅代表极少数特征 - 因此,您实际上可以忘记所有原始特征! (或者至少是他们的描述符)。每个原始特征可以由相应的聚类中心表示,而不是描述符,对于每个图像,您只需存储有关哪些聚类中心 - 特征 - 包含的信息。这很容易,因为你只需要存储一个或两个整数每个功能 - 通过树编码它的路径。最简单的方法是,如果您只是在每个级别编写该功能所属群集的编号 - 其中有10个(4位) - 对于每个级别(其中6个,4 * 6,< 32位,所以它适合于一个整数)。您当然可以按照您认为合适的方式实施实际编码。哦,他们也在MSER区域使用SIFT描述符。另外,如果用于构建词汇树的图像具有代表性(例如,您正在开发空间图片的数据集并且仅从图像的代表性部分构建树,但您知道存在在数据集的其余部分没有工业工厂的图片),您可以非常快速地添加新图片。在数据集中添加任何新图片所需做的唯一一件事就是确定哪个计算出的聚类中心代表最佳的图像特征(如前所述,聚类中心的最后一级非常精确)并存储关于聚类中心(前面提到的整数)。查找集群中心应该非常快 - 在6个级别中只有10个比较。

希望这对某个人来说实际上是有用的,因为问题已经过了一年多了。 :)