def test_instance_access(): labels = Labels() dummy_skeleton = Skeleton() dummy_video = Video(backend=MediaVideo) dummy_video2 = Video(backend=MediaVideo) for i in range(10): labels.append( LabeledFrame( dummy_video, frame_idx=i, instances=[Instance(dummy_skeleton), Instance(dummy_skeleton)], )) for i in range(10): labels.append( LabeledFrame( dummy_video2, frame_idx=i, instances=[ Instance(dummy_skeleton), Instance(dummy_skeleton), Instance(dummy_skeleton), ], )) assert len(labels.all_instances) == 50 assert len(list(labels.instances(video=dummy_video))) == 20 assert len(list(labels.instances(video=dummy_video2))) == 30
def test_save_labels_with_images(min_labels_slp, tmpdir): labels = Labels(min_labels_slp.labeled_frames) labels.append(LabeledFrame(video=labels.video, frame_idx=1)) labels.suggestions.append(SuggestionFrame(video=labels.video, frame_idx=2)) fn = os.path.join(tmpdir, "test_user_only.slp") labels.save( fn, with_images=True, embed_all_labeled=False, embed_suggested=False, ) assert Labels.load_file(fn).video.embedded_frame_inds == [0] fn = os.path.join(tmpdir, "test_all_labeled.slp") labels.save( fn, with_images=True, embed_all_labeled=True, embed_suggested=False, ) assert Labels.load_file(fn).video.embedded_frame_inds == [0, 1] fn = os.path.join(tmpdir, "test_suggested.slp") labels.save( fn, with_images=True, embed_all_labeled=False, embed_suggested=True, ) assert Labels.load_file(fn).video.embedded_frame_inds == [0, 2] fn = os.path.join(tmpdir, "test_all.slp") labels.save( fn, with_images=True, embed_all_labeled=True, embed_suggested=True, ) assert Labels.load_file(fn).video.embedded_frame_inds == [0, 1, 2]
def test_save_frame_data_hdf5(min_labels_slp, tmpdir): labels = Labels(min_labels_slp.labeled_frames) labels.append(LabeledFrame(video=labels.video, frame_idx=1)) labels.suggestions.append(SuggestionFrame(video=labels.video, frame_idx=2)) fn = os.path.join(tmpdir, "test_user_only.slp") labels.save_frame_data_hdf5( fn, format="png", user_labeled=True, all_labeled=False, suggested=False, ) assert Video.from_filename(fn, dataset="video0").embedded_frame_inds == [0] fn = os.path.join(tmpdir, "test_all_labeled.slp") labels.save_frame_data_hdf5( fn, format="png", user_labeled=False, all_labeled=True, suggested=False, ) assert Video.from_filename(fn, dataset="video0").embedded_frame_inds == [0, 1] fn = os.path.join(tmpdir, "test_suggested.slp") labels.save_frame_data_hdf5( fn, format="png", user_labeled=False, all_labeled=False, suggested=True, ) assert Video.from_filename(fn, dataset="video0").embedded_frame_inds == [2] fn = os.path.join(tmpdir, "test_all.slp") labels.save_frame_data_hdf5( fn, format="png", user_labeled=False, all_labeled=True, suggested=True, ) assert Video.from_filename(fn, dataset="video0").embedded_frame_inds == [0, 1, 2]
def simple_predictions(): video = Video.from_filename("video.mp4") skeleton = Skeleton() skeleton.add_node("a") skeleton.add_node("b") track_a = Track(0, "a") track_b = Track(0, "b") labels = Labels() instances = [] instances.append( PredictedInstance( skeleton=skeleton, score=2, track=track_a, points=dict(a=PredictedPoint(1, 1, score=0.5), b=PredictedPoint(1, 1, score=0.5)), )) instances.append( PredictedInstance( skeleton=skeleton, score=5, track=track_b, points=dict(a=PredictedPoint(1, 1, score=0.7), b=PredictedPoint(1, 1, score=0.7)), )) labeled_frame = LabeledFrame(video, frame_idx=0, instances=instances) labels.append(labeled_frame) instances = [] instances.append( PredictedInstance( skeleton=skeleton, score=3, track=track_a, points=dict(a=PredictedPoint(4, 5, score=1.5), b=PredictedPoint(1, 1, score=1.0)), )) instances.append( PredictedInstance( skeleton=skeleton, score=6, track=track_b, points=dict(a=PredictedPoint(6, 13, score=1.7), b=PredictedPoint(1, 1, score=1.0)), )) labeled_frame = LabeledFrame(video, frame_idx=1, instances=instances) labels.append(labeled_frame) return labels
def test_scalar_properties(): # Scalar dummy_video = Video(backend=MediaVideo) dummy_skeleton = Skeleton() dummy_instance = Instance(dummy_skeleton) dummy_frame = LabeledFrame(dummy_video, frame_idx=0, instances=[dummy_instance]) labels = Labels() labels.append(dummy_frame) assert labels.video == dummy_video assert labels.skeleton == dummy_skeleton # Empty labels = Labels() with pytest.raises(ValueError): labels.video with pytest.raises(ValueError): labels.skeleton # More than one video dummy_skeleton = Skeleton() labels = Labels() labels.append( LabeledFrame(Video(backend=MediaVideo), frame_idx=0, instances=[Instance(dummy_skeleton)])) labels.append( LabeledFrame(Video(backend=MediaVideo), frame_idx=0, instances=[Instance(dummy_skeleton)])) assert labels.skeleton == dummy_skeleton with pytest.raises(ValueError): labels.video # More than one skeleton dummy_video = Video(backend=MediaVideo) labels = Labels() labels.append( LabeledFrame(dummy_video, frame_idx=0, instances=[Instance(Skeleton())])) labels.append( LabeledFrame(dummy_video, frame_idx=1, instances=[Instance(Skeleton())])) assert labels.video == dummy_video with pytest.raises(ValueError): labels.skeleton
def test_label_mutability(): dummy_video = Video(backend=MediaVideo) dummy_skeleton = Skeleton() dummy_instance = Instance(dummy_skeleton) dummy_frame = LabeledFrame(dummy_video, frame_idx=0, instances=[dummy_instance]) labels = Labels() labels.append(dummy_frame) assert dummy_video in labels.videos assert dummy_video in labels assert dummy_skeleton in labels.skeletons assert dummy_skeleton in labels assert dummy_frame in labels.labeled_frames assert dummy_frame in labels assert (dummy_video, 0) in labels assert (dummy_video, 1) not in labels dummy_video2 = Video(backend=MediaVideo) dummy_skeleton2 = Skeleton(name="dummy2") dummy_instance2 = Instance(dummy_skeleton2) dummy_frame2 = LabeledFrame(dummy_video2, frame_idx=0, instances=[dummy_instance2]) assert dummy_video2 not in labels assert dummy_skeleton2 not in labels assert dummy_frame2 not in labels labels.append(dummy_frame2) assert dummy_video2 in labels assert dummy_frame2 in labels labels.remove_video(dummy_video2) assert dummy_video2 not in labels assert dummy_frame2 not in labels assert len(labels.find(dummy_video2)) == 0 assert len(labels) == 1 labels.append(LabeledFrame(dummy_video, frame_idx=0)) assert len(labels) == 1 dummy_frames = [LabeledFrame(dummy_video, frame_idx=i) for i in range(10)] dummy_frames2 = [LabeledFrame(dummy_video2, frame_idx=i) for i in range(10)] for f in dummy_frames + dummy_frames2: labels.append(f) assert len(labels) == 20 labels.remove_video(dummy_video2) assert len(labels) == 10 assert len(labels.find(dummy_video)) == 10 assert dummy_frame in labels assert all([label in labels for label in dummy_frames[1:]]) assert dummy_video2 not in labels assert len(labels.find(dummy_video2)) == 0 assert all([label not in labels for label in dummy_frames2]) labels.remove_video(dummy_video) assert len(labels.find(dummy_video)) == 0
def test_basic_suggestions(small_robot_mp4_vid): dummy_video = small_robot_mp4_vid dummy_skeleton = Skeleton() dummy_instance = Instance(dummy_skeleton) dummy_frame = LabeledFrame(dummy_video, frame_idx=0, instances=[dummy_instance]) labels = Labels() labels.append(dummy_frame) suggestions = VideoFrameSuggestions.suggest( labels=labels, params=dict(method="sample", per_video=13) ) labels.set_suggestions(suggestions) assert len(labels.get_video_suggestions(dummy_video)) == 13
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_deserialize_suggestions(small_robot_mp4_vid, tmpdir): dummy_video = small_robot_mp4_vid dummy_skeleton = Skeleton() dummy_instance = Instance(dummy_skeleton) dummy_frame = LabeledFrame(dummy_video, frame_idx=0, instances=[dummy_instance]) labels = Labels() labels.append(dummy_frame) suggestions = VideoFrameSuggestions.suggest( labels=labels, params=dict(method="sample", per_video=13) ) labels.set_suggestions(suggestions) filename = os.path.join(tmpdir, "new_suggestions.h5") Labels.save_file(filename=filename, labels=labels) new_suggestion_labels = Labels.load_file(filename) assert len(suggestions) == len(new_suggestion_labels.suggestions) assert [frame.frame_idx for frame in suggestions] == [ frame.frame_idx for frame in new_suggestion_labels.suggestions ]
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