从数据库中找到视觉相似照片的算法?

20

TinEye、Google等网站提供“反向图像搜索”功能 - 您可以上传一张照片,几秒钟内系统就会找到相似的图片。

是否有这些算法的开源版本?


我知道"SIFT"和其他算法用于查找“视觉上相似”的照片,但它们仅适用于将一张照片直接与另一张照片进行比较。例如,查找与给定照片相似的照片是一个O(n)操作,而要查找所有视觉上相似的照片则需要O(n^2)--这两种情况都太慢了。

我需要一个能够通过[关系型]数据库进行索引的特征描述符,以将结果集减少到更可管理的范围。

在这里,“视觉上相似”意味着非常相似。例如,经过轻微修改/重新上色的Photoshop图片,稍微裁剪或调整大小的图片,同一场景连拍的照片,或翻转或旋转的图像。


1
你有没有看过线性判别分析(LDA)/主成分分析(PCA)?如果我没记错的话,它们曾经被用于图像处理/人脸识别等方面。它们的优点正是将特征描述减少到更易管理的内容 :) 在这种情况下,就是像素信息。 - i Code 4 Food
@Arthur:我正在实现“任何类型图像的图像签名”,如果这个不行,我会接着看那个。谢谢 :-) 不过我不需要人脸识别。 - mpen
@RichardMarr:阅读维基百科上关于倒排索引的内容...我应该将倒排索引作为一个单独的查找表实现在关系型数据库中,还是您建议使用非关系型数据库或平面文件来实现? - mpen
2
@Mark 我使用了基于Lucene构建的自定义分布式服务器。现在,你可以使用Solr或Elasticsearch来做同样的事情,因为它们支持分区,以保持在大量视觉单词下查询时间的低延迟。MoreLikeThis查询和CustomScore查询是你的好朋友。我们成功将几百万张图片的视觉相似度查询时间降低到了5-30毫秒左右。 - Richard Marr
2
@user1874627,我们每个索引操作了几十万张图片,因此根据您的硬件配置,每台机器可能在250k到1m之间...但这是2007-8年的情况。如今,我会考虑更多的SSD、RAM驱动器等,并寻找更便宜的水平扩展选项。图像复杂度、特征选择、将特征向量转换为视觉单词以及查询粒度都是您可以调整的参数。 - Richard Marr
显示剩余2条评论
2个回答

17

您可以考虑采用有效的方法——词袋模型来解决问题。

基本上,您可以对目标图像进行离线计算。通过提取这些图像中的一堆特征,可以使用k-means聚类等算法创建代码簿。在代码簿空间中搜索最近的图像将导致应用类似最近邻搜索的算法。

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

还可以参考以下链接:视觉相似性搜索算法

这仅是一种可能性,实话实说,这个主题真的很具有挑战性,相关文献也非常多。

仅提供一些参考:

  • ScSPM技术
  • 相关性学习的计算机视觉应用
  • 局部SVM分类器的一种形式化学习方法

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

    2

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接