1

我正在尝试在 Matlab 中使用 vl_feat 实现来提取 SIFT 特征,然后计算 GMM 模型以及 Fisher 向量。我有两个子集训练和测试来自 DTD 数据集的图像。

  1. 在每个拆分(训练和测试)上运行 vl_sift 并保存 128xN 特征
  2. 将每个包含 128xN 个特征的单元阵列应用于 vl_gmm 并获取每个特征 [平均协方差权重],然后将具有计算的 gmm 模型值的特征应用于每个特征的 vl_fisher。
  3. 制作主成分分析
  4. 全部放入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

还有另外两个问题:

  • 一个是 SIFT 在某些图像上失败,因此我拒绝了它们

  • 由于 SIFT 特征的不同维度,我取了最长的一个并将其他的用零填充到 1xN 特征向量。

4

0 回答 0