圖像稀疏編碼表示

注:本文學習自CVPRLinear Spatial Pyramid Matching Using Sparse Coding
for Image Classification》、《Image classification By non-negative sparse coding, low-rank and sparse decomposition》及《基於稀疏編碼的圖像視覺特徵提取及應用》

本文學習筆記是自己的理解,如有不對的地方,請大家指正批評,共同進步!

在提取完所有訓練圖像的SIFT特徵後,需要對每幅圖像進行視覺特徵編碼。視覺特徵編碼的目的在於對原始特徵向量進行選擇和變換,得到圖像中最具表現力和區分度的視覺特徵向量,使得計算機可以更高效的進行處理。一般編碼方式是向量量化,另一種視覺編碼方式稀疏編碼能更好的表示圖像。

1、向量量化

向量量化的基本思想是在基向量空間中尋找目標向量的最近鄰,然後用該基向量的編號表示原目標向量:


其中x爲某個SIFT特徵向量,di爲基向量空間中的第i個向量。其實基向量就是對所有訓練圖像的所有SIFT特徵向量進行聚類,得到的K個聚類中心,這K個特徵向量最後作爲基向量。然後對於每一幅圖像,尋找每個SIFT特徵向量屬於哪個基向量,來進行映射。

在向量量化的過程中,基本步驟如下:
1) 將全部的訓練樣本進行歸一化;
2) 對訓練樣本進行聚類,得到若干個類中心,構成基向量空間:
3) 在所有類中心中爲目標向量尋找最近鄰。

BOW模型中,先聚類產生視覺關鍵詞,然後進行向量量化編碼。對於用SIFT特徵


就是這幅圖像的稀疏編碼。
向量量化的優點在於計算簡單,數據壓縮率高,缺點在於精度損失比較大,在某些應用中難以滿足要求。

2、稀疏編碼

稀疏編碼的本質是一個目標向量可以由少量的基向量經線性擬合而成,且基向量空間存在一定的冗餘。與向量量化的區別是向量量化的每個目標向量只能由一個基向量表示。也就是說向量量化方式的約束條件太嚴格,會引起重構誤差。二者區別可表示如下:



對圖像的稀疏編碼一般分爲兩個過程:

一是基向量的訓練過程,也稱爲字典的學習。在這個過程中,我們利用大量的訓練樣本,通過無監督學習方法學習獲得一組冗餘的基向量,這組基向量通常反映了訓練樣本中一些帶有本質特性的基元,如圖像中的邊界、角點,實驗表明,字典的學習過程模擬了人類視覺皮層對信息的處理過程。

最優化問題(1)變成了二次約束的最小二乘問題,即:


這個最優化問題,在給定X情況下,交替固定一個變量,訓練另一個變量,如此迭代。

   二是線性擬合的求解過程。即任意目標向量xn都可以由字典V內的若干個條目經線性組合擬合而成,該過程根據不同的約束條件,可以得到不同的擬合係數un,然後用該係數向量表示圖像特徵。

此時V已知,對圖像X稀疏編碼得到U,問題變爲如下求解:


3、實驗過程:

1、從每張圖像中隨機提取一個特徵點向量,湊出一個初始訓練樣本X。(128*2600
for ii = 1:2600

     fpath = training.path{ii};

      load(fpath);

      num_fea = size(feaSet.feaArr, 2);

       rndidx = randperm(num_fea);

       X(:, ii) = feaSet.feaArr(:, rndidx(ii));

end;

2、視覺字典V的學習
  a、初始視覺字典V通過隨機函數給出,先隨機產生一個128*300的矩陣作爲初始視覺 字典

V = rand(128, 300)-0.5;%先隨機生成一個視覺詞典V

    V = V - repmat(mean(V,1), size(V,1),1);

     V = V*diag(1./sqrt(sum(V.*V)));

  b、使用剛剛得到的V,對樣本X計算得到U

  U = L1QP_FeatureSign_Set(X, V, lambda);

此函數在已知訓練樣本X和給出的視覺字典V的前提下,學習得到此時樣本的稀


  c、使用剛剛得到的U,再訓練得到V
V = l2ls_learn_basis_dual(X, U, pars.VAR_basis);

此函數在已知訓練樣本X和樣本稀疏編碼U的前提下,學習得到V。在條件


  d、迭代50bc過程,最終得到視覺詞典V及訓練樣本X的稀疏編碼U

3、對每張圖像,應用得到的視覺字典V,得到其稀疏編碼U

4、如下代碼用某種方式(sc_approx_pooling)對每幅圖像的稀疏編碼進行了處理,然後用21*300(300是視覺關鍵詞的個數)維向量來表示這幅圖像。以前是對向量量化編碼U按關鍵詞出現的頻次計算直方圖來表示這幅圖像,現在改用最大池處理,即對於稀疏編碼得到的U,Uij表示了第iSIFT特徵區域對第j個關鍵詞的歸屬程度,取每個關鍵詞中歸屬程度的最大值來表示這個關鍵詞,得到K維特徵向量來表示這幅圖像。

sc_fea = zeros(6300, 2600);%%所有訓練圖像的稀疏編碼

sc_label = zeros(2600, 1);

for iter1 = 1:2600,  

     fpath = database.path{iter1};

     load(fpath);

     %%對每張圖像給出一個稀疏編碼矩陣(這裏需要對每張圖片每金字塔層每個網格給出一個300*N 稀疏編碼矩陣,最後按 權值串聯該幅圖的所有稀疏編碼作爲最終稀疏編碼來表示這幅圖像)

     sc_fea(:, iter1) = sc_approx_pooling(feaSet, V, pyramid, gamma);

    sc_label(iter1) = database.label(iter1);

end;

 

 

總結一下,稀疏編碼其實就是先對所有圖像的所有SIFT特徵進行訓練,得到基向量也即視覺關鍵詞V。之後對於每一幅圖像,計算其每個特徵點所屬的基向量索引uu中含有多個非零係數用來擬合多個基向量,得到一幅圖像的係數編碼U。用U乘以基向量V就能表示一幅圖像X。之後再用方法(sc_approx_pooling)對每幅圖像的稀疏表示U進行了處理,得到300(視覺關鍵詞的個數)維向量來表示這幅圖像。




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