Showing the changes to python (5 of 5 files). Show all
Unified · Split
| @@ -2,22 +2,42 @@ export BASEDIR=../../../.. · 1 unmodified line | |||
| 2 | export PYTHONPATH=$(BASEDIR)/python | 2 | export PYTHONPATH=$(BASEDIR)/python |
| 3 | export LD_LIBRARY_PATH=$(BASEDIR)/src/.libs:$(BASEDIR)/ext/.libs | 3 | export LD_LIBRARY_PATH=$(BASEDIR)/src/.libs:$(BASEDIR)/ext/.libs |
| 4 | 4 | ||
| 5 | SOURCE = \ | 5 | DETAILSOURCE = \ |
| 6 | /archives/samples/DB/PercussivePhrases/CM18/Samba_Audio \ | ||
| 7 | /var/tmp/Onset-Mirex2005/poly_pitched \ | 6 | /var/tmp/Onset-Mirex2005/poly_pitched \ |
| 8 | /var/tmp/Onset-Mirex2005/solo_bars_and_bells \ | 7 | /var/tmp/Onset-Mirex2005/solo_bars_and_bells \ |
| 9 | /var/tmp/Onset-Mirex2005/solo_brass \ | ||
| 10 | /var/tmp/Onset-Mirex2005/solo_drums \ | 8 | /var/tmp/Onset-Mirex2005/solo_drums \ |
| 11 | /var/tmp/Onset-Mirex2005/solo_plucked_strings \ | 9 | /var/tmp/Onset-Mirex2005/solo_plucked_strings \ |
| 12 | /var/tmp/Onset-Mirex2005/solo_singing_voice \ | 10 | /var/tmp/Onset-Mirex2005/solo_singing_voice \ |
| 13 | /var/tmp/Onset-Mirex2005/solo_sustained_strings \ | 11 | /var/tmp/Onset-Mirex2005/solo_sustained_strings \ |
| 14 | /var/tmp/Onset-Mirex2005/solo_winds \ | 12 | /var/tmp/Onset-Mirex2005/solo_winds \ |
| 15 | /var/tmp/Onset-Mirex2005/complex \ | 13 | /var/tmp/Onset-Mirex2005/complex |
| 16 | /var/tmp/Onset-Mirex2005 | ||
| 17 | 14 | ||
| 18 | test-aubiocut: $(patsubst %, %.aubiocut, $(SOURCE)) | 15 | SOURCE = /var/tmp/Onset-Mirex2005 |
| 16 | |||
| 17 | TESTSOURCE = \ | ||
| 18 | /var/tmp/Onset-Mirex2005/solo_bars_and_bells \ | ||
| 19 | /var/tmp/Onset-Mirex2005/solo_winds \ | ||
| 20 | /archives/samples/DB/PercussivePhrases/CM18/Samba_Audio | ||
| 21 | |||
| 22 | test-aubiocut: $(patsubst %, %.aubiocut, $(TESTSOURCE)) | ||
| 23 | test-aubiodelay: $(patsubst %, %.aubiodelay, $(TESTSOURCE)) | ||
| 24 | test-aubiowindow: $(patsubst %, %.aubiowindow, $(TESTSOURCE)) | ||
| 25 | |||
| 26 | final-aubiocut: $(patsubst %, %.aubiocut, $(DETAILSOURCE) $(SOURCE)) | ||
| 27 | final-aubiodelay: $(patsubst %, %.aubiodelay, $(SOURCE)) | ||
| 28 | final-aubiowindow: $(patsubst %, %.aubiowindow, $(SOURCE)) | ||
| 19 | 29 | ||
| 20 | %.aubiocut: % | 30 | %.aubiocut: % |
| 21 | rm -f `basename $<`.aubiocut | 31 | rm -f `basename $<`.aubiocut |
| 22 | ./bench-onset $< | tee `basename $<`.aubiocut | 32 | ./bench-onset $< | tee `basename $<`.aubiocut |
| 23 | diff `basename $<`.aubiocut.ref `basename $<`.aubiocut | 33 | -diff `basename $<`.aubiocut.ref `basename $<`.aubiocut |
| 34 | |||
| 35 | %.aubiodelay: % | ||
| 36 | rm -f `basename $@` | ||
| 37 | ./bench-delay $< | tee `basename $@` | ||
| 38 | -diff `basename $@`.ref `basename $@` | ||
| 39 | |||
| 40 | %.aubiowindow: % | ||
| 41 | rm -f `basename $@` | ||
| 42 | ./bench-window $< | tee `basename $@` | ||
| 43 | -diff `basename $@`.ref `basename $@` | ||
| @@ -0,0 +1,72 @@ | |||
| 1 | #! /usr/bin/python | ||
| 2 | |||
| 3 | from aubio.bench.node import * | ||
| 4 | from aubio.tasks import * | ||
| 5 | |||
| 6 | from benchonset import mmean, stdev, benchonset | ||
| 7 | |||
| 8 | class mybenchonset(benchonset): | ||
| 9 | |||
| 10 | def run_bench(self,modes=['dual'],thresholds=[0.5]): | ||
| 11 | from os.path import dirname,basename | ||
| 12 | self.modes = modes | ||
| 13 | self.thresholds = thresholds | ||
| 14 | self.pretty_titles() | ||
| 15 | for mode in self.modes: | ||
| 16 | d = [] | ||
| 17 | outplot = "_-_".join(("delay",mode, | ||
| 18 | basename(self.datadir) )) | ||
| 19 | |||
| 20 | self.params.onsetmode = mode | ||
| 21 | self.params.threshold = thresholds[0] | ||
| 22 | |||
| 23 | self.params.localmin = False | ||
| 24 | self.params.delay = 0. | ||
| 25 | |||
| 26 | self.dir_exec() | ||
| 27 | self.dir_eval() | ||
| 28 | self.pretty_print() | ||
| 29 | self.plotdiffs(d,plottitle="Causal") | ||
| 30 | |||
| 31 | self.params.localmin = True | ||
| 32 | self.params.delay = 0. | ||
| 33 | self.dir_exec() | ||
| 34 | self.dir_eval() | ||
| 35 | self.pretty_print() | ||
| 36 | self.plotdiffs(d,plottitle="Local min") | ||
| 37 | |||
| 38 | self.params.localmin = False | ||
| 39 | self.params.delay = 6. | ||
| 40 | self.dir_exec() | ||
| 41 | self.dir_eval() | ||
| 42 | self.pretty_print() | ||
| 43 | self.plotdiffs(d,plottitle="Fixed delay") | ||
| 44 | |||
| 45 | self.plotplotdiffs(d) | ||
| 46 | self.plotplotdiffs(d,outplot=outplot,extension="png") | ||
| 47 | self.plotplotdiffs(d,outplot=outplot,extension="ps") | ||
| 48 | self.plotplotdiffs(d,outplot=outplot,extension="svg") | ||
| 49 | |||
| 50 | |||
| 51 | if __name__ == "__main__": | ||
| 52 | import sys | ||
| 53 | if len(sys.argv) > 1: datapath = sys.argv[1] | ||
| 54 | else: print "ERR: a path is required"; sys.exit(1) | ||
| 55 | modes = ['complex', 'energy', 'phase', 'specdiff', 'kl', 'mkl', 'dual'] | ||
| 56 | #modes = [ 'complex' ] | ||
| 57 | thresholds = [ 0.5] | ||
| 58 | #thresholds = [1.5] | ||
| 59 | |||
| 60 | #datapath = "%s%s" % (DATADIR,'/onset/DB/*/') | ||
| 61 | respath = '/var/tmp/DB-testings' | ||
| 62 | |||
| 63 | benchonset = mybenchonset(datapath,respath,checkres=True,checkanno=True) | ||
| 64 | benchonset.params = taskparams() | ||
| 65 | benchonset.task = taskonset | ||
| 66 | benchonset.valuesdict = {} | ||
| 67 | |||
| 68 | try: | ||
| 69 | #benchonset.auto_learn2(modes=modes) | ||
| 70 | benchonset.run_bench(modes=modes,thresholds=thresholds) | ||
| 71 | except KeyboardInterrupt: | ||
| 72 | sys.exit(1) | ||
| @@ -1,80 +1,18 @@ | |||
| 1 | #! /usr/bin/python | 1 | #! /usr/bin/python |
| 2 | 2 | ||
| 3 | from aubio.bench.node import * | ||
| 4 | from aubio.tasks import * | 3 | from aubio.tasks import * |
| 5 | 4 | ||
| 5 | from benchonset import mmean, stdev, benchonset | ||
| 6 | 6 | ||
| 7 | 7 | class mybenchonset(benchonset): | |
| 8 | |||
| 9 | def mmean(l): | ||
| 10 | return sum(l)/float(len(l)) | ||
| 11 | |||
| 12 | def stdev(l): | ||
| 13 | smean = 0 | ||
| 14 | lmean = mmean(l) | ||
| 15 | for i in l: | ||
| 16 | smean += (i-lmean)**2 | ||
| 17 | smean *= 1. / len(l) | ||
| 18 | return smean**.5 | ||
| 19 | |||
| 20 | class benchonset(bench): | ||
| 21 | |||
| 22 | """ list of values to store per file """ | ||
| 23 | valuenames = ['orig','missed','Tm','expc','bad','Td'] | ||
| 24 | """ list of lists to store per file """ | ||
| 25 | valuelists = ['l','labs'] | ||
| 26 | """ list of values to print per dir """ | ||
| 27 | printnames = [ 'mode', 'thres', 'dist', 'prec', 'recl', | ||
| 28 | 'Ttrue', 'Tfp', 'Tfn', 'Tm', 'Td', | ||
| 29 | 'aTtrue', 'aTfp', 'aTfn', 'aTm', 'aTd', | ||
| 30 | 'mean', 'smean', 'amean', 'samean'] | ||
| 31 | |||
| 32 | """ per dir """ | ||
| 33 | formats = {'mode': "%12s" , 'thres': "%5.4s", | ||
| 34 | 'dist': "%5.4s", 'prec': "%5.4s", 'recl': "%5.4s", | ||
| 35 | 'Ttrue': "%5.4s", 'Tfp': "%5.4s", 'Tfn': "%5.4s", | ||
| 36 | 'Tm': "%5.4s", 'Td': "%5.4s", | ||
| 37 | 'aTtrue':"%5.4s", 'aTfp': "%5.4s", 'aTfn': "%5.4s", | ||
| 38 | 'aTm': "%5.4s", 'aTd': "%5.4s", | ||
| 39 | 'mean': "%5.40s", 'smean': "%5.40s", | ||
| 40 | 'amean': "%5.40s", 'samean': "%5.40s"} | ||
| 41 | |||
| 42 | def dir_eval(self): | ||
| 43 | """ evaluate statistical data over the directory """ | ||
| 44 | totaltrue = sum(self.v['expc'])-sum(self.v['bad'])-sum(self.v['Td']) | ||
| 45 | totalfp = sum(self.v['bad'])+sum(self.v['Td']) | ||
| 46 | totalfn = sum(self.v['missed'])+sum(self.v['Tm']) | ||
| 47 | self.P = 100*float(totaltrue)/max(totaltrue + totalfp,1) | ||
| 48 | self.R = 100*float(totaltrue)/max(totaltrue + totalfn,1) | ||
| 49 | if self.R < 0: self.R = 0 | ||
| 50 | self.F = 2.* self.P*self.R / max(float(self.P+self.R),1) | ||
| 51 | N = float(len(self.reslist)) | ||
| 52 | self.v['mode'] = self.params.onsetmode | ||
| 53 | self.v['thres'] = self.params.threshold | ||
| 54 | self.v['thres'] = "%2.3f" % self.params.threshold | ||
| 55 | self.v['dist'] = "%2.3f" % self.F | ||
| 56 | self.v['prec'] = "%2.3f" % self.P | ||
| 57 | self.v['recl'] = "%2.3f" % self.R | ||
| 58 | self.v['Ttrue'] = totaltrue | ||
| 59 | self.v['Tfp'] = totalfp | ||
| 60 | self.v['Tfn'] = totalfn | ||
| 61 | self.v['aTtrue'] = totaltrue/N | ||
| 62 | self.v['aTfp'] = totalfp/N | ||
| 63 | self.v['aTfn'] = totalfn/N | ||
| 64 | self.v['aTm'] = sum(self.v['Tm'])/N | ||
| 65 | self.v['aTd'] = sum(self.v['Td'])/N | ||
| 66 | self.v['Tm'] = sum(self.v['Tm']) | ||
| 67 | self.v['Td'] = sum(self.v['Td']) | ||
| 68 | self.v['mean'] = mmean(self.v['l']) | ||
| 69 | self.v['smean'] = stdev(self.v['l']) | ||
| 70 | self.v['amean'] = mmean(self.v['labs']) | ||
| 71 | self.v['samean'] = stdev(self.v['labs']) | ||
| 72 | 8 | ||
| 73 | def run_bench(self,modes=['dual'],thresholds=[0.5]): | 9 | def run_bench(self,modes=['dual'],thresholds=[0.5]): |
| 74 | self.modes = modes | 10 | from os.path import dirname,basename |
| 75 | self.thresholds = thresholds | 11 | self.thresholds = thresholds |
| 76 | self.pretty_titles() | 12 | self.pretty_titles() |
| 77 | for mode in self.modes: | 13 | d,e,f = [],[],[] |
| 14 | for mode in modes: | ||
| 15 | self.vlist = [] | ||
| 78 | self.params.onsetmode = mode | 16 | self.params.onsetmode = mode |
| 79 | for threshold in self.thresholds: | 17 | for threshold in self.thresholds: |
| 80 | self.params.threshold = threshold | 18 | self.params.threshold = threshold |
| @@ -82,6 +20,20 @@ class benchonset(bench): · 1 unmodified line | |||
| 82 | self.dir_eval() | 20 | self.dir_eval() |
| 83 | self.pretty_print() | 21 | self.pretty_print() |
| 84 | #print self.v | 22 | #print self.v |
| 23 | self.vlist.append(self.v) | ||
| 24 | self.plotroc(d) | ||
| 25 | self.plotfmeas(e) | ||
| 26 | self.plotpr(f) | ||
| 27 | #print vlist | ||
| 28 | #self.plotplotroc(d) | ||
| 29 | #self.plotplotfmeas(e) | ||
| 30 | #self.plotplotpr(f) | ||
| 31 | outplot = basename(self.datadir) | ||
| 32 | for ext in ("png","svg","ps"): | ||
| 33 | self.plotplotroc(d,outplot=outplot,extension=ext) | ||
| 34 | self.plotplotfmeas(e,outplot=outplot,extension=ext) | ||
| 35 | self.plotplotpr(f,outplot=outplot,extension=ext) | ||
| 36 | |||
| 85 | 37 | ||
| 86 | def auto_learn(self,modes=['dual'],thresholds=[0.1,1.5]): | 38 | def auto_learn(self,modes=['dual'],thresholds=[0.1,1.5]): |
| 87 | """ simple dichotomia like algorithm to optimise threshold """ | 39 | """ simple dichotomia like algorithm to optimise threshold """ |
| @@ -106,6 +58,10 @@ class benchonset(bench): · 18 unmodified lines | |||
| 106 | lessF = self.F | 58 | lessF = self.F |
| 107 | 59 | ||
| 108 | for i in range(steps): | 60 | for i in range(steps): |
| 61 | self.params.localmin = True | ||
| 62 | self.params.delay = 1. | ||
| 63 | self.dir_exec() | ||
| 64 | self.dir_eval() | ||
| 109 | self.params.threshold = ( lesst + topt ) * .5 | 65 | self.params.threshold = ( lesst + topt ) * .5 |
| 110 | self.dir_exec() | 66 | self.dir_exec() |
| 111 | self.dir_eval() | 67 | self.dir_eval() |
| @@ -169,15 +125,15 @@ if __name__ == "__main__": · 57 unmodified lines | |||
| 169 | import sys | 125 | import sys |
| 170 | if len(sys.argv) > 1: datapath = sys.argv[1] | 126 | if len(sys.argv) > 1: datapath = sys.argv[1] |
| 171 | else: print "ERR: a path is required"; sys.exit(1) | 127 | else: print "ERR: a path is required"; sys.exit(1) |
| 172 | modes = ['complex', 'energy', 'phase', 'specdiff', 'kl', 'mkl', 'dual'] | 128 | modes = ['complex', 'energy', 'phase', 'hfc', 'specdiff', 'kl', 'mkl', 'dual'] |
| 173 | #modes = [ 'mkl' ] | ||
| 174 | thresholds = [ 0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2] | 129 | thresholds = [ 0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2] |
| 175 | #thresholds = [1.5] | 130 | #modes = [ 'hfc' ] |
| 131 | #thresholds = [0.1, 1.5] | ||
| 176 | 132 | ||
| 177 | #datapath = "%s%s" % (DATADIR,'/onset/DB/*/') | 133 | #datapath = "%s%s" % (DATADIR,'/onset/DB/*/') |
| 178 | respath = '/var/tmp/DB-testings' | 134 | respath = '/var/tmp/DB-testings' |
| 179 | 135 | ||
| 180 | benchonset = benchonset(datapath,respath,checkres=True,checkanno=True) | 136 | benchonset = mybenchonset(datapath,respath,checkres=True,checkanno=True) |
| 181 | benchonset.params = taskparams() | 137 | benchonset.params = taskparams() |
| 182 | benchonset.task = taskonset | 138 | benchonset.task = taskonset |
| 183 | benchonset.valuesdict = {} | 139 | benchonset.valuesdict = {} |
| @@ -0,0 +1,63 @@ | |||
| 1 | #! /usr/bin/python | ||
| 2 | |||
| 3 | from aubio.tasks import * | ||
| 4 | |||
| 5 | from benchonset import mmean, stdev, plotdiffs, plotplotdiffs, benchonset | ||
| 6 | |||
| 7 | class mybenchonset(benchonset): | ||
| 8 | |||
| 9 | def run_bench(self,modes=['dual'],thresholds=[0.5]): | ||
| 10 | from os.path import dirname,basename | ||
| 11 | self.thresholds = thresholds | ||
| 12 | self.pretty_titles() | ||
| 13 | for mode in modes: | ||
| 14 | |||
| 15 | self.params.onsetmode = mode | ||
| 16 | self.params.threshold = thresholds[0] | ||
| 17 | self.params.localmin = False | ||
| 18 | |||
| 19 | for delay in (0., 4.): | ||
| 20 | d = [] | ||
| 21 | outplot = "_-_".join(("window",mode,"delay-%s" % delay, | ||
| 22 | basename(self.datadir) )) | ||
| 23 | self.params.delay = delay | ||
| 24 | |||
| 25 | for buf in (2048, 1024, 512): | ||
| 26 | for hop in (buf/2, buf/4): | ||
| 27 | self.params.bufsize = buf | ||
| 28 | self.params.hopsize = hop | ||
| 29 | self.params.step = float(self.params.hopsize)/float(self.params.samplerate) | ||
| 30 | |||
| 31 | self.dir_exec() | ||
| 32 | self.dir_eval() | ||
| 33 | self.pretty_print() | ||
| 34 | plotdiffs(self.v,d,plottitle="%s %s" % (buf,hop)) | ||
| 35 | |||
| 36 | plotplotdiffs(d) | ||
| 37 | plotplotdiffs(d,outplot=outplot,extension="png") | ||
| 38 | plotplotdiffs(d,outplot=outplot,extension="ps") | ||
| 39 | plotplotdiffs(d,outplot=outplot,extension="svg") | ||
| 40 | |||
| 41 | |||
| 42 | if __name__ == "__main__": | ||
| 43 | import sys | ||
| 44 | if len(sys.argv) > 1: datapath = sys.argv[1] | ||
| 45 | else: print "ERR: a path is required"; sys.exit(1) | ||
| 46 | modes = ['complex', 'energy', 'phase', 'specdiff', 'kl', 'mkl', 'dual'] | ||
| 47 | #modes = [ 'complex' ] | ||
| 48 | thresholds = [ 0.5] | ||
| 49 | #thresholds = [1.5] | ||
| 50 | |||
| 51 | #datapath = "%s%s" % (DATADIR,'/onset/DB/*/') | ||
| 52 | respath = '/var/tmp/DB-testings' | ||
| 53 | |||
| 54 | benchonset = mybenchonset(datapath,respath,checkres=True,checkanno=True) | ||
| 55 | benchonset.params = taskparams() | ||
| 56 | benchonset.task = taskonset | ||
| 57 | benchonset.valuesdict = {} | ||
| 58 | |||
| 59 | try: | ||
| 60 | #benchonset.auto_learn2(modes=modes) | ||
| 61 | benchonset.run_bench(modes=modes,thresholds=thresholds) | ||
| 62 | except KeyboardInterrupt: | ||
| 63 | sys.exit(1) | ||
| @@ -0,0 +1,235 @@ | |||
| 1 | #! /usr/bin/python | ||
| 2 | |||
| 3 | from aubio.bench.node import * | ||
| 4 | from os.path import dirname,basename | ||
| 5 | |||
| 6 | def mmean(l): | ||
| 7 | return sum(l)/max(float(len(l)),1) | ||
| 8 | |||
| 9 | def stdev(l): | ||
| 10 | smean = 0 | ||
| 11 | if not len(l): return smean | ||
| 12 | lmean = mmean(l) | ||
| 13 | for i in l: | ||
| 14 | smean += (i-lmean)**2 | ||
| 15 | smean *= 1. / len(l) | ||
| 16 | return smean**.5 | ||
| 17 | |||
| 18 | class benchonset(bench): | ||
| 19 | |||
| 20 | """ list of values to store per file """ | ||
| 21 | valuenames = ['orig','missed','Tm','expc','bad','Td'] | ||
| 22 | """ list of lists to store per file """ | ||
| 23 | valuelists = ['l','labs'] | ||
| 24 | """ list of values to print per dir """ | ||
| 25 | printnames = [ 'mode', 'thres', 'dist', 'prec', 'recl', | ||
| 26 | 'GD', 'FP', | ||
| 27 | 'Torig', 'Ttrue', 'Tfp', 'Tfn', 'TTm', 'TTd', | ||
| 28 | 'aTtrue', 'aTfp', 'aTfn', 'aTm', 'aTd', | ||
| 29 | 'mean', 'smean', 'amean', 'samean'] | ||
| 30 | |||
| 31 | """ per dir """ | ||
| 32 | formats = {'mode': "%12s" , 'thres': "%5.4s", | ||
| 33 | 'dist': "%5.4s", 'prec': "%5.4s", 'recl': "%5.4s", | ||
| 34 | 'Torig': "%5.4s", 'Ttrue': "%5.4s", 'Tfp': "%5.4s", 'Tfn': "%5.4s", | ||
| 35 | 'TTm': "%5.4s", 'TTd': "%5.4s", | ||
| 36 | 'aTtrue':"%5.4s", 'aTfp': "%5.4s", 'aTfn': "%5.4s", | ||
| 37 | 'aTm': "%5.4s", 'aTd': "%5.4s", | ||
| 38 | 'mean': "%5.40s", 'smean': "%5.40s", | ||
| 39 | 'amean': "%5.40s", 'samean': "%5.40s", | ||
| 40 | "GD": "%5.4s", "FP": "%5.4s", | ||
| 41 | "GDm": "%5.4s", "FPd": "%5.4s"} | ||
| 42 | |||
| 43 | def dir_eval(self): | ||
| 44 | """ evaluate statistical data over the directory """ | ||
| 45 | v = self.v | ||
| 46 | |||
| 47 | v['mode'] = self.params.onsetmode | ||
| 48 | v['thres'] = self.params.threshold | ||
| 49 | |||
| 50 | v['Torig'] = sum(v['orig']) | ||
| 51 | v['TTm'] = sum(v['Tm']) | ||
| 52 | v['TTd'] = sum(v['Td']) | ||
| 53 | v['Texpc'] = sum(v['expc']) | ||
| 54 | v['Tbad'] = sum(v['bad']) | ||
| 55 | v['Tmissed'] = sum(v['missed']) | ||
| 56 | v['aTm'] = mmean(v['Tm']) | ||
| 57 | v['aTd'] = mmean(v['Td']) | ||
| 58 | |||
| 59 | v['mean'] = mmean(v['l']) | ||
| 60 | v['smean'] = stdev(v['l']) | ||
| 61 | |||
| 62 | v['amean'] = mmean(v['labs']) | ||
| 63 | v['samean'] = stdev(v['labs']) | ||
| 64 | |||
| 65 | # old type calculations | ||
| 66 | # good detection rate | ||
| 67 | v['GD'] = 100.*(v['Torig']-v['Tmissed']-v['TTm'])/v['Torig'] | ||
| 68 | # false positive rate | ||
| 69 | v['FP'] = 100.*(v['Tbad']+v['TTd'])/v['Torig'] | ||
| 70 | # good detection counting merged detections as good | ||
| 71 | v['GDm'] = 100.*(v['Torig']-v['Tmissed'])/v['Torig'] | ||
| 72 | # false positives counting doubled as good | ||
| 73 | v['FPd'] = 100.*v['Tbad']/v['Torig'] | ||
| 74 | |||
| 75 | # mirex type annotations | ||
| 76 | totaltrue = v['Texpc']-v['Tbad']-v['TTd'] | ||
| 77 | totalfp = v['Tbad']+v['TTd'] | ||
| 78 | totalfn = v['Tmissed']+v['TTm'] | ||
| 79 | self.v['Ttrue'] = totaltrue | ||
| 80 | self.v['Tfp'] = totalfp | ||
| 81 | self.v['Tfn'] = totalfn | ||
| 82 | # average over the number of annotation files | ||
| 83 | N = float(len(self.reslist)) | ||
| 84 | self.v['aTtrue'] = totaltrue/N | ||
| 85 | self.v['aTfp'] = totalfp/N | ||
| 86 | self.v['aTfn'] = totalfn/N | ||
| 87 | |||
| 88 | # F-measure | ||
| 89 | self.P = 100.*float(totaltrue)/max(totaltrue + totalfp,1) | ||
| 90 | self.R = 100.*float(totaltrue)/max(totaltrue + totalfn,1) | ||
| 91 | #if self.R < 0: self.R = 0 | ||
| 92 | self.F = 2.* self.P*self.R / max(float(self.P+self.R),1) | ||
| 93 | self.v['dist'] = self.F | ||
| 94 | self.v['prec'] = self.P | ||
| 95 | self.v['recl'] = self.R | ||
| 96 | |||
| 97 | def plotroc(self,d,plottitle=""): | ||
| 98 | import Gnuplot, Gnuplot.funcutils | ||
| 99 | gd = [] | ||
| 100 | fp = [] | ||
| 101 | for i in self.vlist: | ||
| 102 | gd.append(i['GD']) | ||
| 103 | fp.append(i['FP']) | ||
| 104 | d.append(Gnuplot.Data(fp, gd, with='linespoints', | ||
| 105 | title="%s %s" % (plottitle,i['mode']) )) | ||
| 106 | |||
| 107 | def plotplotroc(self,d,outplot=0,extension='ps'): | ||
| 108 | import Gnuplot, Gnuplot.funcutils | ||
| 109 | from sys import exit | ||
| 110 | g = Gnuplot.Gnuplot(debug=0, persist=1) | ||
| 111 | if outplot: | ||
| 112 | if extension == 'ps': ext, extension = '.ps' , 'postscript' | ||
| 113 | elif extension == 'png': ext, extension = '.png', 'png' | ||
| 114 | elif extension == 'svg': ext, extension = '.svg', 'svg' | ||
| 115 | else: exit("ERR: unknown plot extension") | ||
| 116 | g('set terminal %s' % extension) | ||
| 117 | g('set output \'roc-%s%s\'' % (outplot,ext)) | ||
| 118 | xmax = 30 #max(fp) | ||
| 119 | ymin = 50 | ||
| 120 | g('set xrange [0:%f]' % xmax) | ||
| 121 | g('set yrange [%f:100]' % ymin) | ||
| 122 | # grid set | ||
| 123 | g('set grid') | ||
| 124 | g('set xtics 0,5,%f' % xmax) | ||
| 125 | g('set ytics %f,5,100' % ymin) | ||
| 126 | g('set key 27,65') | ||
| 127 | #g('set format \"%g\"') | ||
| 128 | g.title(basename(self.datadir)) | ||
| 129 | g.xlabel('false positives (%)') | ||
| 130 | g.ylabel('correct detections (%)') | ||
| 131 | g.plot(*d) | ||
| 132 | |||
| 133 | def plotpr(self,d,plottitle=""): | ||
| 134 | import Gnuplot, Gnuplot.funcutils | ||
| 135 | x = [] | ||
| 136 | y = [] | ||
| 137 | for i in self.vlist: | ||
| 138 | x.append(i['prec']) | ||
| 139 | y.append(i['recl']) | ||
| 140 | d.append(Gnuplot.Data(x, y, with='linespoints', | ||
| 141 | title="%s %s" % (plottitle,i['mode']) )) | ||
| 142 | |||
| 143 | def plotplotpr(self,d,outplot=0,extension='ps'): | ||
| 144 | import Gnuplot, Gnuplot.funcutils | ||
| 145 | from sys import exit | ||
| 146 | g = Gnuplot.Gnuplot(debug=0, persist=1) | ||
| 147 | if outplot: | ||
| 148 | if extension == 'ps': ext, extension = '.ps' , 'postscript' | ||
| 149 | elif extension == 'png': ext, extension = '.png', 'png' | ||
| 150 | elif extension == 'svg': ext, extension = '.svg', 'svg' | ||
| 151 | else: exit("ERR: unknown plot extension") | ||
| 152 | g('set terminal %s' % extension) | ||
| 153 | g('set output \'pr-%s%s\'' % (outplot,ext)) | ||
| 154 | g.title(basename(self.datadir)) | ||
| 155 | g.xlabel('Recall (%)') | ||
| 156 | g.ylabel('Precision (%)') | ||
| 157 | g.plot(*d) | ||
| 158 | |||
| 159 | def plotfmeas(self,d,plottitle=""): | ||
| 160 | import Gnuplot, Gnuplot.funcutils | ||
| 161 | x,y = [],[] | ||
| 162 | for i in self.vlist: | ||
| 163 | x.append(i['thres']) | ||
| 164 | y.append(i['dist']) | ||
| 165 | d.append(Gnuplot.Data(x, y, with='linespoints', | ||
| 166 | title="%s %s" % (plottitle,i['mode']) )) | ||
| 167 | |||
| 168 | def plotplotfmeas(self,d,outplot="",extension='ps', title="F-measure"): | ||
| 169 | import Gnuplot, Gnuplot.funcutils | ||
| 170 | from sys import exit | ||
| 171 | g = Gnuplot.Gnuplot(debug=0, persist=1) | ||
| 172 | if outplot: | ||
| 173 | if extension == 'ps': terminal = 'postscript' | ||
| 174 | elif extension == 'png': terminal = 'png' | ||
| 175 | elif extension == 'svg': terminal = 'svg' | ||
| 176 | else: exit("ERR: unknown plot extension") | ||
| 177 | g('set terminal %s' % terminal) | ||
| 178 | g('set output \'fmeas-%s.%s\'' % (outplot,extension)) | ||
| 179 | g.xlabel('threshold \\delta') | ||
| 180 | g.ylabel('F-measure (%)') | ||
| 181 | g('set xrange [0:1.2]') | ||
| 182 | g('set yrange [0:100]') | ||
| 183 | g.title(basename(self.datadir)) | ||
| 184 | # grid set | ||
| 185 | #g('set grid') | ||
| 186 | #g('set xtics 0,5,%f' % xmax) | ||
| 187 | #g('set ytics %f,5,100' % ymin) | ||
| 188 | #g('set key 27,65') | ||
| 189 | #g('set format \"%g\"') | ||
| 190 | g.plot(*d) | ||
| 191 | |||
| 192 | def plotdiffs(self,d,plottitle=""): | ||
| 193 | import Gnuplot, Gnuplot.funcutils | ||
| 194 | v = self.v | ||
| 195 | l = v['l'] | ||
| 196 | mean = v['mean'] | ||
| 197 | smean = v['smean'] | ||
| 198 | amean = v['amean'] | ||
| 199 | samean = v['samean'] | ||
| 200 | val = [] | ||
| 201 | per = [0] * 100 | ||
| 202 | for i in range(0,100): | ||
| 203 | val.append(i*.001-.05) | ||
| 204 | for j in l: | ||
| 205 | if abs(j-val[i]) <= 0.001: | ||
| 206 | per[i] += 1 | ||
| 207 | total = v['Torig'] | ||
| 208 | for i in range(len(per)): per[i] /= total/100. | ||
| 209 | |||
| 210 | d.append(Gnuplot.Data(val, per, with='fsteps', | ||
| 211 | title="%s %s" % (plottitle,v['mode']) )) | ||
| 212 | #d.append('mean=%f,sigma=%f,eps(x) title \"\"'% (mean,smean)) | ||
| 213 | #d.append('mean=%f,sigma=%f,eps(x) title \"\"'% (amean,samean)) | ||
| 214 | |||
| 215 | |||
| 216 | def plotplotdiffs(self,d,outplot=0,extension='ps'): | ||
| 217 | import Gnuplot, Gnuplot.funcutils | ||
| 218 | from sys import exit | ||
| 219 | g = Gnuplot.Gnuplot(debug=0, persist=1) | ||
| 220 | if outplot: | ||
| 221 | if extension == 'ps': ext, extension = '.ps' , 'postscript' | ||
| 222 | elif extension == 'png': ext, extension = '.png', 'png' | ||
| 223 | elif extension == 'svg': ext, extension = '.svg', 'svg' | ||
| 224 | else: exit("ERR: unknown plot extension") | ||
| 225 | g('set terminal %s' % extension) | ||
| 226 | g('set output \'diffhist-%s%s\'' % (outplot,ext)) | ||
| 227 | g('eps(x) = 1./(sigma*(2.*3.14159)**.5) * exp ( - ( x - mean ) ** 2. / ( 2. * sigma ** 2. ))') | ||
| 228 | g.title(basename(self.datadir)) | ||
| 229 | g.xlabel('delay to hand-labelled onset (s)') | ||
| 230 | g.ylabel('% number of correct detections / ms ') | ||
| 231 | g('set xrange [-0.05:0.05]') | ||
| 232 | g('set yrange [0:50]') | ||
| 233 | g.plot(*d) | ||
| 234 | |||
| 235 | |||