def test_merge_predictions(): dummy_video_a = Video.from_filename("foo.mp4") dummy_video_b = Video.from_filename("foo.mp4") dummy_skeleton_a = Skeleton() dummy_skeleton_a.add_node("node") dummy_skeleton_b = Skeleton() dummy_skeleton_b.add_node("node") dummy_instances_a = [] dummy_instances_a.append( Instance(skeleton=dummy_skeleton_a, points=dict(node=Point(1, 1))) ) dummy_instances_a.append( Instance(skeleton=dummy_skeleton_a, points=dict(node=Point(2, 2))) ) labels_a = Labels() labels_a.append( LabeledFrame(dummy_video_a, frame_idx=0, instances=dummy_instances_a) ) dummy_instances_b = [] dummy_instances_b.append( Instance(skeleton=dummy_skeleton_b, points=dict(node=Point(1, 1))) ) dummy_instances_b.append( PredictedInstance( skeleton=dummy_skeleton_b, points=dict(node=Point(3, 3)), score=1 ) ) labels_b = Labels() labels_b.append( LabeledFrame(dummy_video_b, frame_idx=0, instances=dummy_instances_b) ) # Frames have one redundant instance (perfect match) and all the # non-matching instances are different types (one predicted, one not). merged, extra_a, extra_b = Labels.complex_merge_between(labels_a, labels_b) assert len(merged[dummy_video_a]) == 1 assert len(merged[dummy_video_a][0]) == 1 # the predicted instance was merged assert not extra_a assert not extra_b
def test_complex_merge(): dummy_video_a = Video.from_filename("foo.mp4") dummy_video_b = Video.from_filename("foo.mp4") dummy_skeleton_a = Skeleton() dummy_skeleton_a.add_node("node") dummy_skeleton_b = Skeleton() dummy_skeleton_b.add_node("node") dummy_instances_a = [] dummy_instances_a.append( Instance(skeleton=dummy_skeleton_a, points=dict(node=Point(1, 1)))) dummy_instances_a.append( Instance(skeleton=dummy_skeleton_a, points=dict(node=Point(2, 2)))) labels_a = Labels() labels_a.append( LabeledFrame(dummy_video_a, frame_idx=0, instances=dummy_instances_a)) dummy_instances_b = [] dummy_instances_b.append( Instance(skeleton=dummy_skeleton_b, points=dict(node=Point(1, 1)))) dummy_instances_b.append( Instance(skeleton=dummy_skeleton_b, points=dict(node=Point(3, 3)))) labels_b = Labels() labels_b.append( LabeledFrame(dummy_video_b, frame_idx=0, instances=dummy_instances_b)) # conflict labels_b.append( LabeledFrame(dummy_video_b, frame_idx=1, instances=dummy_instances_b)) # clean merged, extra_a, extra_b = Labels.complex_merge_between(labels_a, labels_b) # Check that we have the cleanly merged frame assert dummy_video_a in merged assert len(merged[dummy_video_a]) == 1 # one merged frame assert len(merged[dummy_video_a][1]) == 2 # with two instances # Check that labels_a includes redundant and clean assert len(labels_a.labeled_frames) == 2 assert len(labels_a.labeled_frames[0].instances) == 1 assert labels_a.labeled_frames[0].instances[0].points[0].x == 1 assert len(labels_a.labeled_frames[1].instances) == 2 assert labels_a.labeled_frames[1].instances[0].points[0].x == 1 assert labels_a.labeled_frames[1].instances[1].points[0].x == 3 # Check that extra_a/b includes the appropriate conflicting instance assert len(extra_a) == 1 assert len(extra_b) == 1 assert len(extra_a[0].instances) == 1 assert len(extra_b[0].instances) == 1 assert extra_a[0].instances[0].points[0].x == 2 assert extra_b[0].instances[0].points[0].x == 3 # Check that objects were unified assert extra_a[0].video == extra_b[0].video # Check resolving the conflict using new Labels.finish_complex_merge(labels_a, extra_b) assert len(labels_a.labeled_frames) == 2 assert len(labels_a.labeled_frames[0].instances) == 2 assert labels_a.labeled_frames[0].instances[1].points[0].x == 3
def __init__(self, base_labels: Labels, new_labels: Labels, *args, **kwargs): """ Creates merge dialog and begins merging. Args: base_labels: The base dataset into which we're inserting data. new_labels: New dataset from which we're getting data to insert. Returns: None. """ super(MergeDialog, self).__init__(*args, **kwargs) self.base_labels = base_labels self.new_labels = new_labels merged, self.extra_base, self.extra_new = Labels.complex_merge_between( self.base_labels, self.new_labels ) merge_total = 0 merge_frames = 0 for vid_frame_list in merged.values(): # number of frames for this video merge_frames += len(vid_frame_list.keys()) # number of instances across frames for this video merge_total += sum((map(len, vid_frame_list.values()))) layout = QtWidgets.QVBoxLayout() merged_text = f"Cleanly merged {merge_total} instances" if merge_total: merged_text += f" across {merge_frames} frames" merged_text += "." merged_label = QtWidgets.QLabel(merged_text) layout.addWidget(merged_label) if merge_total: merge_table = MergeTable(merged) layout.addWidget(merge_table) if not self.extra_base: conflict_text = "There are no conflicts." else: conflict_text = "Merge conflicts:" conflict_label = QtWidgets.QLabel(conflict_text) layout.addWidget(conflict_label) if self.extra_base: conflict_table = ConflictTable( self.base_labels, self.extra_base, self.extra_new ) layout.addWidget(conflict_table) self.merge_method = QtWidgets.QComboBox() if self.extra_base: self.merge_method.addItem(USE_NEW_STRING) self.merge_method.addItem(USE_BASE_STRING) self.merge_method.addItem(USE_NEITHER_STRING) else: self.merge_method.addItem(CLEAN_STRING) layout.addWidget(self.merge_method) buttons = QtWidgets.QDialogButtonBox() buttons.addButton("Finish Merge", QtWidgets.QDialogButtonBox.AcceptRole) buttons.accepted.connect(self.finishMerge) layout.addWidget(buttons) self.setLayout(layout)