用Python和OpenCV构建属于自己的图像搜索引擎

无论你是在给你的个人图片加标签和分类,还是为你的公司网站搜索库存照片,或者仅仅是为你的下一篇史诗般的博客文章寻找合适的图片,试图使用文本和关键词来描述一些本质上是可视化的东西,都是一件非常痛苦的事情 。
为了解决这个痛苦,OpenCV为我们提供了很好的工具,之前学习的很多关于图像特征点提取的算法,现在就派上用场了 。下面我们将创建一个属于自己的图像搜索引擎 。
什么是图像搜索引擎呢?
顾名思义,就是用一张图像作为搜索关键词,这和文本类搜索类似,区别就是一个用文本,一个用图像文件 。或许你以前使用过google和其它搜索引擎,基本上现在也支持图像搜索,就是给定一张图像文件,搜索引擎就会给出和给定图像类似的图像列表供你参考 。听起来很难,如何量化一个图像的内容,使其可搜索? 我们稍后会讨论这个问题的答案 。但首先,让我们学习更多关于图像搜索引擎的知识 。一般来说,有三种类型的图像搜索引擎: 元数据搜索、实例搜索和两者的混合方法 。
元数据搜索

用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 1: 一个由元数据图像搜索引擎搜索的例子 。请注意如何将关键字和标记手动赋值到图像 。
使用元数据进行搜索与上面提到的基于关键字的标准搜索引擎略有不同 。元数据系统的搜索很少检查图像本身的内容 。相反,它们依赖于文本线索,如(1)人工注释和标签,以及(2)自动上下文提示,如网页上出现在图像附近的文本 。
当用户通过元数据系统对搜索执行搜索时,他们提供一个查询,就像在传统的文本搜索引擎中一样,然后返回具有类似标记或注释的图像 。
同样,当使用元数据系统搜索时,很少检查实际图像本身 。元数据图像搜索引擎的一个很好的例子是Flickr 。上传图片到Flickr后,会出现一个文本字段,用于输入描述上传图片内容的标签 。然后Flickr获取这些关键字,对它们进行索引,并利用它们来查找和推荐其他相关的图片 。
实例搜索
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 2: TinEye是一个"逐例搜索"图像搜索引擎的例子 。图像本身的内容用于执行搜索,而不是文本 。
另一方面,实例系统的搜索完全依赖于图像的内容——不提供关键字 。对图像进行分析、量化和存储,以便系统在搜索期间返回类似的图像 。量化图像内容的图像搜索引擎称为基于内容的图像检索(CBIR)系统 。CBIR这个词在学术文献中很常用,但在现实中,它只是"图像搜索引擎"的一种更奇特的说法,更令人辛酸的是,搜索引擎严格依赖于图像的内容,而不是与图像相关的任何文本注释 。
一个很好的例子是一个实例搜索系统如TinEye 。TinEye实际上是一个反向图像搜索引擎,您提供一个查询图像,然后TinEye返回几乎相同的匹配图像,以及原始图像出现的网页 。看一下本节中的示例图像 。这里我上传了一张谷歌logo的图片 。TinEye检查了图片的内容,在搜索了超过60亿张图片的索引后,返回给我谷歌标志出现的13000多个网页 。
所以考虑一下这个:你打算用TinEye手工标记这60亿张图片中的每一张吗?当然不是 。这将需要大量的员工,而且成本极高 。相反,您可以使用某种算法来提取"特性"(即:用于量化和抽象地表示图像的数字列表) 。然后,当用户提交查询图像时,您从查询图像中提取特性,并将它们与您的特性数据库进行比较,然后尝试找到类似的图像 。
再次强调,通过示例系统搜索严格依赖于图像的内容,这一点很重要 。这些类型的系统往往非常难以构建和扩展,但是允许一个完全自动化的算法来控制搜索——不需要人工干预 。
混合模式
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 3: 混合图像搜索引擎可以同时考虑文本和图像 。
当然,两者之间有一个中间地带——以Twitter为例 。在Twitter上,你可以上传照片来配推文 。一种混合的方法是将从图片中提取的特征与推文相关联 。使用这种方法,您可以构建一个图像搜索引擎,该引擎可以同时接受上下文提示和按示例搜索策略 。
让我们继续定义一些重要的术语,这些术语将在描述和构建图像搜索引擎时经常使用 。
一些重要的术语
在深入讨论之前,我们先花点时间来定义一些重要的术语 。当建立一个图像搜索引擎时,我们首先要索引我们的数据集 。索引数据集是通过使用图像描述符从每个图像中提取特征来量化数据集的过程 。图像描述符定义了我们用来描述图像的算法 。


推荐阅读