图像检索之乘积量化(Product Quantizer)

最近断断续续学习了一些关于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算法节约了存储空间,减少了运算量。





  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值