From: Paul Brossier Date: Thu, 20 Apr 2006 12:51:40 +0000 (+0000) Subject: update bench-pitch-isolated X-Git-Tag: 0.4.0-beta1~1237 X-Git-Url: https://git.aubio.org/?a=commitdiff_plain;h=b965fb19a65e87ca5154c55b685a314fed631997;p=aubio.git update bench-pitch-isolated update bench-pitch-isolated --- diff --git a/python/test/bench/pitch/bench-pitch b/python/test/bench/pitch/bench-pitch deleted file mode 100755 index fadce94f..00000000 --- a/python/test/bench/pitch/bench-pitch +++ /dev/null @@ -1,191 +0,0 @@ -#! /usr/bin/python - -from aubio.bench.node import * -from aubio.task import * - -class benchpitch(bench): - - """ list of values to store per file """ - valuenames = ['mode'] - """ list of lists to store per file """ - valuelists = ['truth', 'osil', 'esil', 'opit', 'epit', 'echr', - 'Msil', 'Mpit', 'Mchr', - 'TotalPit', 'TotalPit', 'TotalChr' ] - """ list of values to print per dir """ - printnames = [ 'mode', 'MinPit', 'MaxPit', 'TotalSil', 'TotalPit', 'TotalChr'] - - """ per dir """ - formats = {'mode': "%12s" , - 'truth': "%s", - 'osil': "%s", 'esil': "%s", - 'opit': "%s", 'epit': "%s", 'echr': "%s", - 'TotalPit': "%s", 'TotalSil': "%s", 'TotalChr': "%s", - 'MinPit': "%s", 'MaxPit': "%s", - 'Msil': "%s", 'Mpit': "%s", 'Mchr': "%s"} - - def dir_eval(self): - """ evaluate statistical data over the directory """ - v = self.v - v['mode'] = self.params.pitchmode - - def file_exec(self,input,output): - filetask = self.task(input,params=self.params) - computed_data = filetask.compute_all() - osil, esil, opit, epit, echr = filetask.eval(computed_data,tol=0.5) - self.v['truth'].append(int(filetask.truth)) - assert opit > 0 - - self.v['osil'].append(osil) - self.v['esil'].append(esil) - self.v['opit'].append(opit) - self.v['epit'].append(epit) - self.v['echr'].append(echr) - - self.v['Msil'].append(esil/float(osil)*100.) - self.v['Mpit'].append(epit/float(opit)*100.) - self.v['Mchr'].append(echr/float(opit)*100.) - #print results#, computed_data - #print input, results, results - float(input.split('.')[-2]) - - def run_bench(self,modes=['schmitt']): - from os.path import basename - self.modes = modes - self.pretty_titles() - d = [] - for mode in self.modes: - self.params.pitchmode = mode - self.dir_exec() - self.dir_eval() - truth = [i for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allOsil = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allEsil = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allOpit = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allEpit = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allEchr = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allMsil = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allMpit = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - allMchr = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] - for i in range(len(self.v['truth'])): - allOsil[self.v['truth'][i]-min(self.v['truth'])] += self.v['osil'][i] - allEsil[self.v['truth'][i]-min(self.v['truth'])] += self.v['esil'][i] - allOpit[self.v['truth'][i]-min(self.v['truth'])] += self.v['opit'][i] - allEpit[self.v['truth'][i]-min(self.v['truth'])] += self.v['epit'][i] - allEchr[self.v['truth'][i]-min(self.v['truth'])] += self.v['echr'][i] - for i in range(len(truth)): - allOsil[i] = max(1,allOsil[i]) - allOpit[i] = max(1,allOpit[i]) - allMsil[i] = allEsil[i]/float(allOsil[i])*100. - allMpit[i] = allEpit[i]/float(allOpit[i])*100. - allMchr[i] = allEchr[i]/float(allOpit[i])*100. - self.v['TotalSil'] = sum(allMsil)/len(truth) - self.v['TotalPit'] = sum(allMpit)/len(truth) - self.v['TotalChr'] = sum(allMchr)/len(truth) - self.v['MinPit'] = min(truth) - self.v['MaxPit'] = max(truth) - self.pretty_print() - - plot = [] - self.plotpitchtessiture(plot, - truth, - allMpit, - plottitle="%s %s" % (self.v['mode'],self.params.bufsize), - plotmode='lines') - self.plotpitchtessiture(plot, - truth, - allMchr, - plottitle="%s %s" % (self.v['mode'],"%12"), - plotmode='lines') - """ - self.plotpitchtessiture(plot, - truth, - allMsil, - plottitle="%s %s" % (self.v['mode'],"sil"), - plotmode='lines') - """ - title = basename(self.datadir) - d.append(plot) - outplot = "_-_".join(('pitchtessiture',title)) - self.xmin = 20. #min(self.v['truth']) - self.xmax = 110. #max(self.v['truth']) - for ext in ('ps','png','svg',''): - self.plotplotpitchtessiture(d, - plottitle="".join(['Performance against MIDI Note number (', - title, - ", %s" % len(self.sndlist), " samples)"]), - outplot=outplot, - extension=ext) - #d.append('beta = .25,orig(x) title \"-2 octave\"') - #d.append('beta = .50,orig(x) title \"-1 octave\"') - #d.append('beta = 1.0,orig(x) title \"original\"') - #d.append('beta = 2.0,orig(x) title \"+1 octave\"') - - """ - Plot functions - """ - - def plotpitchtessiture(self,d,lx,ly,plottitle="",plotmode='linespoints'): - import Gnuplot, Gnuplot.funcutils - d.append(Gnuplot.Data(lx, ly, with=plotmode, title="%s" % (plottitle) )) - - def plotplotpitchtessiture(self,d,plottitle='',outplot=0,extension='',multiplot=1): - from aubio.gnuplot import gnuplot_create - g = gnuplot_create(outplot=outplot,extension=extension) - #g.title(plottitle) - #g('orig(x) = beta*x') - #g.xlabel('original pitch (Hz)') - #g.ylabel('detected pitch (Hz)') - #g('set key left top') - #g('set log xy') - #g('set xrange [50:2000]') - g('set yrange [0:100]') - #g.plot(*d) - if multiplot: - g('set multiplot') - for i in range(len(d)): - # plot onset detection functions - g('set size 1,%f' % ( 1.0/float(len(d)) ) ) - g('set origin 0,%f' % ( 1.0*float(len(d)-i-1)/float(len(d)) ) ) - # erase axis - g('set border 3') - g('set xtics nomirror') - g('set ytics nomirror') - g('set key left top') - g('set xrange [%f:%f]' % (self.xmin,self.xmax)) #(self.xmax - (self.xmax-self.xmin)*5./4.,self.xmax)) - #g.ylabel('%Correct detections') - if i == len(d)-1: - g.xlabel(plottitle) - g.plot(*d[i]) - g('unset title') - g('unset multiplot') - else: - g.plot(*d) - - -if __name__ == "__main__": - import sys - if len(sys.argv) > 1: datapath = sys.argv[1] - else: print "error: a path is required"; sys.exit(1) - if len(sys.argv) > 2: - for each in sys.argv[3:-1]: print each - modes = ['schmitt', 'yin', 'yinfft', 'mcomb', 'fcomb'] - - params = taskparams() - params.bufsize = 2048 #4096 - params.hopsize = 256 - params.silence = -70. - params.pitchsmooth = 0 - params.pitchmax = 20000 - params.pitchmin = 20 - params.pitchyinfft = 0.95 - benchpitch = benchpitch(datapath,params=params) - benchpitch.task = taskpitch - - #benchpitch.titles = [ 'mode', 'thres', 'avg', 'avgdist' ] - #benchpitch.formats = ["%12s" , "| %6s", "| %6s", "| %6s", "| %6s", "| %6s" ] - try: - benchpitch.run_bench(modes=modes) - except KeyboardInterrupt: - print "Interrupted by user" - sys.exit(1) - - sys.exit(0) diff --git a/python/test/bench/pitch/bench-pitch-isolated b/python/test/bench/pitch/bench-pitch-isolated new file mode 100755 index 00000000..a8ea613d --- /dev/null +++ b/python/test/bench/pitch/bench-pitch-isolated @@ -0,0 +1,190 @@ +#! /usr/bin/python + +from aubio.bench.node import * +from aubio.task import * + +class benchpitch(bench): + + """ list of values to store per file """ + valuenames = ['mode'] + """ list of lists to store per file """ + valuelists = ['truth', 'osil', 'esil', 'opit', 'epit', 'echr', + 'Msil', 'Mpit', 'Mchr', + 'TotalPit', 'TotalPit', 'TotalChr' ] + """ list of values to print per dir """ + printnames = [ 'mode', 'MinPit', 'MaxPit', 'TotalSil', 'TotalPit', 'TotalChr'] + + """ per dir """ + formats = {'mode': "%12s" , + 'truth': "%s", + 'osil': "%s", 'esil': "%s", + 'opit': "%s", 'epit': "%s", 'echr': "%s", + 'TotalPit': "%s", 'TotalSil': "%s", 'TotalChr': "%s", + 'MinPit': "%s", 'MaxPit': "%s", + 'Msil': "%s", 'Mpit': "%s", 'Mchr': "%s"} + + def dir_eval(self): + """ evaluate statistical data over the directory """ + v = self.v + v['mode'] = self.params.pitchmode + + def file_exec(self,input,output): + filetask = self.task(input,params=self.params) + computed_data = filetask.compute_all() + osil, esil, opit, epit, echr = filetask.eval(computed_data,tol=0.5) + self.v['truth'].append(int(filetask.truth)) + assert opit > 0 + + self.v['osil'].append(osil) + self.v['esil'].append(esil) + self.v['opit'].append(opit) + self.v['epit'].append(epit) + self.v['echr'].append(echr) + + self.v['Msil'].append(esil/float(osil)*100.) + self.v['Mpit'].append(epit/float(opit)*100.) + self.v['Mchr'].append(echr/float(opit)*100.) + #print results#, computed_data + #print input, results, results - float(input.split('.')[-2]) + + def run_bench(self,modes=['schmitt'],multiplot=0): + from os.path import basename + self.modes = modes + self.pretty_titles() + d = [] + for mode in self.modes: + self.params.pitchmode = mode + self.dir_exec() + self.dir_eval() + truth = [i for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allOsil = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allEsil = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allOpit = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allEpit = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allEchr = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allMsil = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allMpit = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + allMchr = [0 for i in range(min(self.v['truth']),max(self.v['truth'])+1)] + for i in range(len(self.v['truth'])): + allOsil[self.v['truth'][i]-min(self.v['truth'])] += self.v['osil'][i] + allEsil[self.v['truth'][i]-min(self.v['truth'])] += self.v['esil'][i] + allOpit[self.v['truth'][i]-min(self.v['truth'])] += self.v['opit'][i] + allEpit[self.v['truth'][i]-min(self.v['truth'])] += self.v['epit'][i] + allEchr[self.v['truth'][i]-min(self.v['truth'])] += self.v['echr'][i] + for i in range(len(truth)): + allOsil[i] = max(1,allOsil[i]) + allOpit[i] = max(1,allOpit[i]) + allMsil[i] = allEsil[i]/float(allOsil[i])*100. + allMpit[i] = allEpit[i]/float(allOpit[i])*100. + allMchr[i] = allEchr[i]/float(allOpit[i])*100. + self.v['TotalSil'] = sum(allMsil)/len(truth) + self.v['TotalPit'] = sum(allMpit)/len(truth) + self.v['TotalChr'] = sum(allMchr)/len(truth) + self.v['MinPit'] = min(truth) + self.v['MaxPit'] = max(truth) + self.pretty_print() + + plot = [] + self.plotpitchtessiture(plot, + truth, + allMpit, + plottitle="%s %s" % (self.v['mode'],self.params.bufsize), + plotmode='lines') + """ + self.plotpitchtessiture(plot, + truth, + allMchr, + plottitle="%s %s" % (self.v['mode'],"%12"), + plotmode='lines') + self.plotpitchtessiture(plot, + truth, + allMsil, + plottitle="%s %s" % (self.v['mode'],"sil"), + plotmode='lines') + """ + title = basename(self.datadir) + if multiplot: + d.append(plot) + else: + d += plot + outplot = "_-_".join(('pitchtessiture',title)) + self.xmin = min(self.v['truth']) #20. + self.xmax = max(self.v['truth']) + for ext in ('ps','png','svg'): #,''): + self.plotplotpitchtessiture(d, + plottitle="".join(['Performance against MIDI Note number (', + title, + ", %s" % len(self.sndlist), " samples)"]), + outplot=outplot, + extension=ext,multiplot=multiplot) + #d.append('beta = .25,orig(x) title \"-2 octave\"') + #d.append('beta = .50,orig(x) title \"-1 octave\"') + #d.append('beta = 1.0,orig(x) title \"original\"') + #d.append('beta = 2.0,orig(x) title \"+1 octave\"') + + """ + Plot functions + """ + + def plotpitchtessiture(self,d,lx,ly,plottitle="",plotmode='linespoints'): + import Gnuplot, Gnuplot.funcutils + d.append(Gnuplot.Data(lx, ly, with=plotmode, title="%s" % (plottitle) )) + + def plotplotpitchtessiture(self,d,plottitle='',outplot=0,extension='',multiplot=1): + from aubio.gnuplot import gnuplot_create + g = gnuplot_create(outplot=outplot,extension=extension) + #g.title(plottitle) + #g('orig(x) = beta*x') + g.title(plottitle) + g('set yrange [50:100]') + # erase axis + g('set xrange [%f:%f]' % (self.xmin,self.xmax)) #(self.xmax - (self.xmax-self.xmin)*5./4.,self.xmax)) + #g.plot(*d) + g('set border 3') + g('set xtics nomirror') + g('set ytics nomirror') + g('set key bottom') + if multiplot: + g('set multiplot') + for i in range(len(d)): + # plot onset detection functions + g('set size 1,%f' % ( 1.0/float(len(d)) ) ) + g('set origin 0,%f' % ( 1.0*float(len(d)-i-1)/float(len(d)) ) ) + #g.ylabel('%Correct detections') + g('set xrange [%f:%f]' % (self.xmin,self.xmax)) #(self.xmax - (self.xmax-self.xmin)*5./4.,self.xmax)) + g.plot(*d[i]) + g('unset title') + g('unset multiplot') + else: + g.plot(*d) + + +if __name__ == "__main__": + import sys + if len(sys.argv) > 1: datapath = sys.argv[1] + else: print "error: a path is required"; sys.exit(1) + if len(sys.argv) > 2: + for each in sys.argv[3:-1]: print each + modes = ['schmitt', 'yin', 'yinfft', 'mcomb', 'fcomb'] + #modes = ['mcomb'] + + params = taskparams() + params.bufsize = 2048 # 4096 + params.hopsize = 256 + params.silence = -60. + params.pitchsmooth = 0 + params.pitchmax = 20000 + params.pitchmin = 20 + params.pitchyinfft = 0.95 + benchpitch = benchpitch(datapath,params=params) + benchpitch.task = taskpitch + + #benchpitch.titles = [ 'mode', 'thres', 'avg', 'avgdist' ] + #benchpitch.formats = ["%12s" , "| %6s", "| %6s", "| %6s", "| %6s", "| %6s" ] + try: + benchpitch.run_bench(modes=modes) + except KeyboardInterrupt: + print "Interrupted by user" + sys.exit(1) + + sys.exit(0)