使用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)
目前深度图像的获取方法有激光雷达深度成像法,计算机立体视觉成像,坐标测量机法,莫尔条纹法,结构光法等等,针对深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基 ...
随机推荐
- 作为前端,你需要懂得javascript实现继承的方法
在ES6之前,javascript不跟其他语言一样,有直接继承的方法,它需要借助于构造函数+原型对象模拟实现继承.现在我们可以利用ES6的extends方法实现继承,如果想了解更多有关ES6实现的继承 ...
- dubbo与trivial超时机制的深入思考
说在前面 trivial是根据之前设计的RPC框架而来的(还在增进当中),其中较为不同的一个点为,在客户端去掉了业务线程池,因为既然都要等待,不必要再加一层. 进入正题 有在网上看到这样的信息,“之前 ...
- iptables 开放80端口以及删除80端口的规则
[root@zabbix-server html]# iptables --version iptables v1.4.21 [root@zabbix-server html]# iptables - ...
- 攻防世界Mobile5 EasyJNI 安卓逆向CTF
EasyJNI 最近正好在出写JNI,正好看到了一道JNI相关的较为简单明了的CTF,就一时兴起的写了,不得不说逆向工程和正向开发确实是可以互补互相加深的 JNI JNI(Java Native In ...
- 在Shadow DOM使用原生模板
原生模板的优势 延迟了资源加载 延迟了加载和处理模板所引用的资源的时机,这样,用户就能够在模板中使用任意多的资源,却不阻碍页面的渲染. 延迟了渲染内容 无论模板在什么位置,浏览器不会把模板中的内容直接 ...
- EventEmitter:从命令式 JavaScript class 到声明函数式的华丽转身
新书终于截稿,今天稍有空闲,为大家奉献一篇关于 JavaScript 语言风格的文章,主角是函数声明式. 灵活的 JavaScript 及其 multiparadigm 相信"函数式&quo ...
- Java基础--Java基本数据类型
一.基本数据类型(primitive type) (1)数值型 1.数值型包括整数类型(byte,short,int,long) a.byte :1字节=8bit位 (-128~127) 包装类: ...
- nor flash之4字节地址模式
背景 容量低于 16M bytes 的 nor,一般使用 3 字节地址模式,即命令格式是 cmd + addr[2] + addr[1] + addr[0] + ... 使用超过 16M bytes ...
- 峰哥说技术:10-Spring Boot静态资源处理
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 10 峰哥说技术:Spring Boot静态资源处理 今天我们聊聊关于 Spring Boot 中关于静 ...
- tfgan折腾笔记(三):核心函数详述——gan_loss族
gan_loss族的函数有: 1.gan_loss: 函数原型: def gan_loss( # GANModel. model, # Loss functions. generator_loss_f ...