Mercurial > hg > dcase2013_ed_vuegenetal
comparison functions/challange/eventDetectionMetrics_classWiseEventBased.m @ 0:2fadb31a9d55 tip
Import code by Vuegen et al
| author | Dan Stowell <dan.stowell@elec.qmul.ac.uk> |
|---|---|
| date | Fri, 11 Oct 2013 12:02:43 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:2fadb31a9d55 |
|---|---|
| 1 function [results] = eventDetectionMetrics_classWiseEventBased(outputFile,GTFile) | |
| 2 | |
| 3 % Class-wise event-based evaluation for event detection task | |
| 4 % outputFile: the output of the event detection system | |
| 5 % GTFile: the ground truth list of events | |
| 6 | |
| 7 % Initialize | |
| 8 eventID = {'alert','clearthroat','cough','doorslam','drawer','keyboard','keys',... | |
| 9 'knock','laughter','mouse','pageturn','pendrop','phone','printer','speech','switch'}; | |
| 10 | |
| 11 | |
| 12 % Load event list from output and ground-truth | |
| 13 [onset,offset,classNames] = loadEventsList(outputFile); | |
| 14 [onsetGT,offsetGT,classNamesGT] = loadEventsList(GTFile); | |
| 15 | |
| 16 | |
| 17 % Total number of detected and reference events per class | |
| 18 Ntot = zeros(16,1); | |
| 19 for i=1:length(onset) | |
| 20 pos = strmatch(classNames{i}, eventID); | |
| 21 Ntot(pos) = Ntot(pos)+1; | |
| 22 end; | |
| 23 | |
| 24 Nref = zeros(16,1); | |
| 25 for i=1:length(onsetGT) | |
| 26 pos = strmatch(classNamesGT{i}, eventID); | |
| 27 Nref(pos) = Nref(pos)+1; | |
| 28 end; | |
| 29 I = find(Nref>0); % index for classes present in ground-truth | |
| 30 | |
| 31 | |
| 32 % Number of correctly transcribed events per class, onset within a +/-100 ms range | |
| 33 Ncorr = zeros(16,1); | |
| 34 NcorrOff = zeros(16,1); | |
| 35 for j=1:length(onsetGT) | |
| 36 for i=1:length(onset) | |
| 37 | |
| 38 if( strcmp(classNames{i},classNamesGT{j}) && (abs(onsetGT(j)-onset(i))<=0.1) ) | |
| 39 pos = strmatch(classNames{i}, eventID); | |
| 40 Ncorr(pos) = Ncorr(pos)+1; | |
| 41 | |
| 42 % If offset within a +/-100 ms range or within 50% of ground-truth event's duration | |
| 43 if abs(offsetGT(j) - offset(i)) <= max(0.1, 0.5 * (offsetGT(j) - onsetGT(j))) | |
| 44 pos = strmatch(classNames{i}, eventID); | |
| 45 NcorrOff(pos) = NcorrOff(pos) +1; | |
| 46 end; | |
| 47 | |
| 48 break; % In order to not evaluate duplicates | |
| 49 | |
| 50 end; | |
| 51 end; | |
| 52 end; | |
| 53 | |
| 54 | |
| 55 % Compute onset-only class-wise event-based metrics | |
| 56 Nfp = Ntot-Ncorr; | |
| 57 Nfn = Nref-Ncorr; | |
| 58 Nsubs = min(Nfp,Nfn); | |
| 59 tempRec = Ncorr(I)./(Nref(I)+eps); | |
| 60 tempPre = Ncorr(I)./(Ntot(I)+eps); | |
| 61 results.Rec = mean(tempRec); | |
| 62 results.Pre = mean(tempPre); | |
| 63 tempF = 2*((tempPre.*tempRec)./(tempPre+tempRec+eps)); | |
| 64 results.F = mean(tempF); | |
| 65 tempAEER = (Nfn(I)+Nfp(I)+Nsubs(I))./(Nref(I)+eps); | |
| 66 results.AEER = mean(tempAEER); | |
| 67 | |
| 68 | |
| 69 % Compute onset-offset class-wise event-based metrics | |
| 70 NfpOff = Ntot-NcorrOff; | |
| 71 NfnOff = Nref-NcorrOff; | |
| 72 NsubsOff = min(NfpOff,NfnOff); | |
| 73 tempRecOff = NcorrOff(I)./(Nref(I)+eps); | |
| 74 tempPreOff = NcorrOff(I)./(Ntot(I)+eps); | |
| 75 results.RecOff = mean(tempRecOff); | |
| 76 results.PreOff = mean(tempPreOff); | |
| 77 tempFOff = 2*((tempPreOff.*tempRecOff)./(tempPreOff+tempRecOff+eps)); | |
| 78 results.FOff = mean(tempFOff); | |
| 79 tempAEEROff = (NfnOff(I)+NfpOff(I)+NsubsOff(I))./(Nref(I)+eps); | |
| 80 results.AEEROff = mean(tempAEEROff); |
