Algorithm 如何使用Opencv存储大量图像的分层K-均值树?

Algorithm 如何使用Opencv存储大量图像的分层K-均值树?,algorithm,image-processing,computer-vision,feature-detection,Algorithm,Image Processing,Computer Vision,Feature Detection,我正在尝试制作一个程序,可以从图像数据集中找到类似的图像。步骤是 为所有图像提取SURF描述符 存储描述符 对存储的描述符应用knn 使用kNN将存储的描述符与查询图像描述符匹配 现在,每个图像冲浪描述符将被存储为分层k-均值树,现在,我是否将每个树存储为一个单独的文件,或者是否可以使用所有图像描述符构建某种单一的树,并在图像添加到数据集时进行更新 您确定要使用冲浪描述符吗?我自己也在开发一个类似的应用程序,它是基于纸(Nister,Stewenius)的,他们发誓要使用SIFT描述符。但是

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

  • 为所有图像提取SURF描述符
  • 存储描述符
  • 对存储的描述符应用knn
  • 使用kNN将存储的描述符与查询图像描述符匹配
现在,每个图像冲浪描述符将被存储为分层k-均值树,现在,我是否将每个树存储为一个单独的文件,或者是否可以使用所有图像描述符构建某种单一的树,并在图像添加到数据集时进行更新


您确定要使用冲浪描述符吗?我自己也在开发一个类似的应用程序,它是基于纸(Nister,Stewenius)的,他们发誓要使用SIFT描述符。但是,我想你也可以用其他的描述词来描述

看看你提到的那篇论文,我链接到的那篇文章是新的,但它没有提到or(Sivic,Zisserman),据我所知,or是解决所有基于内容的图像检索问题的基础

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

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

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

希望有一天这对某人真的有用,因为这个问题刚过一年

改用a。您将能够构建层次化的K维树,您只需要弄清楚什么样的信息被发送到树下进行存储。您可以将图像的矢量/描述符保存到磁盘上,并在每次启动程序时加载KD树。新的计算机向量/描述符可以发送到树和磁盘

概括

  • 创建描述符
  • 将新描述符输入KD树
  • 将相同的描述符保存到磁盘\
  • 每次重新启动时,将所有描述符加载到树中
  • 查询树以获得最佳匹配

希望这能有所帮助

当我这样做时,我确实使用了kd trees,但无论如何还是要谢谢你。不过,当你这样做时,你本可以回答自己的问题,而不是让它坐在那里不回答。。。