1

私は画像のフォルダを持っています。各画像からVLADの特徴を計算したい。各画像上MatlabでVLFeatのSIFT記述子からVLADを抽出

Iループは、それをロードし、次のようにSIFT記述子を得る:

repo = '/media/data/images/'; 
filelist = dir([repo '*.jpg']); 
sift_descr = {} 

for i = 1:size(filelist, 1) 
    I = imread([repo filelist(i).name]) ; 
    I = single(rgb2gray(I)) ; 
    [f,d] = vl_sift(I) ; 
    sift_descr{i} = d 
end 

しかし、VLADが2Dであると記述子の行列を必要とします。 hereを参照してください。 VLADエンコーディングの前に、SIFT記述子を処理する正しい方法は何ですか?ありがとうございました。

答えて

1

まず、視覚的な単語の辞書を入手するか、具体的にする必要があります。kを使用してすべての画像のSIFT機能をクラスタリングする - クラスタリングを意味します。 [1]では、例えば、 64または256クラスタを推奨します。

そのためには、すべての記述子を1つの行列に連結してから、​​関数に渡す必要があります。さらに、vl_kmeans関数は入力がsingleまたはdoubleのいずれかである必要があるため、記述子をuint8からsingleに変換します。

all_descr = single([sift_descr{:}]); 
centroids = vl_kmeans(all_descr, 64); 

第二に、あなたは寸法NumberOfClustersバイNumberOfDescriptors、クラスタに各ディスクリプタを割り当てている割り当て行列を、作成する必要があります。この割り当てマトリックスの作成には柔軟性があります。あなたはソフトまたはハード割り当てを行うことができます。あなたの裁量で単純な最近傍探索またはkd木または近似または近似近似スキームを使用できます。

チュートリアルでは、彼らはkdツリーを使用していますので、それに固執しましょう:まず、kdツリーを構築する必要があります。この操作は、右のcentroidsを見つけた後所属:

kdtree = vl_kdtreebuild(centroids); 

はその後、我々は、画像ごとにVLADベクターを構築する準備が整いました。したがって、すべての画像を再解析し、VLADベクトルを独立して計算する必要があります。まず、チュートリアルの説明に従って、割り当てマトリックスを作成します。次に、vl_vlad関数を使用してSIFT記述子をエンコードすることができます。 得VLADベクトルサイズにNumberOfClustersを有するであろう* SiftDescriptorSize、すなわちこの例では64 * 128 ..

enc = zeros(64*128, numel(sift_descr)); 

for k=1:numel(sift_descr) 

    % Create assignment matrix 
    nn = vl_kdtreequery(kdtree, centroids, single(sift_descr{k})); 
    assignments = zeros(64, numel(nn), 'single'); 
    assignments(sub2ind(size(assignments)), nn, 1:numel(nn))) = 1; 

    % Encode using VLAD 
    enc(:, k) = vl_vlad(single(sift_descr{k}), centroids, assignments); 
end 

最後に、我々は、データベース内のすべての画像のために高次元VLADベクトルを有します。通常、VLAD記述子の次元数を減らすことが望まれます。 PCAを使用します。

さて、データベースにない新しいイメージ与えられた、あなたは、SIFTはvl_siftを使用しています抽出できvl_kdtreequeryに割り当てマトリックスを作成し、vl_vladを使用して、その画像のためVLADベクトルを作成します。だから、あなたは新しい重心を見つけたり、新しいKD-ツリーを作成する必要はありません。

% Load image and extract SIFT features 
new_image = imread('filename.jpg'); 
new_image = single(rgb2gray(new_image)); 
[~, new_sift] = vl_sift(new_image); 

% Create assignment matrix 
nn = vl_kdtreequery(kdtree, centroids, single(new_sift)); 
assignments = zeros(64, numel(nn), 'single'); 
assignments(sub2ind(size(assignments)), nn, 1:numel(nn))) = 1; 

% Encode using VLAD 
new_vlad = vl_vlad(single(new_sift), centroids, assignments); 

[1] Arandjelovic、R.、& Zisserman、A.(2013)。 VLADについてコンピュータビジョンとパターン認識に関するIEEE会議(CVPR)、1578-1585。 https://doi.org/10.1109/CVPR.2013.207

+0

偉大な回答、ありがとうございます。 –

関連する問題