使用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/
使用Keras构建深度图像搜索引擎的更多相关文章
- 在R中使用Keras和TensorFlow构建深度学习模型
一.以TensorFlow为后端的Keras框架安装 #首先在ubuntu16.04中运行以下代码 sudo apt-get install libcurl4-openssl-dev libssl-d ...
- PyTorch如何构建深度学习模型?
简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...
- 一位ML工程师构建深度神经网络的实用技巧
一位ML工程师构建深度神经网络的实用技巧 https://mp.weixin.qq.com/s/2gKYtona0Z6szsjaj8c9Vg 作者| Matt H/Daniel R 译者| 婉清 编辑 ...
- 基于 Keras 用深度学习预测时间序列
目录 基于 Keras 用深度学习预测时间序列 问题描述 多层感知机回归 多层感知机回归结合"窗口法" 改进方向 扩展阅读 本文主要参考了 Jason Brownlee 的博文 T ...
- Apple的Core ML3简介——为iPhone构建深度学习模型(附代码)
概述 Apple的Core ML 3是一个为开发人员和程序员设计的工具,帮助程序员进入人工智能生态 你可以使用Core ML 3为iPhone构建机器学习和深度学习模型 在本文中,我们将为iPhone ...
- 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10
简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...
- Keras 构建DNN 对用户名检测判断是否为非法用户名(从数据预处理到模型在线预测)
一. 数据集的准备与预处理 1 . 收集dataset (大量用户名--包含正常用户名与非法用户名) 包含两个txt文件 legal_name.txt ilegal_name.txt. 如下图所 ...
- 深度图像配准(Registration)原理
机器视觉中,3D相机产生的深度图像(depth image)通常需要配准(registration),以生成配准深度图像(registed depth image).实际上配准的目的就是想让深度图和彩 ...
- PCL深度图像(1)
目前深度图像的获取方法有激光雷达深度成像法,计算机立体视觉成像,坐标测量机法,莫尔条纹法,结构光法等等,针对深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基 ...
随机推荐
- HTML5全屏背景视频与 CSS 和 JS(插件或库)
译文原链接:http://codetheory.in/html5-fullscreen-background-video/ 前言: 当网页载入时,自动播放的全屏背景视频已经成为当前颇受欢迎的趋势. 就 ...
- C++与引用2
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 浅谈ConcurrentDictionary与Dictionary
在.NET4.0之前,如果我们需要在多线程环境下使用Dictionary类,除了自己实现线程同步来保证线程安全外,我们没有其他选择.很多开发人员肯定都实现过类似的线程安全方案,可能是通过创建全新的线程 ...
- 线程状态,BLOCKED和WAITING有什么区别
线程可以通过notify,join,LockSupport.park方式进入wating状态,进入wating状态的线程等待唤醒(notify或notifyAll)才有机会获取cpu的时间片段来继续执 ...
- SpringBoot入门系列(二)如何返回统一的数据格式
前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/ ...
- css 进度条的文字根据进度渐变
需求 1.进度条里面的文字需要根据进度的长度而变化 原理 用两个一模一样的样式的 div 重叠起来 效果 字体开始为 蓝色,跟随进度条变为 白色 在线预览: https://jsfiddle.net/ ...
- 提高开发效率之VS Code基础配置篇
背景 之前一直是只用WebStorm作为IDE来编写代码,但是由于: 手中的这台Mac接了两个显示器以后,使用WebStorm会有卡顿. WebStorm需要付费(虽然可以通过某方法和谐). 所以需要 ...
- Python——工厂模式
目录 前言 一.简单工厂 二.工厂方法 抽象工厂 结论 参考 前言 工厂模式,顾名思义就是我们可以通过一个指定的"工厂"获得需要的"产品". 在设计模式中主要用 ...
- DirectX11--深入理解Effects11、使用着色器反射机制(Shader Reflection)实现一个复杂Effects框架
前言 如果之前你是跟随本教程系列学习的话,应该能够初步了解Effects11(现FX11)的实现机制,并且可以编写一个简易的特效管理框架,但是随着特效种类的增多,要管理的着色器.资源等也随之变多.如果 ...
- LSP原则—关于正方形不是长方形
长方形有二个属性长和宽.并有一个设置长的方法和设置宽的方法,还有一个求面积的方法. 像下面 private int length; private int width; public void set ...