最近斷斷續續學習了一些關於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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.