Matlab で vl_feat 実装を使用して SIFT 機能を抽出し、GMM モデルとフィッシャー ベクトルを計算しようとしています。DTD データセットからの 2 つのサブセットのトレーニング イメージとテスト イメージがあります。
- 各分割 (トレーニングとテスト) で vl_sift を実行し、128xN 機能を保存します。
- それぞれが 128xN の特徴で構成されるセル配列を vl_gmm に適用し、各特徴について [平均共分散重み] を取得してから、計算された gmm モデル値を含む特徴を特徴ごとに vl_fisher に適用します。
- PCAを作る
- すべてをSVMに入れる
私の問題は、ステップ 2 でわからないことです。各画像の特徴値を vl_gmm と vl_fisher に適合するように変換する方法。
これが私のコードです:
%% SIFT Feature Extraction
FV_train = cell(size(train_name, 1), 1);
FV_test = cell(size(test_name, 1), 1);
parfor_progress(size(train_name, 1));
parfor n = 1:size(train_name, 1)
[~, FV_train{n}] = vl_sift(single(histeq(imresize(rgb2gray(imread(strcat(pwd, '/DTD/images', '/', train_name{n}))), [512 512]))));
[~, FV_test{n}] = vl_sift(single(histeq(imresize(rgb2gray(imread(strcat(pwd, '/DTD/images', '/', test_name{n}))), [512 512]))));
parfor_progress;
end
parfor_progress(0);
FV_train = FV_train(~cellfun('isempty',FV_train));
FV_test = FV_test(~cellfun('isempty',FV_test));
FV_train = adaptFV(FV_train);
FV_test = adaptFV(FV_test);
parfor n = 1:size(FV_train, 1)
FV_train{n} = double(reshape(FV_train{n},1,size(FV_train{n},2)*size(FV_train{n},1)));
FV_test{n} = double(reshape(FV_test{n},1,size(FV_test{n},2)*size(FV_test{n},1)));
end
他に 2 つの問題があります。
一部の画像でSIFTが失敗することが1つあります。したがって、それらを拒否しました
SIFT Feature の次元が異なるため、最も長いものを取り、他のものをゼロで埋めて 1xN Feature Vector にしました。