【问题标题】:Algorithm for finding visually similar photos from a database?从数据库中查找视觉相似照片的算法?
【发布时间】:2013-05-15 15:21:51
【问题描述】:

TinEye、Google 和其他公司提供“反向图片搜索”——您可以上传一张照片,它会在几秒钟内找到相似的照片。

这些算法有开源版本吗?


我知道“SIFT”和其他用于查找“视觉相似”照片的算法,但它们仅适用于将一张照片直接与另一张照片进行比较。即,查找与给定照片相似的照片是 O(n) 操作,查找所有视觉上相似的照片将是 O(n^2) - 这两者都非常慢。

我需要一个可由 [关系] 数据库索引的特征描述符,以将结果集缩减为更易于管理的内容。

“视觉上相似”是指非常相似。即在 Photoshop 中轻微修饰/重新着色、略微裁剪或调整大小的照片、在同一场景中快速连续拍摄的照片,或者翻转或旋转的图像。

【问题讨论】:

  • 您看过线性判别分析 (LDA) / 主成分分析 (PCA) 吗?如果我没记错的话,它们在某些时候被用于图像处理/面部识别等等。他们的强项正是在于将特征描述减少到更易于管理的内容:) 在这种情况下,像素信息
  • @Arthur:我现在正在实施“任何类型图像的图像签名”,如果这个没有成功,我会看看下一个。谢谢 :-) 不过我不需要人脸识别。
  • 几年前我建立了一个图像相似度引擎。您当然可以将特征存储在关系数据库中,但我的建议是考虑使用倒排索引作为您的查询引擎。在交付数据时,它可以让您的速度和灵活性提高一个数量级。
  • @Mark 我使用了基于 Lucene 构建的自定义分布式服务器。如今,您可以使用 Solr 或 Elasticsearch 做同样的事情,因为它们现在支持您需要的分区,以通过大量视觉词保持查询时间较短。 MoreLikeThis 查询和 CustomScore 查询是您的朋友。我们设法将几百万张图像的视觉相似性查询缩短到大约 5-30 毫秒。
  • @user1874627 我们为每个索引操作了几十万张图片,因此根据您的硬件配置,每台机器可能有 250k 到 1m 张图片……但这是 2007-8 年。这些天来,我要么查看更多 SSD、RAM 驱动器等,要么查看更便宜的横向扩展选项。图像复杂度、特征选择、特征向量到视觉词的转换以及查询粒度都是您可以调整的指标。

标签: database image algorithm image-processing


【解决方案1】:

您可以考虑的有效方法是Bag-of-Words model

基本上,您可以对目标图像进行离线计算。您可以从这些图像中提取一堆特征,以便使用k-means clustering 等算法创建一个密码本。搜索最近的图像将导致在码本空间中应用像Nearest neighbor search 这样的算法。

对于邻居搜索,您可以使用 FLANN

还请看: Visual similarity search algorithm

这只是一种可能性,而且必须说实话,这个话题真的很有挑战性,关于它的文献真的很丰富。

只是一些参考:

【讨论】:

  • 我最感兴趣的部分是我们如何在具有约 500 维向量的关系数据库上执行最近邻搜索?
  • FLANN 没有回答问题的数据库部分;)我敢肯定,一旦所有数据都在内存中,那会很棒,但是我不能每次都将一百万条记录读入内存有人执行搜索。除非我在请求之间将所有数据保存在内存中......我认为我的签名约为 500 字节,所以我可以根据 FLANN 的内存要求存储很多。
  • 您将使用 FLANN 在码本空间中进行搜索。您需要将数据库中的许多记录链接到每个密码本字。然后,您可以选择一些与该词相关联的随机图像或进行更深入的搜索。您还可以构建码本层次结构以进一步增强您的搜索
【解决方案2】:

看看http://vision.caltech.edu/malaa/software/research/image-search/它使用了LSH算法和某种kd-tree。 此任务也称为 CBIR 或图像重复搜索。

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 2011-04-27
    • 2011-04-19
    • 2016-09-01
    • 1970-01-01
    • 2011-08-13
    • 2014-09-30
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多