动机
想象一下,若是有数十万到数百万张图像的数据集,却没有描述每张图像内容的元数据。咱们如何创建一个系统,可以找到这些图像的子集来更好地回答用户的搜索查询?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张图像的数据库中搜索与之最类似的示例。排序是由每对图像在嵌入空间内的欧氏距离决定的。
结果代表,生成的嵌入是图像的高级表示,它捕获了所表示对象的最重要特征,而不受方向、光照或局部细节的过分影响,也没有通过明确的训练。
结论: 在这个项目中,咱们研究了机器学习模块,它容许咱们构建一个基于关键字和图像的搜索引擎,应用于图像集合。其基本思想是学习一个有意义的文本和图像的联合嵌入函数,而后利用嵌入空间中项之间的距离对搜索结果进行排序。
参考文献:
- 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%20NN%20Test%20on%20MNIST.ipynb
代码: 重现结果 => https://github.com/CVxTz/image_search_engine 磐创AI技术博客资源汇总站:http://docs.panchuang.net/ PyTorch官方中文教程站:http://pytorch.panchuang.net/ OpenCV中文官方文档: http://woshicver.com/