🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI

概述

  • Scenarios
August 04, 2020
Rife Wang

优朋普乐图片管理器为数千万用户提供服务,管理着数百亿张图片。随着用户图库的不断扩大,优步迫切需要一个能够快速定位图片的解决方案。换句话说,当用户输入一张图片时,系统应能在图库中找到其原图和类似图片。图像搜索服务的开发为解决这一问题提供了有效的方法。

图像搜索服务经历了两次演变:

  1. 2019 年初开始第一次技术调研,2019 年 3 月和 4 月推出第一代系统;
  2. 2020 年初开始升级方案调研,2020 年 4 月开始全面升级为第二代系统。

本文将结合笔者在该项目中的亲身经历,介绍两代图像检索系统的技术选择和基本原理。

概述

什么是图像?

在处理图像之前,我们必须知道什么是图像。

答案是:图像是像素的 Collections。

例如,本图中红框内的部分实际上就是一系列像素。

1-what-is-an-image.png 1-what-is-an-image.png

假设红框中的部分是一幅图像,那么图像中每个独立的小方块就是一个像素,也就是基本的信息单位。那么,图像的大小就是 11 x 11 px。

2-what-is-an-image.png 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 3-4-x-4-rgb-image.png

图像处理的本质就是处理这些像素矩阵。

图像搜索的技术问题

如果要查找原始图像,即像素完全相同的图像,那么可以直接比较它们的 MD5 值。但是,上传到互联网上的图像通常都经过压缩或添加了水印。即使是图像中的一个微小变化,也会产生不同的 MD5 结果。只要像素不一致,就不可能找到原始图像。

对于逐图搜索系统,我们希望搜索内容相似的图像。那么,我们需要解决两个基本问题:

  • 将图像表示或抽象为可由计算机处理的数据格式。
  • 数据必须具有可比性,以便计算。

更具体地说,我们需要以下特征:

  • 图像特征提取。
  • 特征计算(相似性计算)。

第一代图像搜索系统

特征提取--图像抽象

第一代逐图搜索系统使用感知哈希算法或 pHash 算法进行特征提取。这种算法的基本原理是什么?

4-first-generation-image-search.png 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 Started

Like the article? Spread the word

扩展阅读