当作者开始接触图像搜索引擎时,作者一直有个想法,能不能将图像搜索引擎做的跟文本搜索引擎一样(例如Lucene,solr,Elasticsearch等),可不可以将文本搜索里面成熟的技术应用到图像搜索中(比如建立倒排索引,高效的倒排压缩算法,空间向量模型,关键词权重计算算法TF-IDF等)。作者也一直抱有这样一个观念:图像搜索亦是文本搜索。做文本搜索的前leader(现已去某宝)也比较赞同作者的观念,也支持去做这方面的尝试和努力。据了解到的现有的部分图像搜索引擎的实现,也证明了将大规模图像搜索引擎作为文本搜索引擎去看待,不失为一个好方法。扯这么多题外话不外乎想说明一个问题,图像搜索亦是文本搜索,用看待文本搜索的方式看待图像搜索,很多概念就会变得明朗。
熟悉文本搜索的朋友肯定对分词器不陌生,分词器的作用就是提取出一串文本中的关键词,高级点儿的分词器可能还带有新词发现功能(这个属于NLP的范畴了),关键词则是我们后续搜索过程和排序过程的主要元素之一。通过类比文本搜索,希望能够直观的介绍图像搜索引擎中的一些观念。
1. 相似图片原理
相似图片的原理有很多,其本质都是在寻求一种对图片的量化刻画方法,并在其量化后的结果上进行相似度计算。简单的方法有”感知哈希算法”(Perceptual hash algorithm),通过计算每幅图片的hash code,将其作为图片的指纹,然后计算两幅图片指纹间的距离来判定是否相似。再比如“颜色分布法”,为每幅图片生成颜色分布直方图,然后比较两张图片的直方图的相似性。还有一些简单的图片相似原理,感兴趣的朋友可以参考这里或者在Google上搜索相关的论文和期刊。
我们知道,好的图像特征对整个搜索的效果以及后期的图像搜索引擎的工程化都有着无与伦比的作用,比较常用的对图像进行量化刻画的方法是提取图片特征, 比如提取图像的SIFT特征。公司目前的线上图像搜索引擎用的是SIFT特征,在一大批博士的努力下优化了4年,才取得现在的图像搜索效果,但同时也由于现在的图像搜索引擎需要非常高的先验性知识,使得其难于调优及维护。
2. 图像特征 != 关键词
有图像处理经验的朋友们都知道,好的图像特征至少应该具有尺度不变性,也就是说不管对图片做旋转、缩放、还是亮度调节,最终提取出的特征都是一样的。举个不太恰当的例子,就好像一句话,不管怎么组合语句顺序,最终能获得同样的关键词。目前图像领域的算法是非常成熟的,OpenCV已经集成了很多高效的特征提取算法。比如经典的SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
回到正题,继续说图像特征和关键词的关系。图像特征是从图像中提取出的有用信息,关键词是从文本中提取出的有用信息,这么一看,图像搜索引擎能不能这样对待图像特征,就像文本搜索对待关键词一样?too young to simple。图像特征一般都是高维向量,比如作者现在用的是128维的特征,甚至使用过169维、196维的特征。将连续的高维向量直接作为关键词真的合适吗?跟将(-∞,+∞)作为关键词有什么两样。
3. 视觉词汇 = 关键词
视觉词汇在图像检索的期刊和论文中经常出现,作为特征的高级表现形式,视觉词汇的形式简单,是对空间中聚集的一组特征向量的抽象。空间中聚集的一组特征向量一般具有相似的属性,类比下关键词的话,就好像同一个关键词的同义词及变种词语一样。视觉词汇就像经过了字符过滤、同义词转换、词根转换后的关键词一样。
4. 倒排索引
其实很多相似原理应用到大规模的场景下的话,是不太好用的。举个例子,如果采用”感知哈希算法”,计算出每幅图片的指纹,搜索的时候再依次计算待搜索图片的指纹与所有指纹的的相似度,在十几万张图片的规模下,遍历所有图片计算相似度或许是挺快的,但在亿万量级的规模下,计算任务是非常繁重的,搜索一张图片耗时十几分钟也不是不可能。大规模量级下的图像搜索引擎,已经不单单是如何提取图像特征,如何提取出好的图像特征让其更有表现力的算法问题了,这个时候更多的是需要工程上的一些技巧去优化搜索响应时间。当前需要解决的首要问题是如何快速初步筛选出数量少却是潜在的相似图片的问题了。
假设我们有了离散的特征表示 - 视觉词汇,那么接下来要解决的问题就是如何高效的存储视觉词汇、如何高效的检索视觉词汇。这里不妨借鉴下文本搜索,通过对视觉词汇建索引,实现高效的检索过程。这个过程其实和文本搜索没有什么大的区别,只是将关键词换成了我们的视觉词汇。比较欣赏Lucene对正向信息和反向信息的处理,包含了很多值得借鉴的思想和算法实现。其实将solr、Elasticsearch直接作为图像搜索引擎也未尝不可,我们需要注意的地方是对排序算法的修改。
5. 排序算法
不管是文本搜索还是图像搜索,其最终呈献给用户的搜索结果跟排序算法有直接的关系。只不过文本搜索方面已经有成熟且集成进项目中的的相似性算法,例如Lucene、solr、Elasticsearch的默认排序算法 - 空间向量模型,它们也提供了定制化结果排序的接口,可以很方便的根据自己的需求进行结果排序。对于图像搜索引擎而言,排序算法则需要自己去实验和对比。提取特征方法的不同会直接导致排序算法的不同,采用图像指纹(hash code)作为图像特征的话,排序算法也即常用的相似度计算,例如计算汉明距离(Hamming distance)等。
目前作者的demo中采用的是空间向量模型进行结果排序,这也跟的理念有关,当然这可能并不是最好的排序算法,以后抽时间实验下不同排序算法对图像搜索结果的影响。