Реализация распознавания объекта Bags of Words с использованием VLFEAT
Я пытаюсь реализовать код распознавания объектов BOW в Matlab. Процесс немного сложен, и у меня было много проблем с поиском надлежащей документации по процедуре. Так может ли кто-нибудь перепроверить, имеет ли смысл мой план ниже? Я широко использую библиотеку VLSIFT здесь
Training:
1. Extract SIFT image descriptor with VLSIFT
2. Quantize the descriptors with k-means(vl_hikmeans)
3. Take quantized descriptors and create histogram(VL_HIKMEANSHIST)
4. Create SVM from histograms(VL_PEGASOS?)
Я понимаю шаг 1-3, но я не совсем уверен, правильная ли функция для SVM. VL_PEGASOS принимает следующее:
W = VL_PEGASOS(X, Y, LAMBDA)
Как именно я использую эту функцию с созданной гистограммой?
Наконец, на этапе распознавания, как мне сопоставить изображение с классом, определенным SVM?
1 ответ
Вы смотрели на их пример кода Caltech 101, который является полной реализацией подхода BoW.
Вот часть, где они классифицируются с pegasos и оценивают результаты:
% --------------------------------------------------------------------
% Train SVM
% --------------------------------------------------------------------
lambda = 1 / (conf.svm.C * length(selTrain)) ;
w = [] ;
for ci = 1:length(classes)
perm = randperm(length(selTrain)) ;
fprintf('Training model for class %s\n', classes{ci}) ;
y = 2 * (imageClass(selTrain) == ci) - 1 ;
data = vl_maketrainingset(psix(:,selTrain(perm)), int8(y(perm))) ;
[w(:,ci) b(ci)] = vl_svmpegasos(data, lambda, ...
'MaxIterations', 50/lambda, ...
'BiasMultiplier', conf.svm.biasMultiplier) ;
model.b = conf.svm.biasMultiplier * b ;
model.w = w ;
% --------------------------------------------------------------------
% Test SVM and evaluate
% --------------------------------------------------------------------
% Estimate the class of the test images
scores = model.w' * psix + model.b' * ones(1,size(psix,2)) ;
[drop, imageEstClass] = max(scores, [], 1) ;
% Compute the confusion matrix
idx = sub2ind([length(classes), length(classes)], ...
imageClass(selTest), imageEstClass(selTest)) ;
confus = zeros(length(classes)) ;
confus = vl_binsum(confus, ones(size(idx)), idx) ;