1. 程式人生 > >Fisher Vector(FV)原理

Fisher Vector(FV)原理

Fisher Vector(FV)是一種類似於BOVW詞袋模型的一種編碼方式,如提取影象的SIFT特徵,通過向量量化(KMeans聚類),構建視覺詞典(碼本),FV採用混合高斯模型(GMM)構建碼本,但是FV不只是儲存視覺詞典的在一幅影象中出現的頻率,並且FV還統計視覺詞典與區域性特徵(如SIFT)的差異。在講解Fisher Vector(FV)之前,先對FV有一個總體的認識,先看一下FV的程式碼實現。

FV採用GMM構建視覺詞典,為了視覺化,這裡採用二維的資料,當然這裡的資料可以是SIFT或其它區域性特徵,具體實現程式碼如下:

%採用GMM模型對資料data進行擬合,構建視覺詞典
numFeatures = 5000 ;            %樣本數
dimension = 2 ;                 %特徵維數
data = rand(dimension,numFeatures) ; %這裡隨機生成一些資料,這裡data可以是SIFT或其它區域性特徵

numClusters = 30 ;  %視覺詞典大小
[means, covariances, priors] = vl_gmm(data, numClusters); %GMM擬合data資料分佈,構建視覺詞典
這裡得到的means、covariances、priors分別為GMM的均值向量,協方差矩陣和先驗概率,也就是GMM的引數

這裡用GMM構建視覺詞典也存在一個問題,這是GMM模型固有的問題,就是當GMM中的高斯函式個數,也就是聚類數,也就是numClusters,若與真實的聚類數不一致的話,GMM表現的不是很好(針對期望最大化EM方法估計引數),具體請參見GMM。

接下來,我們建立另一組隨機向量,這些向量用Fisher Vector和剛獲得的GMM來編碼,具體程式碼如下:

numDataToBeEncoded = 1000;
dataToBeEncoded = rand(dimension,numDataToBeEncoded);
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);

如上程式碼片段中的encoding就是dataToBeEncoded資料的FV表示。為了提升效能,FV表示還要經過白化與歸一化,具體參見VLFeat
現在我們已經對FV已經有了一個整體的認識,下面講述FV的原理。
現設
為從影象中提取的一個D維的特徵向量(如SIFT描述子等),設
為高斯混合模型GMM擬合描述子概率分佈所得的引數。在得到GMM的引數後,GMM也就確定了。現在給定一個特徵描述子向量,它屬於某個高斯分佈(GMM中共有K個高斯分佈函式)的後驗概率為:

對於每個模式k(也就是GMM中的單個高斯分佈),考慮均值和協方差偏差向量,得到:

在上式中

把GMM中的每個模式按先向量後向量的形式級聯起來,便得到影象的FV特徵表示如下:

為了提升FV效能,得到的FV還要經過白化,Power Normalization和歸一化。為了提升計算效率,當某個特徵向量對應的很小到可以忽略時,直接被設定為零,這樣在計算的過程中便少計算了一個模式,當大部分為零時,可以明顯提高計算效率。至此,FV的原理算是講完了。但是還有一點需要注意的是,FV還有一種實現方法,它被看成是

FK推導了一種資料和擬合數據得到的生成模型,由生成模型產生的資料之間的相似性測度。生成模型的引數是通過最大似然估計(MLE)得到的。一旦生成模型被確定後,每個特定的資料都是通過觀察它如何影響MLE引數估計來表示的。這個影響測度可以通過計算相應的資料的對數似然函式的梯度得到:

協方差矩陣可以通過生成模型得到(由生成模型生成的資料已經被中心化)如下所示:

注意,H也是模型的Fisher資訊矩陣。最終的FV編碼由對數似然函式的白化梯度給出:

取兩個這樣的向量的內積產生Fisher核:

可以看出,FV編碼相當於FK的對映函式。

參考: