70 lines
2.1 KiB
Matlab
70 lines
2.1 KiB
Matlab
%% This is a demo for the XQDA metric learning, as well as the evaluation on the VIPeR database. You can run this script to reproduce our CVPR 2015 results.
|
|
% Note: this demo requires about 1.0-1.4GB of memory.
|
|
|
|
close all; clear; clc;
|
|
|
|
feaFile = '../data/viper_lomo.mat';
|
|
|
|
numClass = 632;
|
|
numFolds = 10;
|
|
numRanks = 100;
|
|
|
|
%% load the extracted LOMO features
|
|
load(feaFile, 'descriptors');
|
|
galFea = descriptors(1 : numClass, :);
|
|
probFea = descriptors(numClass + 1 : end, :);
|
|
clear descriptors
|
|
|
|
%% set the seed of the random stream. The results reported in our CVPR 2015 paper are achieved by setting seed = 0.
|
|
seed = 0;
|
|
rng(seed);
|
|
|
|
%% evaluate
|
|
cms = zeros(numFolds, numRanks);
|
|
|
|
for nf = 1 : numFolds
|
|
p = randperm(numClass);
|
|
|
|
galFea1 = galFea( p(1:numClass/2), : );
|
|
probFea1 = probFea( p(1:numClass/2), : );
|
|
|
|
t0 = tic;
|
|
[W, M] = XQDA(galFea1, probFea1, (1:numClass/2)', (1:numClass/2)');
|
|
|
|
%{
|
|
%% if you need to set different parameters other than the defaults, set them accordingly
|
|
options.lambda = 0.001;
|
|
options.qdaDims = -1;
|
|
options.verbose = true;
|
|
[W, M] = XQDA(galFea1, probFea1, (1:numClass/2)', (1:numClass/2)', options);
|
|
%}
|
|
|
|
clear galFea1 probFea1
|
|
trainTime = toc(t0);
|
|
|
|
galFea2 = galFea(p(numClass/2+1 : end), : );
|
|
probFea2 = probFea(p(numClass/2+1 : end), : );
|
|
|
|
t0 = tic;
|
|
dist = MahDist(M, galFea2 * W, probFea2 * W);
|
|
clear galFea2 probFea2 M W
|
|
matchTime = toc(t0);
|
|
|
|
fprintf('Fold %d: ', nf);
|
|
fprintf('Training time: %.3g seconds. ', trainTime);
|
|
fprintf('Matching time: %.3g seconds.\n', matchTime);
|
|
|
|
cms(nf,:) = EvalCMC( -dist, 1 : numClass / 2, 1 : numClass / 2, numRanks );
|
|
clear dist
|
|
|
|
fprintf(' Rank1, Rank5, Rank10, Rank15, Rank20\n');
|
|
fprintf('%5.2f%%, %5.2f%%, %5.2f%%, %5.2f%%, %5.2f%%\n\n', cms(nf,[1,5,10,15,20]) * 100);
|
|
end
|
|
|
|
meanCms = mean(cms);
|
|
plot(1 : numRanks, meanCms);
|
|
|
|
fprintf('The average performance:\n');
|
|
fprintf(' Rank1, Rank5, Rank10, Rank15, Rank20\n');
|
|
fprintf('%5.2f%%, %5.2f%%, %5.2f%%, %5.2f%%, %5.2f%%\n\n', meanCms([1,5,10,15,20]) * 100);
|