神经网络-查找最相似的图像


11

我正在使用Python,scikit-learn和keras。我有3000万个正面手表图像,如下所示: Watch_1Watch_2Watch_3

我想编写一个程序,以接收实际手表的照片作为输入,该照片可能比上面的照片(背景色不同,光线更暗等)在不太理想的条件下拍摄,并且在3000种手表中找到最相似的手表。类似地,我的意思是,如果我输入一张带有薄花边的棕色圆形手表的照片作为输入,那么我期望将其制成为圆形,深色和薄花边的棕色手表的输出。

什么是最有效的机器学习算法?

例如,通过点击此链接,我想到了两种不同的解决方案:

1)使用CNN作为特征提取器,并参考输入图像比较每对图像的这些特征之间的距离。

2)在暹罗神经网络中使用两个CNN来比较图像。

这两个选项是此任务的最佳选择,还是您会提出其他建议?

您是否知道用于此任务的任何预训练神经网络(具有预定的超参数)?

我在StackOverflow上找到了一些有趣的帖子,但是它们已经很老了:Post_1Post_2Post_3


欢迎光临本站!学习嵌入(我建议使用二进制哈希值以快速检索上千位),然后执行相似性搜索。
Emre

很高兴来到这里...哈哈!...是的,这是个好主意,我已经读过这篇论文了……
播客

Answers:


4

我认为这样的高层体系结构不是最合适的,而是取决于许多因素和细节。据我所知,第一种方法很有希望,尤其是在扩展了TiefVision中的其他步骤的情况下

  1. 额外的边界框网络用于将图像的相关部分与其余部分区分开
  2. 不直接简单地比较特征向量,而是使用三元组来训练比较网络(基于特征向量和更多或更少相似实例的示例来学习相似性)。

这项工作比您发布的内容要新得多(2016/17年),并带有一个不错的工具集和更详细的论文

为什么使用三胞胎又名深度排名?

如评论中所述:为什么人们应该使用三胞胎来实现图像相似性,而不是学习特征向量并计算其距离?三元组是将相似性问题公式化为学习问题的一种方式,而不是学习基本上不关心相似性的特征向量。在人类感知的相似性很重要(可能与机器感知不同)的情况下,这种方法特别有意义。

三元组的工作方式如下:您提供3张图片。一个要比较的图像,一个相似(接近)的图像和一个不太相似(遥远)的图像。这是您的训练/测试/验证数据。在这些样本上训练网络并预测正确的顺序(从非相似图像分类相似图像),使网络可以学习如何基于相似度对图像进行排序。

总而言之,这种方法比较复杂。它可能经过了过度设计,但是您还要求执行此操作的最佳方法,因此Deep Rank实现了非常高的精度值。


谢谢您的答复。这是一个有趣的(我赞成)。关于三元组的想法很好,即使我不确定为什么为什么使用三张图片一定比使用成对的图片更好。如果您愿意,可以在您的文章中进一步解释。我还将看一下TiefVision。
弃儿

@Universalis感谢您的提示(和赞誉)。我用有关三胞胎和推理的更多详细信息更新了我的答案。这篇论文写得也很好,所以请看一下所有细节。不过,自从TiefVision和DeepRanking出现以来,可能会有新的幻想方法。
Gegenwind

再次感谢您的回复。是的,我看了看这篇论文,很清楚您在答案中添加了什么。从这个意义上讲,我已经理解了您添加的答案,而我的问题更清楚地是以下几点:为什么不使用2张图像(一对)而不是3张图像(三重图像)来根据图像的相似性进行排名?使用三胞胎而不是双胞胎的额外好处是什么?
弃儿

嗯,也许我误解了你的做法。三元组提供比较信息,即图像1比图像2更接近图像2。仅具有2张图像并声明“这2个相似”缺少比较因素“在什么方面相似”,因为在这种方法中,您假定纯距离向量的特征还不足以告诉您。换句话说:您通过订单学习相似性,而没有至少2个要订购的商品,您就缺乏相似性。
Gegenwind

再次感谢您的回复。但是,即使是现在,并且在更仔细地阅读了本文之后,我仍然不清楚为什么对于这种无监督的方法,为什么一定需要三联体而不是成对的图像。使用标签时,很明显,通过使用三胞胎,您将获得无法成对获得的图像的完全相似性等级。但是,您建议使用这种(某种)无监督方法,然后为什么不比较每对图像的损耗函数的值(总是该对图像中的一个作为输入图像)以找到例如与图像最相似的5个图像。输入图像?
弃儿

2

我会选择一个分类器,例如VGG-16,它在imagenet类上效果很好。然后,通过它运行手表图像。可以肯定的是,您可以期望输出大部分是“监视”,而且可能性很高。

但是,您将获得其他功能:所有其他类别的激活级别。这为您提供了0到1之间的一千个值的向量。

您也可以在网络的各个位置提取激活。然后,只有在图像相似的情况下,两种情况下那些激活和输出的相似性才应该相似。


感谢您的回复(支持)。是的,我脑子里有这个想法,从某种意义上说,这与我在帖子中提供的第一个选项有关。所以我也在考虑使用其他探测器,例如SURF ...我会看看它们是否足够成功...
弃儿

2

我将首先关注数据增强。由于您的图像具有白色背景,因此您会更轻松一些。将白色背景变成透明背景,按比例缩小图像,旋转它,然后将其放在类似于目标数据的背景中。

使用不同的组合多次进行此操作,并为每只手表贴上标签。然后,我建议您使用常规的卷积神经网络进行分类。每个标签都会有一个得分,请选择得分最高的得分,并且应该最相似

例如,假设您使用图像运行分类器并获得以下结果:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

CNN表示,它有51%的信心表示Watch1是输入图像中的手表。但也确实是,它认为它看起来更相似,而Watch2将是下一个更相似,依此类推。

如果效果不佳,请照常进行。试验参数和/或添加更多层。尝试找出失败的地方。了解了这些知识之后,您可以使用它来为您的特定问题选择一种更特殊的卷积网络类型。在没有先验知识的情况下寻找它是不正确的方法。我建议您从基本的卷积模型开始,然后从那里开始工作。


1
感谢您的回复(支持)。是的,我已经有了数据扩充的想法。但是,您的答复还不清楚。“为每只手表贴上标签”是什么意思?您是要分别标记每只手表,还是根据它们是否相似将它们标记为一对?(如果是前者,请解释为什么这样做有效)
弃儿

这是以前的建议,我以为您已经可以方便地标记所有标签。这基本上是最基本的解决方案,因此效率不高。我的建议是,基本模型也许可以为您提供足够的信息,以便您追求更专业的模型。像@Gegenwind所说,看起来很深的排名似乎很有希望。我已经更新了答案,以使其更加清晰。
zimio

嗯,是的,现在您的意思更清楚了。...这当然是一个很好的一般建议:从基础开始,逐步进行更复杂的操作...无论如何都感谢...
放逐
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.