基于语义向量的图像搜索
easterling

最近前一段时间学习了一些关于gpt原理的知识,虽然没有完全理解核心概念,但是对于把语义转换成潜空间向量的想法记忆深刻,之后我在偶然间看到了这样一篇令人”印象深刻“的blog:i-accidentally-built-a-meme-search-engine,,其中提到了一种使用矢量编码图像搭建的图片搜索引擎,并称其为”出乎意料的简单“。这个项目看上去非常有意思,我原本计划做一个类似的东西来完成即将开始的比赛,不过一段时间后选题被定为另一个更为实际的选题,而我又不愿意放弃这个有趣的点子,决心继续把它完成。

我于是开始尝试围绕这篇blog进行学习, 我设想的搭建过程分为以下几个步骤,

  • 第一步,找一个开源项目运行起来

  • 第二步,然后阅读源代码来学习如何搭建,

  • 第三步,搭建自己的图片搜索引擎

这个计划在第一步就遇到巨大困难,blog的对应项目使用到imac的芯片,我没法使用,之后在github上找到的一系列项目各有千秋,但是共同的特点是没法在我的pc上运行,其中的制约因素包括但不限于需要搭建python环境、需要从huggingface下载模型,数据库连接不上去等等,手头的四个项目卡在不同阶段,当一个卡住,我就重新搭建环境尝试另一个,如此往复,进度最佳的一个已经在公司电脑上成功读取文件夹并将图片向量传到数据库,但此项目在本机上无法从huggingface下载任何模型,大概在这样的泥潭中折腾了一个月之后的月一个晚上,我终于意识到,整个计划从第一步开始就不是必要的。

整个引擎只有两个步骤,读取图片上传到数据库、在数据库中查询,我只要完成这两步就好了

向量数据库有很多家,但我直接选了最早接触到的pinecone

我打开gpt,向其询问把图片转换成向量的方式,测试运行,通过。

之后,我登录pinecone的官网,按照教程新建了index,并获取了官方提供的存储及搜索的代码,完成了将向量上传和搜索的环节

最后添加了一个用于获取单张图向量的函数

这样经过非常简单的步骤之后,搜索引擎的核心功能就完成了,花费了一个多小时,只有几十行代码。我可以将本地的图片对应的上传到数据库,然后,拿一张图片进行搜索,获取相似度最高的前n张图片名称,根据这些名称找到本地的对应图片。这个操作在你本地有大量各个类型图片的情况下会非常有趣,假如你只有少量图片。那就没什么意思,很可能没太多有关联的内容。

不难看出这个玩具的核心在于clip模型,它决定了图片到向量的对应关系,这个模型的效果越好,对图片做语义识别的能力就越强,体现出的图片的搜索效果就越智能。

项目地址

 Comments
Comment plugin failed to load
Loading comment plugin