person-re-ranking/evaluation/LOMO_XQDA/code/Demo_XQDA.m

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);