我正在尝试在 Matlab 中使用 vl_feat 实现来提取 SIFT 特征,然后计算 GMM 模型以及 Fisher 向量。我有两个子集训练和测试来自 DTD 数据集的图像。
- 在每个拆分(训练和测试)上运行 vl_sift 并保存 128xN 特征
- 将每个包含 128xN 个特征的单元阵列应用于 vl_gmm 并获取每个特征 [平均协方差权重],然后将具有计算的 gmm 模型值的特征应用于每个特征的 vl_fisher。
- 制作主成分分析
- 全部放入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 特征向量。