gerard@1
|
1 % from https://soundsoftware.ac.uk/projects/aasp-d-case-metrics
|
gerard@1
|
2
|
gerard@1
|
3 function [confusionMat, AccFolds, Acc, Std] = sceneClassificationMetrics_eval(numfolds, foldsGTlist, foldstestlist)
|
gerard@1
|
4
|
gerard@1
|
5 % Function takes as input a number of folds (numfolds), a text file
|
gerard@1
|
6 % containing a list of filenames with the ground truth per fold (foldsGTlist),
|
gerard@1
|
7 % and a text file containing a list of filenames with the classification
|
gerard@1
|
8 % output (foldstestlist)
|
gerard@1
|
9 %
|
gerard@1
|
10 % e.g. [confusionMat, AccFolds, Acc, Std] = sceneClassificationMetrics_eval(5, 'foldGTlist.txt', 'foldtestlist.txt');
|
gerard@1
|
11
|
gerard@1
|
12
|
gerard@1
|
13 % Initialize
|
gerard@1
|
14 classList = {'bus','busystreet','office','openairmarket','park','quietstreet','restaurant','supermarket','tube','tubestation'};
|
gerard@1
|
15 confusionMat = zeros(10,10);
|
gerard@1
|
16 AccFolds = zeros(1,numfolds);
|
gerard@1
|
17
|
gerard@1
|
18
|
gerard@1
|
19 % For each fold
|
gerard@1
|
20 fid1 = fopen(foldsGTlist,'r+');
|
gerard@1
|
21 fid2 = fopen(foldstestlist,'r+');
|
gerard@1
|
22 for i=1:numfolds
|
gerard@1
|
23
|
gerard@1
|
24 % Load classification output and ground truth
|
gerard@1
|
25 tline1 = fgetl(fid1);
|
gerard@1
|
26 [fileIDGT,classIDGT] = loadClassificationOutput(tline1);
|
gerard@1
|
27 tline2 = fgetl(fid2);
|
gerard@1
|
28 [fileID,classID] = loadClassificationOutput(tline2);
|
gerard@1
|
29
|
gerard@1
|
30 % Compute confusion matrix per fold
|
gerard@1
|
31 confusionMatTemp = zeros(10,10);
|
gerard@1
|
32 for j=1:length(classIDGT)
|
gerard@1
|
33 pos = strmatch(fileIDGT{j}, fileID, 'exact');
|
gerard@1
|
34 posClassGT = strmatch(classIDGT{j}, classList, 'exact');
|
gerard@1
|
35 posClass = strmatch(classID{pos}, classList, 'exact');
|
gerard@1
|
36 confusionMatTemp(posClassGT,posClass) = confusionMatTemp(posClassGT,posClass) + 1;
|
gerard@1
|
37 end
|
gerard@1
|
38
|
gerard@1
|
39 % Compute accuracy per fold
|
gerard@1
|
40 AccFolds(i) = sum(diag(confusionMatTemp))/sum(sum(confusionMatTemp));
|
gerard@1
|
41 confusionMat = confusionMat + confusionMatTemp;
|
gerard@1
|
42
|
gerard@1
|
43 end
|
gerard@1
|
44 fclose(fid1);
|
gerard@1
|
45 fclose(fid2);
|
gerard@1
|
46
|
gerard@1
|
47
|
gerard@1
|
48 % Compute global accuracy and std
|
gerard@1
|
49 Acc = mean(AccFolds);
|
gerard@1
|
50 Std = std(AccFolds);
|