Google对其“按图像搜索”网站使用什么算法?


45

您最好的猜测是Google图片搜索如何工作?我可以上传照片,也可以搜索相似的图像。它用于识别相似图像的算法是什么?


他们可能会存储图像的直方图。这适用于同一图像的不同比例,以及由于压缩伪影或其他原因而导致的细微差异。
氦气2012年

1
直方图无法捕获空间信息;您会得到错误的匹配。
Emre 2013年

Answers:


29

我不知道Google使用哪种算法。但是,既然您想要一个最佳的猜测,那么让我就如何构建类似的系统给出一些想法。

处理基于图像的逐个图像的整个领域称为基于内容的图像检索(CBIR)。该想法是要以某种方式构造包含有关图像内容的信息的图像表示(人类不一定理解)。

存在两种基本方法:

  • 使用低级(局部)特征进行检索:图像特定部分的颜色,纹理,形状(图像是局部特征描述符的集合)
  • 语义方法,其中图像以某种方式表示为对象及其关系的集合

对底层的本地方法进行了很好的研究。当前最好的方法是提取局部特征(这里涉及到特征提取算法的选择),并使用其局部描述符(同样,选择描述符)来比较图像。

在较新的作品中,首先对本地描述符进行聚类,然后将聚类视为可视单词 -然后,该技术与Google文档搜索非常相似,只是使用可视单词而不是字母单词。

您可以将视觉单词视为等同于语言中的单词词根:例如,单词:work,working,worked都属于同一个单词词根。

这些方法的缺点之一是它们通常在低纹理图像上表现不佳。

我已经给出并看到了许多详细说明这些方法的答案,因此,我仅提供指向这些答案的链接:

  • CBIR:12
  • 特征提取/描述:1234

语义方法通常基于整个图像的分层表示。这些方法尚未完善,特别是对于一般图像类型。将这类技术应用于特定的图像域取得了一些成功。

由于我目前正在研究这些方法,因此无法得出任何结论。话虽如此,我在这个答案中解释了这些技术背后的总体思路。

再次,简短地说:总体想法是用树形结构表示图像,其中叶子包含图像细节,并且可以在更靠近此类树根的节点中找到对象。然后,以某种方式比较子树以标识包含在不同图像中的对象。

以下是有关不同树表示形式的一些参考。我没有全部阅读,其中一些使用这种表示法而不是CBIR进行细分,但它们仍然是:


22

除了对佩内洛普的回答外,还有两种方法,感知哈希和词袋模型,它们的基本功能易于实现,因此在尝试进入更高级的领域之前可以很好地使用或学习。

感知哈希

感知哈希算法旨在构造一个哈希,该哈希与密码哈希不同,它将为已通过例如缩放或JPEG压缩而稍微失真的相同图像提供相似或接近相似的哈希值。它们在检测图像集合中的重复项时很有用。

您可以按照其最基本的形式来实现此目标:

  1. 将图像转换为灰度

  2. 使您的图像为零均值

  3. 将图片粉碎为缩略图尺寸,例如[32x32]
  4. 运行二维离散余弦变换
  5. 保持左上角[8 x 8]为最重要的低频分量
  6. 根据组件的符号对块进行二值化

结果是有弹性的64位哈希,因为它基于图像的低频成分。此主题的一种变体是将每个图像划分为64个子块,并将全局图像均值与本地子块均值进行比较,并相应地写出1或0。

感知哈希例如由phash实现

词袋模型

词袋模型旨在从语义上识别图像,例如其中包含狗的所有图像。它通过使用某些图像补丁来实现此目的,其精神与人们根据某些单词的出现来对文本文档进行分类一样。可以对单词进行分类,例如说“ dog”和“ dogs”,并将它们作为标识符存储在反向文件中,其中“ dog”类别现在指向包含“ dog”或“ dogs”的所有文档。

以最简单的形式,可以使用以下图像进行操作:

  1. 部署所谓的SIFT功能,例如使用出色的vlfeat库,该库将检测SIFT特征点和每个点的SIFT描述符。该描述符基本上是围绕该特征点的图像补丁的智能构建模板。这些描述符是您的原始话。
  2. 收集所有相关图像的SIFT描述符

您现在拥有了大量的SIFT描述符。问题是,即使来自几乎相同的图像,描述符之间也会存在一些不匹配。您希望将相同的词或多或少地组合在一起,就像将某些单词视为“ dog”和“ dogs”一样一样,并且需要补偿错误。这就是群集发挥作用的地方。

  1. 以所有SIFT描述符为例,并对它们进行聚类,例如使用类似k-means的算法。这将在描述符数据中找到带有质心的预定簇数。这些质心是您的新视觉单词。
  2. 现在,根据每个图像及其原始找到的描述符,您可以查看这些描述符分配给的群集。由此,您可以知道图像中的质心或视觉单词“属于”。这些质心或视觉单词成为图像的新语义描述符,可以将其存储在反向文件中。

图像查询(例如,找到与查询图像相似的图像)将按以下方式解决:

  1. 在查询图像中找到SIFT点及其描述符
  2. 将查询描述符分配给您先前在注册阶段找到的质心。现在,您有一组与查询图像有关的质心或视觉单词
  3. 将查询视觉词与反向文件中的视觉词匹配,然后返回匹配的图像

1
我的“本地方法”链接基本上就是您的“言之成语”方法所导致的:)尽管它本质上并不是真正的语义:您永远不会代表一只狗具有一个特征,也不会那么容易识别不同的狗香料作为狗。但是感知哈希很好,不知道那一个。解释很好。是什么让我在想...您对如何将这种技术应用于非矩形区域有什么建议?或者,也许提供一些文章参考,我可以阅读一些内容,如果问题有意义,请将其作为一个单独的问题开放。
penelope

1
我几年前在文章中实际阅读过@penelope,作者在其中将图像分成任意三角形。还有跟踪转换,它也已用作感知哈希的基础。我会尽快给您回复。
莫里斯

我想问您的所有事情都超出了这个问题的范围,因此我打开了一个新书。关于基本技术的更多信息/参考在此答案或该答案中也同样非常有用。展望:)
penelope

2

似乎在上述答案中被忽略的另一种有趣的方法是深度卷积神经网络。看来Google现在正在将其用于图像搜索引擎翻译服务。CNN在诸如相似度发现之类的认知任务中非常强大.CNN似乎执行了类似的``世界之袋''程序,该程序通过其网络层嵌入。这种技术的缺点是无法学习,需要庞大的数据集进行训练,而且训练阶段的计算成本当然很高。

关于此方面的建议论文:

和开源深度学习图像检索实现(后面的文章):https : //github.com/paucarre/tiefvision

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.