Dimitrios@0: function [results] = eventDetectionMetrics_eventBased(outputFile,GTFile) Dimitrios@0: Dimitrios@0: % Load event list from output and ground-truth Dimitrios@0: [onset,offset,classNames] = loadEventsList(outputFile); Dimitrios@0: [onsetGT,offsetGT,classNamesGT] = loadEventsList(GTFile); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Total number of detected and reference events Dimitrios@0: Ntot = length(onset); Dimitrios@0: Nref = length(onsetGT); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Number of correctly transcribed events, onset within a +/-100 ms range Dimitrios@0: Ncorr = 0; Dimitrios@0: NcorrOff = 0; Dimitrios@0: for j=1:length(onsetGT) Dimitrios@0: for i=1:length(onset) Dimitrios@0: Dimitrios@0: if( strcmp(classNames{i},classNamesGT{j}) && (abs(onsetGT(j)-onset(i))<=0.1) ) Dimitrios@0: Ncorr = Ncorr+1; Dimitrios@0: Dimitrios@0: % If offset within a +/-100 ms range or within 50% of ground-truth event's duration Dimitrios@0: if abs(offsetGT(j) - offset(i)) <= max(0.1, 0.5 * (offsetGT(j) - onsetGT(j))) Dimitrios@0: NcorrOff = NcorrOff +1; Dimitrios@0: end; Dimitrios@0: Dimitrios@0: break; % In order to not evaluate duplicates Dimitrios@0: Dimitrios@0: end; Dimitrios@0: end; Dimitrios@0: Dimitrios@0: end; Dimitrios@0: Dimitrios@0: Dimitrios@0: % Compute onset-only event-based metrics Dimitrios@0: Nfp = Ntot-Ncorr; Dimitrios@0: Nfn = Nref-Ncorr; Dimitrios@0: Nsubs = min(Nfp,Nfn); Dimitrios@0: results.Rec = Ncorr/(Nref+eps); Dimitrios@0: results.Pre = Ncorr/(Ntot+eps); Dimitrios@0: results.F = 2*((results.Pre*results.Rec)/(results.Pre+results.Rec+eps)); Dimitrios@0: results.AEER= (Nfn+Nfp+Nsubs)/(Nref+eps); Dimitrios@0: Dimitrios@0: Dimitrios@0: % Compute onset-offset event-based metrics Dimitrios@0: NfpOff = Ntot-NcorrOff; Dimitrios@0: NfnOff = Nref-NcorrOff; Dimitrios@0: NsubsOff = min(NfpOff,NfnOff); Dimitrios@0: results.RecOff = NcorrOff/(Nref+eps); Dimitrios@0: results.PreOff = NcorrOff/(Ntot+eps); Dimitrios@0: results.FOff = 2*((results.PreOff*results.RecOff)/(results.PreOff+results.RecOff+eps)); Dimitrios@0: results.AEEROff= (NfnOff+NfpOff+NsubsOff)/(Nref+eps);