def test_infers_properties_from_mono_images(self): images = [make_image(idx, depth=None) for idx in range(10)] collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL) self.assertEqual(images[0].image_group, collection.image_group) self.assertFalse(collection.is_depth_available) self.assertTrue(collection.is_normals_available) self.assertFalse(collection.is_stereo_available) self.assertTrue(collection.is_labels_available) self.assertFalse(collection.is_masks_available) self.assertEqual(collection.camera_intrinsics, images[0].metadata.intrinsics) self.assertIsNone(collection.stereo_offset) self.assertIsNone(collection.right_camera_intrinsics) images = [ make_image(idx, normals=None, metadata=make_metadata( idx, labelled_objects=[ imeta.MaskedObject( ('class_1', ), 152, 239, 14, 78, tf.Transform(location=(123, -45, 23), rotation=(0.5, 0.23, 0.1)), 'LabelledObject-18569', np.random.choice((True, False), size=(78, 14))) ])) for idx in range(10) ] collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL) self.assertTrue(collection.is_depth_available) self.assertFalse(collection.is_normals_available) self.assertFalse(collection.is_stereo_available) self.assertTrue(collection.is_labels_available) self.assertTrue(collection.is_masks_available) self.assertEqual(collection.camera_intrinsics, images[0].metadata.intrinsics) self.assertIsNone(collection.stereo_offset) self.assertIsNone(collection.right_camera_intrinsics)
def test_framerate_returns_average_time_interval_between_frames(self): images = [make_image(idx, depth=None) for idx in range(10)] collection = ic.ImageCollection( images=images, timestamps=[3.2 + 0.25 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL) self.assertEqual(0.25, collection.average_timestep)
def test_stores_and_loads_mono_kwargs(self): images = [] for idx in range(10): img = make_image(idx) img.save() images.append(img) collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL, is_depth_available=True, is_normals_available=True, is_stereo_available=False, is_labels_available=True, is_masks_available=False, camera_intrinsics=images[0].metadata.intrinsics, dataset='TestSequences', sequence_name='Sequence1', trajectory_id='simple-motion') collection.save() # Load all the entities all_entities = list(ic.ImageCollection.objects.all()) self.assertGreaterEqual(len(all_entities), 1) self.assertEqual(all_entities[0], collection) all_entities[0].delete()
def setUp(self): self.path_manager = PathManager(['~'], '~/tmp') mock_importer.reset() image = mock_types.make_image() self.image_collection = ImageCollection( images=[image], timestamps=[1.2], sequence_type=ImageSequenceType.SEQUENTIAL)
def make_and_store_image(image_group: str): """ Make an image, and then let it go out of scope, so it needs to be loaded. :return: """ image = make_image(image_group=image_group) image.save() return image.pk
def test_chooses_a_default_trajectory_id(self): images = [make_image(idx, depth=None) for idx in range(10)] collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL, dataset='TestData', sequence_name='Sequence1') self.assertEqual('TestData:Sequence1', collection.trajectory_id)
def test_get_columns_returns_column_list(self): images = [make_image(idx, depth=None) for idx in range(10)] collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL) self.assertEqual({ 'dataset', 'sequence_name', 'trajectory_id', }, collection.get_columns())
def make_image_collection(length, **kwargs): images = [make_image(idx) for idx in range(length)] timestamps = [idx * 0.9 for idx in range(len(images))] for image in images: image.save() image_collection = ImageCollection( images=images, timestamps=timestamps, sequence_type=ImageSequenceType.SEQUENTIAL, **kwargs) image_collection.save() return image_collection
def setUpClass(cls): dbconn.connect_to_test_db() dbconn.setup_image_manager() cls.image = mock_types.make_image() cls.image.save() cls.image_collection = ImageCollection( images=[cls.image], timestamps=[1.2], sequence_type=ImageSequenceType.SEQUENTIAL) cls.image_collection.save()
def test_get_properties_returns_only_requested_columns_that_exist(self): dataset = 'my dataset' sequence_name = 'this is a sequence' trajectory_id = 'trajectory 6' images = [make_image(idx, depth=None) for idx in range(10)] collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL, dataset=dataset, sequence_name=sequence_name, trajectory_id=trajectory_id) self.assertEqual({'dataset': dataset}, collection.get_properties({'dataset', 'not_a_column'}))
def test_iterates_over_timestamps_and_images_in_timestamp_order(self): pairs = [(10 - 0.8 * idx, make_image(idx, depth=None)) for idx in range(10)] collection = ic.ImageCollection( images=[pair[1] for pair in pairs], timestamps=[pair[0] for pair in pairs], sequence_type=ImageSequenceType.SEQUENTIAL) pairs = sorted(pairs, key=itemgetter(0)) prev_timestamp = None for idx, (timestamp, image) in enumerate(collection): self.assertEqual(pairs[idx][0], timestamp) self.assertEqual(pairs[idx][1], image) if prev_timestamp is not None: self.assertGreater(timestamp, prev_timestamp) prev_timestamp = timestamp
def test_get_properties_returns_the_value_of_all_columns(self): dataset = 'my dataset' sequence_name = 'this is a sequence' trajectory_id = 'trajectory 6' images = [make_image(idx, depth=None) for idx in range(10)] collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL, dataset=dataset, sequence_name=sequence_name, trajectory_id=trajectory_id) self.assertEqual( { 'dataset': dataset, 'sequence_name': sequence_name, 'trajectory_id': trajectory_id }, collection.get_properties())
def make_image_collection(length=3) -> ImageCollection: """ A quick helper for making and saving image collections :param length: :return: """ images = [] timestamps = [] for idx in range(length): image = mock_types.make_image() image.save() images.append(image) timestamps.append(idx * 0.9) image_collection = ImageCollection( images=images, timestamps=timestamps, sequence_type=ImageSequenceType.SEQUENTIAL) image_collection.save() return image_collection
def test_stores_and_loads_mono_args(self): images = [] for idx in range(10): img = make_image(idx) img.save() images.append(img) collection = ic.ImageCollection(images, [1.1 * idx for idx in range(10)], ImageSequenceType.SEQUENTIAL, True, True, False, True, False, images[0].metadata.intrinsics) collection.save() # Load all the entities all_entities = list(ic.ImageCollection.objects.all()) self.assertGreaterEqual(len(all_entities), 1) self.assertEqual(all_entities[0], collection) all_entities[0].delete()
def test_required_fields_are_required(self): images = [] for idx in range(10): img = make_image(idx) img.save() images.append(img) # Missing sequence type collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)]) with self.assertRaises(ValidationError): collection.save() # Missing images collection = ic.ImageCollection( timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL) with self.assertRaises(ValidationError): collection.save() # Missing timestamps collection = ic.ImageCollection( images=images, sequence_type=ImageSequenceType.SEQUENTIAL) with self.assertRaises(ValidationError): collection.save() # blank image_group collection = ic.ImageCollection( images=images, timestamps=[1.1 * idx for idx in range(10)], sequence_type=ImageSequenceType.SEQUENTIAL, ) collection.image_group = None # Explicitly clear because it is inferred by the constructor with self.assertRaises(ValidationError): collection.save() # Empty images and timestamps collection = ic.ImageCollection( images=[], timestamps=[], sequence_type=ImageSequenceType.SEQUENTIAL) with self.assertRaises(ValidationError): collection.save()
def test_constructor_works_with_mixed_args(self): images = [make_image(idx, depth=None) for idx in range(10)] arguments = [('images', images), ('timestamps', [1.1 * idx for idx in range(10)]), ('sequence_type', ImageSequenceType.SEQUENTIAL), ('image_group', images[0].image_group), ('is_depth_available', True), ('is_normals_available', False), ('is_stereo_available', False), ('is_labels_available', False), ('is_masks_available', True), ('camera_intrinsics', images[0].metadata.intrinsics)] for idx in range(len(arguments) + 1): collection = ic.ImageCollection( *(v for _, v in arguments[:idx]), **{k: v for k, v in arguments[idx:]}) # Check it got assigned correctly for name, value in arguments: self.assertEqual(value, getattr(collection, name))