实现以图搜图 | 青训营笔记

734 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记

介绍

以图搜图,顾名思义,就是上传一张图片,搜索和这张图片相似的其他图片。如下图所示,主流的搜索引擎都能做到这个功能,那么这个功能是怎么做到的?如何实现一个以图搜图的搜索引擎?

image.png

思路

经过一番网上调研,总结出两种比较可行的方法。一种是基于图像特征的相似度进行搜索,另一种是基于图像的文本描述进行搜索。

图像特征搜索

基于图像特征的相似度进行搜索,就是对每幅图像计算其特征,然后对给定的输入图像,计算特征之后与数据库中的图像特征搜索匹配,返回符合要求的搜索结果。这种方法的特点是可以搜索到符合指定的计算特征规则的图像,但是需要对数据库中的每一张图像计算其特征并存储,相当于额外存储了一个维度的信息,占用空间开销较大。

文字描述搜索

基于图像的文本描述进行搜索,就是对输入的图像,通过Image Caption算法,获得一串描述它的文字,将文字描述作为真正的输入搜索相关的图像。这种方法的特点是只需要对输入的图像进行处理,后续的搜索步骤和纯文本搜索完全一致。文章后续实现的以图搜图也是基于文字描述的方法。

实现

在调研了相关的算法之后,决定参考《Show and Tell: A Neural Image Caption Generator》这篇论文的方法实现。网上关于图像描述算法的公开数据集有不少,但是大多数据集的文字描述的标注是用英文做的,这里数据集选用AI challenger 2017 图像描述数据集,其包含了三万张图片,每一张图片有其对应的中文描述。

算法使用ResNet提取图片的特征向量,利用全连接层转化为256维的特征向量,将文字描述的每个词也转化成256维的向量,然后将图片提取的向量和文字的向量拼接在一起,输入LSTM中,计算每个词的输出,利用每个词的输出预测下一个词的输出,最后将词拼接,得到文字描述的结果。

文字描述的算法是使用pytorch实现的,因此其代码放在python文件里,在搜索引擎中调用时,先用go调用文字描述算法的python脚本,将图片url传入其中,得到相应的文字描述输出,然后将文字描述输出作为真正的输入传到搜索引擎,调用文字搜图的接口,查询搜索结果。go调用py脚本,传入图片url并获得文字描述输出的图片如下所示:

ad4b268abec300da8359695869caacf.jpg