refactored testing suite file to no longer depend on file naming convention
0
.gitignore
vendored
Normal file → Executable file
0
DEPENDENCIES.md
Normal file → Executable file
0
LICENSE.md
Normal file → Executable file
0
README.md
Normal file → Executable file
0
dejavu.cnf.SAMPLE
Normal file → Executable file
0
dejavu/database_sql.py
Normal file → Executable file
0
dejavu/decoder.py
Normal file → Executable file
0
example.py
Normal file → Executable file
0
plots/accuracy.png
Normal file → Executable file
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
0
plots/blurred_lines_vertical.png
Normal file → Executable file
Before Width: | Height: | Size: 296 KiB After Width: | Height: | Size: 296 KiB |
0
plots/matching_time.png
Normal file → Executable file
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
0
plots/spectrogram_peaks.png
Normal file → Executable file
Before Width: | Height: | Size: 498 KiB After Width: | Height: | Size: 498 KiB |
0
plots/spectrogram_zoomed.png
Normal file → Executable file
Before Width: | Height: | Size: 405 KiB After Width: | Height: | Size: 405 KiB |
0
scripts/generate-test-files.py
Normal file → Executable file
72
scripts/results_dejavu.py → test.py
Normal file → Executable file
|
@ -11,6 +11,8 @@ import numpy as np
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import matplotlib.animation as animation
|
import matplotlib.animation as animation
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
|
from dejavu.decoder import path_to_songname
|
||||||
|
import ast
|
||||||
|
|
||||||
#####
|
#####
|
||||||
### Test files are in specific format:
|
### Test files are in specific format:
|
||||||
|
@ -21,42 +23,35 @@ DEFAULT_FS = 44100
|
||||||
DEFAULT_WINDOW_SIZE = 4096
|
DEFAULT_WINDOW_SIZE = 4096
|
||||||
DEFAULT_OVERLAP_RATIO = 0.5
|
DEFAULT_OVERLAP_RATIO = 0.5
|
||||||
|
|
||||||
#FIELD_SONG_ID = 'song_id'
|
|
||||||
FIELD_SONG_NAME = 'song_name'
|
FIELD_SONG_NAME = 'song_name'
|
||||||
FIELD_CONFIDENCE = 'confidence'
|
FIELD_CONFIDENCE = 'confidence'
|
||||||
FIELD_QUERY_TIME = 'match_time'
|
FIELD_QUERY_TIME = 'match_time'
|
||||||
FIELD_OFFSET = 'offset'
|
FIELD_OFFSET = 'offset'
|
||||||
|
|
||||||
# Parse options
|
# Parse options
|
||||||
|
|
||||||
usage = "usage: %prog [options] DEJAVU_PATH TEST_FOLDER"
|
usage = "usage: %prog [options] DEJAVU_PATH TEST_FOLDER"
|
||||||
parser = OptionParser(usage=usage, version="%prog 1.1")
|
parser = OptionParser(usage=usage, version="%prog 1.1")
|
||||||
|
|
||||||
parser.add_option("--no-log",
|
parser.add_option("--no-log",
|
||||||
action="store_false",
|
action="store_false",
|
||||||
dest="log",
|
dest="log",
|
||||||
default=True,
|
default=True,
|
||||||
help='Disables logging'
|
help='Disables logging')
|
||||||
)
|
|
||||||
parser.add_option("--log-file",
|
parser.add_option("--log-file",
|
||||||
dest="log_file",
|
dest="log_file",
|
||||||
default="results-compare.log",
|
default="results-compare.log",
|
||||||
metavar="LOG_FILE",
|
metavar="LOG_FILE",
|
||||||
help='Set the path and filename of the log file'
|
help='Set the path and filename of the log file')
|
||||||
)
|
|
||||||
parser.add_option("--test-seconds",
|
parser.add_option("--test-seconds",
|
||||||
action="append",
|
action="append",
|
||||||
dest="test_seconds",
|
dest="test_seconds",
|
||||||
default=[],
|
default=[],
|
||||||
metavar="Xsec",
|
metavar="Xsec",
|
||||||
help='Appends seconds to test suit'
|
help='Appends seconds to test suit')
|
||||||
)
|
|
||||||
parser.add_option("--results-folder",
|
parser.add_option("--results-folder",
|
||||||
action="store",
|
action="store",
|
||||||
dest="results_folder",
|
dest="results_folder",
|
||||||
metavar="FOLDER",
|
metavar="FOLDER",
|
||||||
help='Sets the path where the results are saved'
|
help='Sets the path where the results are saved')
|
||||||
)
|
|
||||||
|
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
@ -67,11 +62,12 @@ if len(options.test_seconds) == 0:
|
||||||
options.test_seconds = ['1sec','2sec','3sec','4sec','5sec','6sec','7sec','8sec','9sec','10sec']
|
options.test_seconds = ['1sec','2sec','3sec','4sec','5sec','6sec','7sec','8sec','9sec','10sec']
|
||||||
|
|
||||||
if options.log == True:
|
if options.log == True:
|
||||||
logging.basicConfig( filename=options.log_file, level=logging.DEBUG )
|
logging.basicConfig(filename=options.log_file, level=logging.DEBUG)
|
||||||
|
|
||||||
if options.results_folder != "" and options.results_folder[len(options.results_folder)-1] != '/':
|
if options.results_folder != "" and options.results_folder[len(options.results_folder) - 1] != '/':
|
||||||
options.results_folder += "/"
|
options.results_folder += "/"
|
||||||
|
|
||||||
|
# ensure results folder exists
|
||||||
try:
|
try:
|
||||||
os.stat(options.results_folder)
|
os.stat(options.results_folder)
|
||||||
except:
|
except:
|
||||||
|
@ -96,6 +92,11 @@ class DejavuTest (object):
|
||||||
# variable match results (yes, no, invalid)
|
# variable match results (yes, no, invalid)
|
||||||
self.result_match = [[0 for x in xrange(self.n_columns)] for x in xrange(self.n_lines)]
|
self.result_match = [[0 for x in xrange(self.n_columns)] for x in xrange(self.n_lines)]
|
||||||
|
|
||||||
|
print "columns:", self.n_columns
|
||||||
|
print "length of test files:", len(self.test_files)
|
||||||
|
print "lines:", self.n_lines
|
||||||
|
print "result_match matrix:", self.result_match
|
||||||
|
|
||||||
# variable match precision (if matched in the corrected time)
|
# variable match precision (if matched in the corrected time)
|
||||||
self.result_matching_times = [[0 for x in xrange(self.n_columns)] for x in xrange(self.n_lines)]
|
self.result_matching_times = [[0 for x in xrange(self.n_columns)] for x in xrange(self.n_lines)]
|
||||||
|
|
||||||
|
@ -107,38 +108,28 @@ class DejavuTest (object):
|
||||||
|
|
||||||
self.begin()
|
self.begin()
|
||||||
|
|
||||||
def get_column_id ( self,secs ):
|
def get_column_id (self, secs):
|
||||||
for i, sec in enumerate(self.test_seconds):
|
for i, sec in enumerate(self.test_seconds):
|
||||||
if secs == sec:
|
if secs == sec:
|
||||||
return i
|
return i
|
||||||
|
|
||||||
def get_line_id ( self,artist, song ):
|
def get_line_id (self, song):
|
||||||
elem = artist + " - " + song
|
|
||||||
|
|
||||||
for i, s in enumerate(self.test_songs):
|
for i, s in enumerate(self.test_songs):
|
||||||
if elem == s:
|
if song == s:
|
||||||
return i
|
return i
|
||||||
|
self.test_songs.append(song)
|
||||||
self.test_songs.append(elem)
|
return len(self.test_songs) - 1
|
||||||
return len(self.test_songs)-1
|
|
||||||
|
|
||||||
def begin(self):
|
def begin(self):
|
||||||
for f in self.test_files:
|
for f in self.test_files:
|
||||||
log_msg('--------------------------------------------------')
|
log_msg('--------------------------------------------------')
|
||||||
log_msg('file: %s' % f)
|
log_msg('file: %s' % f)
|
||||||
|
|
||||||
# get column
|
# get column
|
||||||
col = self.get_column_id(re.findall("[0-9]*sec",f)[0])
|
col = self.get_column_id(re.findall("[0-9]*sec",f)[0])
|
||||||
|
song = path_to_songname(f).split("_")[0] # format: XXXX_offset_length.mp3
|
||||||
# get artist and song
|
line = self.get_line_id (song)
|
||||||
artist = re.findall("^[^\-]+",f)
|
result = subprocess.check_output(["python", args[0] + "/dejavu.py", 'recognize', 'file', self.test_folder+"/"+f])
|
||||||
artist = artist[0].rstrip()
|
|
||||||
|
|
||||||
song = re.findall("\-[^\_]+",f)
|
|
||||||
song = song[0].lstrip("- ")
|
|
||||||
|
|
||||||
line = self.get_line_id ( artist, song)
|
|
||||||
|
|
||||||
result = subprocess.check_output([args[0], 'recognize', 'file', self.test_folder+"/"+f])
|
|
||||||
log_msg('RESULT: %s' % result.strip() )
|
log_msg('RESULT: %s' % result.strip() )
|
||||||
|
|
||||||
if result.strip() == "None":
|
if result.strip() == "None":
|
||||||
|
@ -155,20 +146,14 @@ class DejavuTest (object):
|
||||||
result = result.replace("\':", '":')
|
result = result.replace("\':", '":')
|
||||||
result = result.replace("\',", '",')
|
result = result.replace("\',", '",')
|
||||||
|
|
||||||
result = json.loads(result)
|
# which song did we predict?
|
||||||
|
result = ast.literal_eval(result)
|
||||||
artist_result = re.findall("^[^\-]+",result[FIELD_SONG_NAME])
|
print "result", result
|
||||||
artist_result = artist_result[0].rstrip()
|
song_result = result["song_name"]
|
||||||
|
|
||||||
song_result = re.findall("\-[^\_]+",result[FIELD_SONG_NAME])
|
|
||||||
song_result = song_result[0].lstrip("- ")
|
|
||||||
|
|
||||||
log_msg('artist: %s' % artist)
|
|
||||||
log_msg('artist_result: %s' % artist_result)
|
|
||||||
log_msg('song: %s' % song)
|
log_msg('song: %s' % song)
|
||||||
log_msg('song_result: %s' % song_result)
|
log_msg('song_result: %s' % song_result)
|
||||||
|
|
||||||
if artist_result != artist or song_result != song:
|
if song_result != song:
|
||||||
log_msg('invalid match')
|
log_msg('invalid match')
|
||||||
self.result_match[line][col] = 'invalid'
|
self.result_match[line][col] = 'invalid'
|
||||||
self.result_matching_times[line][col] = 0
|
self.result_matching_times[line][col] = 0
|
||||||
|
@ -176,6 +161,7 @@ class DejavuTest (object):
|
||||||
self.result_match_confidence[line][col] = 0
|
self.result_match_confidence[line][col] = 0
|
||||||
else:
|
else:
|
||||||
log_msg('correct match')
|
log_msg('correct match')
|
||||||
|
print self.result_match
|
||||||
self.result_match[line][col] = 'yes'
|
self.result_match[line][col] = 'yes'
|
||||||
self.result_query_duration[line][col] = round(result[FIELD_QUERY_TIME],3)
|
self.result_query_duration[line][col] = round(result[FIELD_QUERY_TIME],3)
|
||||||
self.result_match_confidence[line][col] = result[FIELD_CONFIDENCE]
|
self.result_match_confidence[line][col] = result[FIELD_CONFIDENCE]
|