使用Keras构建深度图像搜索引擎

动机

想象一下,若是有数十万到数百万张图像的数据集,却没有描述每张图像内容的元数据。咱们如何创建一个系统,可以找到这些图像的子集来更好地回答用户的搜索查询?html

咱们基本上须要的是一个搜索引擎,它可以根据图像与搜索查询的对应程度对图像结果进行排序,能够用一种天然语言表示,,也能够用其余查询图像表示。git

咱们将在本文中解决问题的方法是训练一个深度神经模型,该模型学习任何输入图像和文本的固定长度表示形式(或嵌入形式),使得若是文本-图像或图像-图像是“类似的”,则他们在欧氏空间中接近,。github

数据集:

我找不到足够大的搜索结果排名数据集,但我可以获得这个数据集: http://jmcauley.ucsd.edu/data/amazon/ 它将电子商务项目的图像连接到它们的标题和描述。咱们将使用这些元数据做为监督源来学习有意义的联合文本-图像表示。为了管理计算和存储成本,这些实验仅限于时尚(服装、鞋子和珠宝)物品和50万张图像。数据库

问题设置:

咱们的数据集将每一个图像与用天然语言编写的描述连接起来。所以,咱们定义了一个任务,在该任务中,咱们要学习图像和文本的固定长度的联合表示,以便每一个图像表示都接近其描述的表示。机器学习

模型:

该模型有3个输入:图像(即锚点)、图像标题与描述(即正例)和第三个输入是一些随机采样的文本(即负例)。函数

而后定义两个子模型:学习

  • 图像编码器:Resnet50预训练的ImageNet+GlobalMaxpooling2D
  • 文本编码器:GRU+GlobalMaxpooling1D

图像子模型产生锚点E_a的嵌入,文本子模型输出正标题和描述E_p的嵌入和负例文本E_n的嵌入。测试

而后,咱们经过优化如下损失函数进行训练:优化

L = max( d(E_a, E_p)-d(E_a, E_n)+alpha, 0)搜索引擎

其中d为欧氏距离,alpha为超参数,在本实验中为0.4。

基本上,这种损失容许作的是使d(E_a, E_p)变小,使d(E_a, E_n)变大,这样每一个图像的嵌入就接近于它的描述的嵌入,而远离随机文本的嵌入。

可视化结果:

一旦咱们学习了图像嵌入模型和文本嵌入模型,咱们就能够经过使用tsne (https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html)将它们投影到二维空间中来实现可视化。 测试图像及其对应的文本描述用绿线链接

从图中能够看出,一般在嵌入空间中,图像及其对应的描述是接近的。考虑到使用的训练损失,这是咱们指望的。

文字图片搜索:

在这里,咱们使用几个文本查询示例来在一组70,000张图像中搜索最佳匹配。咱们计算查询的文本嵌入,而后计算集合中每一个图像的嵌入。咱们最终在嵌入空间中选择最接近查询的前9张图像。

这些例子代表,嵌入模型可以学习图像的有用表示形式和简单单词组成的嵌入。

图像搜索:

在这里,咱们将使用图像做为查询,而后在包含70,000张图像的数据库中搜索与之最类似的示例。排序是由每对图像在嵌入空间内的欧氏距离决定的。

结果代表,生成的嵌入是图像的高级表示,它捕获了所表示对象的最重要特征,而不受方向、光照或局部细节的过分影响,也没有通过明确的训练。

结论: 在这个项目中,咱们研究了机器学习模块,它容许咱们构建一个基于关键字和图像的搜索引擎,应用于图像集合。其基本思想是学习一个有意义的文本和图像的联合嵌入函数,而后利用嵌入空间中项之间的距离对搜索结果进行排序。

参考文献

代码: 重现结果 => https://github.com/CVxTz/image_search_engine 磐创AI技术博客资源汇总站:http://docs.panchuang.net/ PyTorch官方中文教程站:http://pytorch.panchuang.net/ OpenCV中文官方文档: http://woshicver.com/

相关文章
相关标签/搜索