![9e456032538fd06c282adbaf86ac7d8e.png](https://i-blog.csdnimg.cn/blog_migrate/ba0d824abea22c0e9095ca5532cdac1a.jpeg)
介绍
前一段时间项目中需要用到以图搜图,当时为了快速上线功能,直接使用了百度的以图搜图服务。讲道理,百度的这个技术做的还是很不错的,使用体验很不错。后来就想多了解了解这里,也许日后会有需要自己搭建一套以图搜图的产品。首先需要声明的是,我没有多少图像搜索的研究经验,只是作为一个系统搭建者的角度去了解的这个领域,找到一些帮助系统搭建的组件和算法。如果文章中有什么纰漏的话,还请谅解。这篇小文章留在这里权当做个学习记录总结。
以图搜图现在是大家很常见的功能了,淘宝的拍立淘、微信的拍照识物、以及各种人脸识别身份认证等等。
![faf9ad30935b91954b5bd33f4227db7a.png](https://i-blog.csdnimg.cn/blog_migrate/1a678a87fe7a04eb313d8f7e15cc928f.jpeg)
电商公司(拍照识物)、媒体公司(新闻搜索)、短视频公司(视频搜索与推荐)等对以图搜图的技术需求是巨大的,这里最核心的两个问题便是搜的准,搜的快。一个典型的以图搜图技术架构应该分为三大部分:特征抽取、检索引擎、搜索结果排序。下图来自这篇文章,展示以图搜图基本技术架构,但是应该少了重排序部分。之所以需要重排序,是因为往往图片特征都是不同方面的,大体上有文本特征(如图片里有人脸,猫,狗等)以及图像特征(SIFT,LSH,CNN低/中/高层特征),不同的特征可以有不同的检索方法,比如文本特征采用文本模糊搜索的方式,图像特征采用的是近似向量搜索的方式查询。基于不同角度的查询结果,我们综合得到一个最终的检索排序,就是重排序的过程。
![aa57dd472ae00e57b8d59948e11995de.png](https://i-blog.csdnimg.cn/blog_migrate/80e715431d72b0e1f951151d5edf0144.jpeg)
特征提取
特征提取是纯学术问题了,提取什么样的特征关键看应用需要。特征大致分为文本特征和图像内容特征,对应的两大搜索也是基于文本的图像搜索和基于图像内容的图像搜索。文本特征可由人工标签,但这个方法显然拓展性不高,目前应该大部分都是采用物体检测模型以及ImageCaption模型生成图像内容描述等。图像内容特征就可以有很多了,颜色矩阵信息,SIFT特征,HOG特征,深度网络的中间层和输出层的特征等等都可以用作图像的特征。我看貌似不少人都是直接采用VggNet作为特征抽取器的。图像内容特征抽取结束后我们得到的便是多个特征向量,每一个特征向量反应图像不同方面的特征。特征对检索的准确率影响很高,如果特征本身不好的话,后续的检索引擎再去优化,也意义不是很大。
![2f65e3f951024d8b4464626752a8f65c.png](https://i-blog.csdnimg.cn/blog_migrate/88a66ac7bc881068c26effed129ff7ab.jpeg)
检索引擎
作为搭建产品的话,我觉得基于文本的图像搜索可以直接用ElasticSearch做相似文本查询即可。图像内容特征搜索我们需要用一个向量搜索引擎。学术上对应的专有名词叫Approximate Nearest Neighbor Search (ANNS),即近似最近邻搜索。检索的核心便是索引的建立,引用这篇文章的向量索引描述:
向量索引是指通过某种数学量化模型,对向量构建一种时间和空间都比较高效的数据索引结构,使得我们能够实时地获取跟查询向量尽可能最相近的K个向量。从定义可以看到,要设计一种高效的向量索引模型,应该满足3个基本条件,即:
1. 实时查询,支持海量(百亿、千亿级别)规模库量级的实时查询;
2. 存储高效,要求构建的向量索引模型数据压缩比高,达到大幅缩减内存使占用的目的;
3. 召回精度好,top@K有比较好的召回率,跟暴力搜索(brute-force search)的结果相比;
检索最简单的实现方案便是线性扫描数据库,也就是在全空间进行搜索,为了加快查找的速度,几乎所有的ANNS方法都是通过对全空间分割,将其分割成很多小的子空间,在搜索的时候,通过某种方式,快速锁定在某一(几)子空间,然后在该(几个)子空间里做遍历。可以看到,正是因为缩减了遍历的空间大小范围,从而使得ANNS能够处理大规模数据的索引。目前的向量索引分为四大类:基于树的方法、哈希方法、矢量量化方法、图索引量化方法,不同的索引方式也都有背后各自的产品和开源项目。比如由spotify开源的基于树的索引方式的向量搜索引擎Annoy。
https://github.com/spotify/annoygithub.com国内也有一个看起来不错的开源向量搜索引擎产品:Milvus, 这家公司和PingCap比较像,都是把自己的产品开源出来扩大影响力。而且看他们的用户公司是有一些大牌的公司的,所以质量上应该是可以保证的。最后我觉得很核心的一点在于Milvus的社区管理还是不错的,有专门的微信技术支持群,有问题可以直接群里面问,技术人员很快就会解答。这点对于使用开源产品还是比较重要的。
Milvus 简介www.milvus.io![a098cd73b60d9956027d940a4d7861b9.png](https://i-blog.csdnimg.cn/blog_migrate/aabffed4905b53b7780ce783f0f943e7.png)
![8e59a329469ad887970348900b9caca0.png](https://i-blog.csdnimg.cn/blog_migrate/1bedc53b03b9ac173ae5880e3da38155.jpeg)
所以到这里的话,基本上图像搜索引擎的方案可以定位ES+Milvus, 前者做基于文本的图像搜索,后者做基于图像特征向量的搜索。而且ES和Milvus都支持分布式部署,所以在扩展性上还是不错的。
重排序
用不同的特征会搜出来不同的集合,如何基于这些集合进行一次重新排序取决于应用的需要。我也没做过,所以就不班门弄斧了。
总结
这是一篇很小的文章,主要就是做了以图搜图的技术方案的一些调研,做了一个小总结。希望对大家有用~