def testDummy(self): # Create a single staff, and a single vertical which is the correct height # of a stem. The vertical has x = 20 and goes from struct = structure.Structure( staff_detector=staves_base.ComputedStaves( staves=[[[10, 50], [90, 50]]], staffline_distance=[12], staffline_thickness=2, staves_interpolated_y=[[50] * 100]), beams=beams.ComputedBeams(np.zeros((0, 2, 2))), verticals=verticals.ComputedVerticals( lines=[[[20, 38], [20, 38 + 12 * 4]]]), connected_components=components.ComputedComponents([])) stems = stems_module.Stems(struct) # Create a Page with Glyphs. input_page = musicscore_pb2.Page(system=[ musicscore_pb2.StaffSystem(staff=[ musicscore_pb2.Staff( staffline_distance=12, center_line=[ musicscore_pb2.Point(x=10, y=50), musicscore_pb2.Point(x=90, y=50) ], glyph=[ # Cannot have a stem because it's a flat. musicscore_pb2.Glyph(type=musicscore_pb2.Glyph.FLAT, x=15, y_position=-1), # On the right side of the stem, the correct distance away. musicscore_pb2.Glyph( type=musicscore_pb2.Glyph.NOTEHEAD_FILLED, x=25, y_position=-1), # Too high for the stem. musicscore_pb2.Glyph( type=musicscore_pb2.Glyph.NOTEHEAD_FILLED, x=25, y_position=4), # Too far right from the stem. musicscore_pb2.Glyph( type=musicscore_pb2.Glyph.NOTEHEAD_FILLED, x=35, y_position=-1), ]) ]) ]) page = stems.apply(input_page) self.assertFalse(page.system[0].staff[0].glyph[0].HasField("stem")) self.assertTrue(page.system[0].staff[0].glyph[1].HasField("stem")) self.assertEqual( page.system[0].staff[0].glyph[1].stem, musicscore_pb2.LineSegment(start=Point(x=20, y=38), end=Point(x=20, y=38 + 12 * 4))) self.assertFalse(page.system[0].staff[0].glyph[2].HasField("stem")) self.assertFalse(page.system[0].staff[0].glyph[3].HasField("stem"))
def _get_page(self, feed_dict=None, process_structure=True): """Returns the Page holding Glyphs for the page. Args: feed_dict: The feed dict to use for the TensorFlow graph. The image must be fed in. process_structure: If True, run the page_processors, which add staff locations and other structural information. If False, return a Page containing only Glyphs for each staff. Returns: A Page message holding Staff protos which have location information and detected Glyphs. """ # If structure is given, output all structural information in addition to # the Page message. structure_data = (_nested_ndarrays_to_tensors(self.structure.data) if self.structure else []) structure_data, glyphs = self.session.run( [structure_data, self.glyph_classifier.get_detected_glyphs()], feed_dict=feed_dict) computed_staves, computed_beams, computed_verticals, computed_components = ( structure_data) # Construct and return a computed Structure. computed_structure = structure_module.Structure( staves_base.ComputedStaves(*computed_staves), beams.ComputedBeams(*computed_beams), verticals.ComputedVerticals(*computed_verticals), components.ComputedComponents(*computed_components)) # The Page without staff location information. labels_page = self.glyph_classifier.glyph_predictions_to_page(glyphs) # Process the Page using the computed structure. if process_structure: processed_page = page_processors.process( labels_page, computed_structure, self.glyph_classifier.staffline_extractor) else: processed_page = labels_page return processed_page
def testDummy(self): # Create a single staff, and a single vertical which is the correct height # of a stem. The vertical has x = 20 and goes from struct = structure.Structure( staff_detector=staves_base.ComputedStaves( staves=[[[10, 50], [90, 50]], [[11, 150], [91, 150]], [[10, 250], [90, 250]], [[10, 350], [90, 350]]], staffline_distance=[12] * 4, staffline_thickness=2, staves_interpolated_y=[[50] * 100, [150] * 100, [250] * 100, [350] * 100]), beams=beams.ComputedBeams(np.zeros((0, 2, 2))), connected_components=components.ComputedComponents(np.zeros( (0, 5))), verticals=verticals.ComputedVerticals(lines=[ # Joins the first 2 staves. [[10, 50 - 12 * 2], [10, 150 + 12 * 2]], # Another barline, too close to the first one. [[12, 50 - 12 * 2], [12, 150 + 12 * 2]], # This barline is far enough, because the second barline was # skipped. [[13, 50 - 12 * 2], [13, 150 + 12 * 2]], # Single staff barlines are skipped. [[30, 50 - 12 * 2], [30, 50 + 12 * 2]], [[31, 150 - 12 * 2], [31, 150 + 12 * 2]], # Too close to a stem. [[70, 50 - 12 * 2], [70, 50 + 12 * 2]], # Too short. [[90, 50 - 12 * 2], [90, 50 + 12 * 2]], # Another barline which is kept. [[90, 50 - 12 * 2], [90, 150 + 12 * 2]], # Staff 1 has no barlines. # Staff 2 has 2 barlines. [[11, 350 - 12 * 2], [11, 350 + 12 * 2]], [[90, 350 - 12 * 2], [90, 350 + 12 * 2]], ])) barlines = barlines_module.Barlines(struct, close_barline_threshold=3) # Create a Page with Glyphs. input_page = musicscore_pb2.Page(system=[ musicscore_pb2.StaffSystem(staff=[ musicscore_pb2.Staff( staffline_distance=12, center_line=[ musicscore_pb2.Point(x=10, y=50), musicscore_pb2.Point(x=90, y=50) ], glyph=[ # Stem is close to the last vertical on the first staff, so # a barline will not be detected there. musicscore_pb2.Glyph( type=musicscore_pb2.Glyph.NOTEHEAD_FILLED, x=60, y_position=2, stem=musicscore_pb2.LineSegment( start=musicscore_pb2.Point(x=72, y=40), end=musicscore_pb2.Point(x=72, y=80))), ]), musicscore_pb2.Staff(staffline_distance=12, center_line=[ musicscore_pb2.Point(x=10, y=150), musicscore_pb2.Point(x=90, y=150) ]), musicscore_pb2.Staff(staffline_distance=12, center_line=[ musicscore_pb2.Point(x=10, y=250), musicscore_pb2.Point(x=90, y=250) ]), musicscore_pb2.Staff(staffline_distance=12, center_line=[ musicscore_pb2.Point(x=10, y=350), musicscore_pb2.Point(x=90, y=350) ]), ]) ]) page = barlines.apply(input_page) self.assertEqual(3, len(page.system)) self.assertEqual(2, len(page.system[0].staff)) self.assertItemsEqual([10, 13, 90], (bar.x for bar in page.system[0].bar)) self.assertEqual(1, len(page.system[1].staff)) self.assertEqual(0, len(page.system[1].bar)) self.assertEqual(1, len(page.system[2].staff)) self.assertEqual(2, len(page.system[2].bar)) self.assertItemsEqual([11, 90], (bar.x for bar in page.system[2].bar))