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

评论

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

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

神经网络:research.googleblog.com/2015/06/…

#1 楼

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

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

存在两种基本方法: >使用低级(局部)特征进行检索:图像特定部分的颜色,纹理,形状(图像是局部特征描述符的集合)

图像的语义方法,在某些情况下表示为对象及其关系的集合的方法


对底层方法的研究非常深入。当前最好的方法是提取局部特征(这里涉及到特征提取算法的选择),并使用其局部描述符(再次选择描述符)来比较图像。

在较新的作品中,局部描述符首先将其聚类,然后将聚类视为视觉单词-然后,该技术与Google文档搜索非常相似,但使用视觉单词而不是字母单词。

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

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

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

功能提取/描述:1,2,3,4



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

由于我目前正在研究这些方法,因此无法得出任何结论。现在,就是这样,我在这个答案中解释了这些技术背后的一般概念。

再一次,不久:一般概念是用树形结构表示图像,其中叶子包含图像可以在更靠近此类树根的节点中找到细节和对象。然后,以某种方式比较子树以识别包含在不同图像中的对象。

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


二进制分区树并提到min /最大树数:P. Salembier,MHF Wilkinson:连通算子

二进制分区树:V. Vilaplana,F。Marques,P。Selembier:用于对象检测的二进制分区树

形状树(组件树):P. Monasse,F。Guichard:对比度不变图像表示的快速计算,C。Ballester,V。Castellis,P。Monasse:图像的形状树

单调树:Y. Song,A. Zhang:通过单调树分析风景图像


编辑:进一步挖掘表明,形状树和单调树是等效的,除了处理图像在4- / 8-(形状树)或6-连通性(单调)中
极端分水岭树:A. Vichik,R。Keshet和D. Malah:树半格及其应用的自对偶形态

约束连接,阿尔法树,超尺度水域:P。Soille,L。Najman:关于图像处理和空间数据聚类的形态层次表示法



#2 楼

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

感知散列

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

以最基本的形式,您可以按以下方式实现此功能:


将图像转换为灰度
使图像为零均值
将您的图片压缩为缩略图尺寸,例如[32x32]
运行二维离散余弦变换
将左上角[8 x 8]保留,将最重要的低频分量
二分块,基于分量的符号

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

感知散列例如由phash实现。图片,例如所有带有狗的图像。它通过使用某些图像补丁来实现此目的,其精神与人们根据某些单词的出现来对文本文档进行分类一样。可以对单词进行分类,例如说“ dog”和“ dogs”,并将它们作为标识符存储在反向文件中,其中“ dog”类别现在指向包含“ dog”或“ dogs”的所有文档。 />以最简单的形式,可以使用以下图像进行操作:


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

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


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

图像查询(例如,找到与查询图像相似的图像)的解析如下:


在查询图像
将查询描述符分配给您先前在注册阶段发现的质心。现在,您有一组与查询图像有关的形心或视觉词
将查询视觉词与倒排文件中的视觉词匹配,并返回匹配的图像


评论


$ \ begingroup $
我的“本地方法”链接基本上就是您所说的“言语”方法:)尽管从本质上说,这并不是真正的语义:您永远不会代表一只狗具有一个特征,也不会容易识别出不同的狗香精作为狗。但是感知哈希很好,不知道那一个。解释很好。是什么让我在想...您对如何将这种技术应用于非矩形区域有什么建议?或提供一些文章参考,我可以阅读一些内容,如果问题有意义,请将其作为单独的问题开放。
$ \ endgroup $
–佩内洛普
2012年11月15日在21:12



$ \ begingroup $
@penelope我几年前在文章中实际阅读过,作者在其中将图像分成任意三角形。还有跟踪转换,它也已用作感知哈希的基础。我会尽快给您回复。
$ \ endgroup $
– Maurits
2012年11月15日22:35

$ \ begingroup $
我想问您的所有问题都超出了这个问题的范围,所以我打开了一个新的问题。关于基本技术的更多信息/参考在此答案或该答案中仍然很有效。 。期待 :)
$ \ endgroup $
–佩内洛普
2012年11月15日23:16

#3 楼

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

关于这方面的建议论文:


用于语义相似性的深度学习
使用深度排名学习细粒度图像相似性

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