一个典型的以图搜图技术架构应该分为三大部分:特征抽取、检索引擎、搜索结果排序。不同的特征可以有不同的检索方法,比如文本特征采用文本模糊搜索的方式,图像特征采用的是近似向量搜索的方式查询。基于不同角度的查询结果,我们综合得到一个最终的检索排序,就是重排序的过程。
特征提取
。特征大致分为文本特征和图像内容特征,对应的两大搜索也是基于文本的图像搜索和基于图像内容的图像搜索。文本特征可由人工标签,但这个方法显然拓展性不高,目前应该大部分都是采用物体检测模型以及ImageCaption模型生成图像内容描述等。图像内容特征就可以有很多了,颜色矩阵信息,SIFT特征,HOG特征,深度网络的中间层和输出层的特征等等都可以用作图像的特征。我看貌似不少人都是直接采用VggNet作为特征抽取器的。图像内容特征抽取结束后我们得到的便是多个特征向量,每一个特征向量反应图像不同方面的特征。特征对检索的准确率影响很高,如果特征本身不好的话,后续的检索引擎再去优化,也意义不是很大。
检索引擎
基于文本的图像搜索可以直接用ElasticSearch做相似文本查询即可。图像内容特征搜索我们需要用一个向量搜索引擎。学术上对应的专有名词叫Approximate Nearest Neighbor Search (ANNS),即近似最近邻搜索。检索的核心便是索引的建立。目前的向量索引分为四大类:基于树的方法、哈希方法、矢量量化方法、图索引量化方法。 spotify开源的基于树的索引方式:github.com/spotify/ann… Milvus:zhuanlan.zhihu.com/p/101616055; blog.csdn.net/yaozaiyuanf… 所以到这里的话,基本上图像搜索引擎的方案可以定位ES+Milvus, 前者做基于文本的图像搜索,后者做基于图像特征向量的搜索。而且ES和Milvus都支持分布式部署,所以在扩展性上还是不错的。