圖像檢索之乘積量化(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算法節約了存儲空間,減少了運算量。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章