Mercurial > hg > silvet
diff testdata/evaluation/computeNoteLevelAccuracy.m @ 71:ce64d11ef336
evaluation of transcription output
author | emmanouilb <emmanouil.benetos.1@city.ac.uk> |
---|---|
date | Sat, 03 May 2014 20:49:51 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testdata/evaluation/computeNoteLevelAccuracy.m Sat May 03 20:49:51 2014 +0100 @@ -0,0 +1,48 @@ +function [Pre,Rec,F,Acc,PreOff,RecOff,FOff,AccOff] = computeNoteLevelAccuracy(nmat1,nmat2) + +% Compute note-level onset-only and onset-offset accuracy (Bay09) + + +% Initialize +if (isempty(nmat1)) Pre=0; Rec=0; F=0; Acc=0; return; end; + +% Total number of transcribed notes +Ntot = size(nmat1,1); + +% Number of reference notes +Nref = size(nmat2,1); + +% Number of correctly transcribed notes, onset within a +/-50 ms range +Ncorr = 0; +NcorrOff = 0; +for j=1:size(nmat2,1) + for i=1:size(nmat1,1) + if( (nmat1(i,3) == nmat2(j,3)) && (abs(nmat2(j,1)-nmat1(i,1))<=0.05) ) + Ncorr = Ncorr+1; + + % If offset within a +/-50 ms range or within 20% of ground-truth note's duration + if abs(nmat2(j,2) - nmat1(i,2)) <= max(0.05, 0.2 * (nmat2(j,2) - nmat2(j,1))) + NcorrOff = NcorrOff +1; + end; + + break; % In order to consider duplicates as false alarms + + end; + end; +end; + +% Number of onset-only P-R-F-Acc +Nfp = Ntot-Ncorr; +Nfn = Nref-Ncorr; +Rec = Ncorr/Nref; +Pre = Ncorr/Ntot; +F = 2*((Pre*Rec)/(Pre+Rec)); +Acc= Ncorr/(Ncorr+Nfp+Nfn); + +% Number of onset-offset P-R-F-Acc +NfpOff = Ntot-NcorrOff; +NfnOff = Nref-NcorrOff; +RecOff = NcorrOff/Nref; +PreOff = NcorrOff/Ntot; +FOff = 2*((PreOff*RecOff)/(PreOff+RecOff)); +AccOff= NcorrOff/(NcorrOff+NfpOff+NfnOff); \ No newline at end of file