music21.omr.evaluators

This module takes two XML files and displays the number of measures that differ between the two before and after running the combined correction models

OmrGroundTruthPair

class music21.omr.evaluators.OmrGroundTruthPair(omr=None, ground=None)

Object for making comparisons between an OMR score and the GroundTruth

Takes in a path to the OMR and a path to the groundTruth (or a pair of music21.stream.Score objects).

See below for examples.

OmrGroundTruthPair read/write properties

OmrGroundTruthPair.debug

Returns either the debug value set for this evaluator, or globalDebug

OmrGroundTruthPair methods

OmrGroundTruthPair.deleteCost(x)

define the deletion cost for x and y (1)

OmrGroundTruthPair.getDifferences()

Returns the total edit distance as an Int between the two scores

This function is based on James H. Martin’s minimum edit distance.

>>> omrPath = omr.correctors.K525omrShortPath
>>> ground = omr.correctors.K525groundTruthShortPath
>>> omrGTP = omr.evaluators.OmrGroundTruthPair(omr=omrPath, ground=ground)
>>> differences = omrGTP.getDifferences()
>>> differences
32
OmrGroundTruthPair.getGroundScore()

Returns a ScoreCorrector object of the Ground truth score

>>> omrPath = omr.correctors.K525omrShortPath
>>> ground = omr.correctors.K525groundTruthShortPath
>>> omrGTP = omr.evaluators.OmrGroundTruthPair(omr=omrPath, ground=ground)
>>> ssGT = omrGTP.getGroundScore()
>>> ssGT
<music21.omr.correctors.ScoreCorrector object at 0x...>
OmrGroundTruthPair.getOmrScore()

Returns a ScoreCorrector object of the OMR score. does not store it anywhere

>>> omrPath = omr.correctors.K525omrShortPath
>>> ground = omr.correctors.K525groundTruthShortPath
>>> omrGTP = omr.evaluators.OmrGroundTruthPair(omr=omrPath, ground=ground)
>>> ssOMR = omrGTP.getOmrScore()
>>> ssOMR
<music21.omr.correctors.ScoreCorrector object at 0x...>
OmrGroundTruthPair.hashAll()

store the Hashes for both scores.

OmrGroundTruthPair.insertCost(x)

define the insertion cost for x and y (1)

OmrGroundTruthPair.minEditDist(target, source)

Computes the min edit distance from target to source. Figure 3.25

OmrGroundTruthPair.parseAll()

Parse both scores.

OmrGroundTruthPair.substCost(x, y)

define the substitution cost for x and y (2 if x and y are unequal else 0)

Functions

music21.omr.evaluators.autoCorrelationBestMeasure(inputScore)

Essentially it’s the ratio of amount of rhythmic similarity within a piece, which gives an upper bound on what the omr.corrector.prior measure should be able to achieve for the flagged measures. If a piece has low rhythmic similarity in general, then there’s no way for a correct match to be found within the unflagged measures in the piece.

Returns a tuple of the total number of NON-flagged measures and the total number of those measures that have a rhythmic match.

Takes in a stream.Score.

>>> c = converter.parse(omr.correctors.K525omrShortPath)  # first 21 measures
>>> totalUnflagged, totalUnflaggedWithMatches = omr.evaluators.autoCorrelationBestMeasure(c)
>>> (totalUnflagged, totalUnflaggedWithMatches)
(71, 64)
>>> print( float(totalUnflaggedWithMatches) / totalUnflagged )
0.901...

Schoenberg has low autoCorrelation.

>>> c = corpus.parse('schoenberg/opus19/movement6')
>>> totalUnflagged, totalUnflaggedWithMatches = omr.evaluators.autoCorrelationBestMeasure(c)
>>> (totalUnflagged, totalUnflaggedWithMatches)
(18, 6)
>>> print( float(totalUnflaggedWithMatches) / totalUnflagged )
0.333...
music21.omr.evaluators.evaluateCorrectingModel(omrPath, groundTruthPath, debug=None, originalDifferences=None, runOnePart=False)

Get a dictionary showing the efficacy of the omr.correctors.ScoreCorrector on an OMR Score by comparing it to the GroundTruth.

Set debug to True to see a lot of intermediary steps.

>>> omrFilePath = omr.correctors.K525omrShortPath
>>> groundTruthFilePath = omr.correctors.K525groundTruthShortPath
>>> returnDict = omr.evaluators.evaluateCorrectingModel(omrFilePath, groundTruthFilePath)
>>> for name in sorted(list(returnDict.keys())):
...     (name, returnDict[name])
('newEditDistance', 20)
('numberOfFlaggedMeasures', 13)
('originalEditDistance', 32)
('totalNumberOfMeasures', 84)