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


    动机

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

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

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

    数据集:

    我找不到足够大的搜索结果排名数据集,但我能够得到这个数据集:
    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张图像的数据库中搜索与之最相似的示例。排序是由每对图像在嵌入空间内的欧氏距离决定的。

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

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

    参考文献

    • Large Scale Online Learning of Image Similarity Through Ranking
    • Ups and downs: Modeling the visual evolution of fashion trends with one-class collaborative filtering
    • https://github.com/KinWaiCheuk/Triplet-net-keras/blob/master/Triplet NN Test on MNIST.ipynb

    代码
    重现结果 => https://github.com/CVxTz/image_search_engine

    欢迎关注磐创博客资源汇总站:
    http://docs.panchuang.net/

    欢迎关注PyTorch官方中文教程站:
    http://pytorch.panchuang.net/

    OpenCV中文官方文档:
    http://woshicver.com/

  • 相关阅读:
    [LeetCode] Remove Duplicates from Sorted List
    [LeetCode] Partition List
    oracle字符串载取及判断是否包含指定字符串
    oracle 添加序号
    Oracle的decode、sign、trunc函数
    Oracle行列转换
    java计算今天是今年的第几天
    Oracle 增加 修改 删除 列
    java 获取本机ip
    float类型数保留一位小数
  • 原文地址:https://www.cnblogs.com/panchuangai/p/12567918.html
Copyright © 2020-2023  润新知