概述
优朋普乐图片管理器为数千万用户提供服务,管理着数百亿张图片。随着用户图库的不断扩大,优步迫切需要一个能够快速定位图片的解决方案。换句话说,当用户输入一张图片时,系统应能在图库中找到其原图和类似图片。图像搜索服务的开发为解决这一问题提供了有效的方法。
图像搜索服务经历了两次演变:
- 2019 年初开始第一次技术调研,2019 年 3 月和 4 月推出第一代系统;
- 2020 年初开始升级方案调研,2020 年 4 月开始全面升级为第二代系统。
本文将结合笔者在该项目中的亲身经历,介绍两代图像检索系统的技术选择和基本原理。
概述
什么是图像?
在处理图像之前,我们必须知道什么是图像。
答案是:图像是像素的 Collections。
例如,本图中红框内的部分实际上就是一系列像素。
1-what-is-an-image.png
假设红框中的部分是一幅图像,那么图像中每个独立的小方块就是一个像素,也就是基本的信息单位。那么,图像的大小就是 11 x 11 px。
2-what-is-an-image.png
图像的数学表示
每幅图像都可以用矩阵表示。图像中的每个像素对应矩阵中的一个元素。
二值图像
二值图像的像素要么是黑的,要么是白的,因此每个像素可以用 0 或 1 表示。 例如,4*4 的二值图像的矩阵表示法为:
0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0
RGB 图像
三原色(红、绿、蓝)可以混合产生任何颜色。对于 RGB 图像,每个像素都有三个 RGB 通道的基本信息。同样,如果每个通道使用一个 8 位数(256 级)来表示其灰度,那么像素的数学表示方法就是
([0 .. 255], [0 .. 255], [0 .. 255])
以 4 * 4 RGB 图像为例:
3-4-x-4-rgb-image.png
图像处理的本质就是处理这些像素矩阵。
图像搜索的技术问题
如果要查找原始图像,即像素完全相同的图像,那么可以直接比较它们的 MD5 值。但是,上传到互联网上的图像通常都经过压缩或添加了水印。即使是图像中的一个微小变化,也会产生不同的 MD5 结果。只要像素不一致,就不可能找到原始图像。
对于逐图搜索系统,我们希望搜索内容相似的图像。那么,我们需要解决两个基本问题:
- 将图像表示或抽象为可由计算机处理的数据格式。
- 数据必须具有可比性,以便计算。
更具体地说,我们需要以下特征:
- 图像特征提取。
- 特征计算(相似性计算)。
第一代图像搜索系统
特征提取--图像抽象
第一代逐图搜索系统使用感知哈希算法或 pHash 算法进行特征提取。这种算法的基本原理是什么?
4-first-generation-image-search.png
如上图所示,pHash 算法对图像进行一系列变换,以获得哈希值。在变换过程中,算法会不断抽象图像,从而将相似图像的结果相互推近。
特征计算--相似度计算
如何计算两幅图像的 pHash 值之间的相似度?答案是使用汉明距离。汉明距离越小,图像内容越相似。
什么是汉明距离?就是不同比特的数量。
举个例子、
Value 1: 0 1 0 1 0
Value 2: 0 0 0 1 1
上述两个值中有两个不同的比特,因此它们之间的汉明距离为 2。
现在我们知道了相似性计算的原理。接下来的问题是,如何从 1 亿张图片中计算出 1 亿比例数据的汉明距离?简而言之,如何搜索相似图片?
在项目初期,我没有找到一个令人满意的工具(或计算引擎)来快速计算汉明距离。于是我改变了计划。
我的想法是,如果两个 pHash 值的 Hamming 距离很小,那么我就可以剪切 pHash 值,相应的小部分很可能是相等的。
举个例子:
Value 1: 8 a 0 3 0 3 f 6
Value 2: 8 a 0 3 0 3 d 8
我们将上述两个值分成八段,其中六段的值完全相同。由此可以推断,它们的 Hamming 距离很近,因此这两幅图像是相似的。
经过转换后,可以发现计算 Hamming 距离的问题变成了匹配等价性的问题。如果我把每个 pHash 值分成八段,只要有五段以上的值完全相同,那么这两个 pHash 值就是相似的。
因此,解决等价匹配问题非常简单。我们可以使用传统数据库系统的经典过滤方法。
当然,我使用的是多词匹配,并在 ElasticSearch 中使用 minimum_should_match 指定匹配度(本文不介绍 ES 的原理,大家可以自学)。
为什么选择 ElasticSearch?首先,它提供了上述搜索功能。其次,图像管理器项目本身就在使用 ES 提供全文检索功能,使用现有资源非常经济。
第一代系统概述
第一代逐图搜索系统选择了 pHash + ElasticSearch 解决方案,该方案具有以下特点:
- pHash 算法简单易用,可以抵抗一定程度的压缩、水印和噪声。
- ElasticSearch 使用项目的现有资源,不会增加搜索的额外成本。
- 但这一系统的局限性显而易见:pHash 算法是整个图像的抽象表示。一旦我们破坏了图像的完整性,比如在原图上添加黑色边框,就几乎无法判断原图与其他图像之间的相似性。
为了突破这些限制,采用完全不同底层技术的第二代图像搜索系统应运而生。
本文作者 rifewang 是 Milvus 用户,也是 UPYUN 的软件工程师。如果你喜欢这篇文章,欢迎来打招呼!https://github.com/rifewang。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word