ref: 5d1c070ffb32715850294ac0602e8f0effce7dd7
parent: 43938deb94e79f59bff176d423d100ed29f5a6c3
author: Paul Brossier <piem@altern.org>
date: Sat Mar 4 22:21:16 EST 2006
updated to new bench-pitch, fixed gettruth updated to new bench-pitch, fixed gettruth
--- a/python/aubio/bench/node.py
+++ b/python/aubio/bench/node.py
@@ -25,7 +25,7 @@
sys.exit(1)
if maxdepth >= 0: maxstring = " -maxdepth %d " % maxdepth
else: maxstring = ""
- cmd = '%s' * 5 % ('find ',datapath,maxstring,' -type ',filter)
+ cmd = '%s' * 6 % ('find ',datapath,maxstring,' -type ',filter, "| sort -n")
return runcommand(cmd)
def list_wav_files(datapath,maxdepth = -1):
--- a/python/aubio/task/pitch.py
+++ b/python/aubio/task/pitch.py
@@ -60,9 +60,9 @@
return False,False
elif floatpit:
try:
- self.truth = aubio_miditofreq(float(floatpit))
- print "ground truth found in filename:", self.truth
- tasksil = tasksilence(self.input)
+ self.truth = float(floatpit)
+ #print "ground truth found in filename:", self.truth
+ tasksil = tasksilence(self.input,params=self.params)
time,pitch =[],[]
while(tasksil.readsize==tasksil.params.hopsize):
tasksil()
@@ -83,10 +83,10 @@
time, pitch = [], []
for i in range(len(values)):
time.append(values[i][0])
- pitch.append(values[i][1])
+ pitch.append(aubio_freqtomidi(values[i][1]))
return time,pitch
- def eval(self,results):
+ def oldeval(self,results):
def mmean(l):
return sum(l)/max(float(len(l)),1)
@@ -104,23 +104,44 @@
med = percental(res,len(res)/2)
return self.truth, self.truth-med, self.truth-avg
- def neweval(self,results):
+ def eval(self,pitch,tol=0.9):
timet,pitcht = self.gettruth()
- for i in timet:
- print results[i]
- return self.truth, self.truth-med, self.truth-avg
+ pitch = [aubio_freqtomidi(i) for i in pitch]
+ for i in range(len(pitch)):
+ if pitch[i] == "nan" or pitch[i] == -1:
+ pitch[i] = -1
+ time = [ i*self.params.step for i in range(len(pitch)) ]
+ assert len(timet) == len(time)
+ assert len(pitcht) == len(pitch)
+ osil, esil, opit, epit, echr = 0, 0, 0, 0, 0
+ for i in range(len(pitcht)):
+ if pitcht[i] == -1: # currently silent
+ osil += 1 # count a silence
+ if pitch[i] == -1. or pitch[i] == "nan":
+ esil += 1 # found a silence
+ else:
+ opit +=1
+ if abs(pitcht[i] - pitch[i]) < tol:
+ epit += 1
+ echr += 1
+ elif abs(pitcht[i] - pitch[i]) % 12. < tol:
+ echr += 1
+ #else:
+ # print timet[i], pitcht[i], time[i], pitch[i]
+ #print "origsilence", "foundsilence", "origpitch", "foundpitch", "orig pitchroma", "found pitchchroma"
+ #print 100.*esil/float(osil), 100.*epit/float(opit), 100.*echr/float(opit)
+ return osil, esil, opit, epit, echr
def plot(self,pitch,wplot,oplots,outplot=None):
import numarray
import Gnuplot
- self.eval(pitch)
downtime = self.params.step*numarray.arange(len(pitch))
- oplots.append(Gnuplot.Data(downtime,pitch,with='lines',
+ oplots.append(Gnuplot.Data(downtime,pitch,with='linespoints',
title=self.params.pitchmode))
- def plotplot(self,wplot,oplots,outplot=None,multiplot = 1):
+ def plotplot(self,wplot,oplots,outplot=None,multiplot = 0):
from aubio.gnuplot import gnuplot_init, audio_to_array, make_audio_plot
import re
import Gnuplot
@@ -131,6 +152,7 @@
# check if ground truth exists
timet,pitcht = self.gettruth()
if timet and pitcht:
+ pitcht = [aubio_miditofreq(i) for i in pitcht]
oplots = [Gnuplot.Data(timet,pitcht,with='lines',
title='ground truth')] + oplots
--- a/python/test/bench/pitch/bench-pitch
+++ b/python/test/bench/pitch/bench-pitch
@@ -8,61 +8,104 @@
""" list of values to store per file """
valuenames = ['mode']
""" list of lists to store per file """
- valuelists = ['orig', 'mean', 'med']
+ valuelists = ['truth', 'osil', 'esil', 'opit', 'epit', 'echr',
+ 'Msil', 'Mpit', 'Mchr']
""" list of values to print per dir """
- printnames = [ 'mode']
+ printnames = [ 'mode', 'truth', 'Msil', 'Mpit', 'Mchr']
""" per dir """
- formats = {'mode': "%12s" , 'thres': "%5.4s",
- 'dist': "%5.4s", 'prec': "%5.4s", 'recl': "%5.4s",
- 'Ttrue': "%5.4s", 'Tfp': "%5.4s", 'Tfn': "%5.4s",
- 'Tm': "%5.4s", 'Td': "%5.4s",
- 'aTtrue':"%5.4s", 'aTfp': "%5.4s", 'aTfn': "%5.4s",
- 'aTm': "%5.4s", 'aTd': "%5.4s",
- 'mean': "%5.40s", 'smean': "%5.40s",
- 'amean': "%5.40s", 'samean': "%5.40s"}
+ formats = {'mode': "%12s" ,
+ 'truth': "%s",
+ 'osil': "%s", 'esil': "%s",
+ 'opit': "%s", 'epit': "%s", 'echr': "%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()
- orig,mean,med = filetask.eval(computed_data)
+ osil, esil, opit, epit, echr = filetask.eval(computed_data)
+ self.v['truth'].append(int(filetask.truth))
+ assert opit > 0
- self.v['orig'].append(orig)
- self.v['mean'].append(mean)
- self.v['med'].append(med)
+ 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
- d = []
self.modes = modes
self.pretty_titles()
+ d = []
for mode in self.modes:
self.params.pitchmode = mode
self.dir_eval_print()
- self.plotpitchtessiture(d,
- self.v['orig'],
- self.v['med'],
- plottitle=self.v['mode'],
- plotmode='points')
- #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\"')
- title = basename(self.datadir)
+ 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)):
+ allMsil[i] = allEsil[i]/float(allOsil[i])*100.
+ allMpit[i] = allEpit[i]/float(allOpit[i])*100.
+ allMchr[i] = allEchr[i]/float(allOpit[i])*100.
+
+ 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=title,
+ 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
@@ -72,18 +115,38 @@
import Gnuplot, Gnuplot.funcutils
d.append(Gnuplot.Data(lx, ly, with=plotmode, title="%s" % (plottitle) ))
- def plotplotpitchtessiture(self,d,plottitle='',outplot=0,extension=''):
+ 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 [50:2000]')
- g.plot(*d)
+ #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__":
@@ -93,13 +156,15 @@
if len(sys.argv) > 2:
for each in sys.argv[3:-1]: print each
modes = ['schmitt', 'yin', 'mcomb', 'fcomb']
- #modes = ['fcomb']
+ modes = ['schmitt', 'yin', 'fcomb']
params = taskparams()
- params.bufsize = 4096
- params.hopsize = params.bufsize/4
- params.silence = -1000.
- params.pitchsmooth = 50
+ params.bufsize = 2048
+ params.hopsize = params.bufsize/8
+ params.silence = -60.
+ params.pitchsmooth = 0
+ params.pitchmax = 20000
+ params.pitchmin = 20
benchpitch = benchpitch(datapath,params=params)
benchpitch.task = taskpitch