最近断断续续学习了一些关于PQ系列的算法,包括PQ、OPQ、LOPQ、IVFOPQ等,打算对PQ系列做个总结。
下面介绍一下PQ算法,可能有些理解不到位的地方,欢迎各位看官指正~
1、简介
图像检索大体分成三块:特征提取、存储和检索。首先需要提取图像的特征信息,直白的说就是用一个特征向量来表达原始图像;然后将量化后的样本存储到数据库中;检索就是将待查询的向量从样本库中寻找相似向量。本文主要关注检索,对特征提取和存储目前还没有做深入的研究,后面有时间可以再看看。
检索本质上是一个向量匹配的过程,可以通过比较向量的欧氏距离(L2)或曼哈顿距离(L1)等来比较它们之间的相似度。以欧式距离为例,比较的过程就是对于一个输入的查询向量,遍历数据库中的样本,计算查询向量和每个样本的欧式距离,返回最接近的k个样本。这种朴素的检索算法也可以称之为暴力搜索,虽然是精确匹配,但存在三个弊端:
1)实际应用中样本向量巨大,可能是百亿或千亿级别,存储开销很大;
2)逐个遍历时间在O(n)量级,遍历时间耗费很大;
3)计算向量之间的欧式距离开销很大。
为了解决这些问题,PQ(product quantization)算法应用而生。PQ算法属于一种经典的ANN(approximate nearest neighbor,近似最近邻算法)算法,ANN不是寻找最近邻向量,而是退而求其次寻找近似最近邻向量。所以必然会带来一些误差,为了尽量减少误差,很多算法都做了一系列的优化,同样PQ系列也是。
2、算法流程
PQ系列的算法大致的套路分三个阶段:训练、量化、查询,所以这个系列都会分这个三个阶段来进行总结。
2.1 训练
假设样本向量维度D=64,将原始的D维向量分成M=8段,那么每段的子维度subD=8。
对训练集每段分别进行k-means聚类,假设每段聚类的k=256,那么M段分别聚类之后会得到M*k个类中心(也叫码本),每个类中心的维数为subD,如下图所示
图1 分段及聚类过程
2.2 量化
对于待添加到数据库中的样本向量,需要先将D维的原始向量进行量化,然后再进行添加。量化的过程如下:
1)首先将样本分成M段
2)对于每个子段m,去256个类中心中寻找距离最近的类中心U(m)
3)原始向量则量化成笛卡尔乘积
图2 量化过程
2.3 查询
对于查询向量,需要计算查询向量与样本库中向量的欧氏距离。通常计算距离的方法有两种:SDC(Symmetric case)和ADC(Asymmetric case)。
图3 SDC和ADC
SDC是将查询向量进行量化,然后计算量化子和数据库中量化子的距离;ADC是直接计算查询向量和数据库中量化子的距离。SDC做了量化,SDC表可以事先计算存储起来,减少计算过程,但是放大了误差;而ADC需要每次对查询向量计算ADC表,增加了一些计算开销,但是误差小些,通常采用ADC的计算方式。
采用ADC距离的查询过程如下:
1)首先计算查询向量和类中心的距离,得到距离表
2)遍历样本库中的向量,根据距离表,计算每个样本与查询向量的距离和
3)返回k个距离最接近的样本
图4 查询过程
3、总结
以上就是PQ算法的基本思想,相对于暴力检索来说,PQ算法节约了存储空间,减少了运算量。
图像检索之乘积量化(Product Quantizer)
最新推荐文章于 2022-11-01 00:22:50 发布