def test_read_with_extent(self): # Extent only includes the first box. extent = Box.make_square(0, 0, 3) config = ObjectDetectionLabelSourceConfig( vector_source=GeoJSONVectorSourceConfig( uri=self.file_path, default_class_id=None)) source = config.build(self.class_config, self.crs_transformer, extent, self.tmp_dir.name) labels = source.get_labels() npboxes = np.array([[0., 0., 2., 2.]]) class_ids = np.array([0]) scores = np.array([0.9]) expected_labels = ObjectDetectionLabels( npboxes, class_ids, scores=scores) labels.assert_equal(expected_labels) # Extent includes both boxes, but clips the second. extent = Box.make_square(0, 0, 3.9) config = ObjectDetectionLabelSourceConfig( vector_source=GeoJSONVectorSourceConfig( uri=self.file_path, default_class_id=None)) source = config.build(self.class_config, self.crs_transformer, extent, self.tmp_dir.name) labels = source.get_labels() npboxes = np.array([[0., 0., 2., 2.], [2., 2., 3.9, 3.9]]) class_ids = np.array([0, 1]) scores = np.array([0.9, 0.9]) expected_labels = ObjectDetectionLabels( npboxes, class_ids, scores=scores) labels.assert_equal(expected_labels)
def get_vector_scene(self, class_id, use_aoi=False): gt_uri = data_file_path('{}-gt-polygons.geojson'.format(class_id)) pred_uri = data_file_path('{}-pred-polygons.geojson'.format(class_id)) scene_id = str(class_id) rs = MockRasterSource(channel_order=[0, 1, 3], num_channels=3) rs.set_raster(np.zeros((10, 10, 3))) crs_transformer = IdentityCRSTransformer() extent = Box.make_square(0, 0, 360) gt_rs = RasterizedSource(GeoJSONVectorSource(gt_uri, crs_transformer), RasterizedSourceConfig.RasterizerOptions(2), extent, crs_transformer) gt_ls = SemanticSegmentationLabelSource(source=gt_rs) pred_rs = RasterizedSource( GeoJSONVectorSource(pred_uri, crs_transformer), RasterizedSourceConfig.RasterizerOptions(2), extent, crs_transformer) pred_ls = SemanticSegmentationLabelSource(source=pred_rs) pred_ls.vector_output = [{ 'uri': pred_uri, 'denoise': 0, 'mode': 'polygons', 'class_id': class_id }] if use_aoi: aoi_uri = data_file_path('{}-aoi.geojson'.format(class_id)) aoi_geojson = json.loads(file_to_str(aoi_uri)) aoi_polygons = [shape(aoi_geojson['features'][0]['geometry'])] return Scene(scene_id, rs, gt_ls, pred_ls, aoi_polygons) return Scene(scene_id, rs, gt_ls, pred_ls)
def setUp(self): self.crs_transformer = IdentityCRSTransformer() self.extent = Box.make_square(0, 0, 10) self.tmp_dir = RVConfig.get_tmp_dir() self.class_id = 2 self.background_class_id = 3 self.line_buffer = 1 self.uri = os.path.join(self.tmp_dir.name, 'temp.json')
def setUp(self): self.crs_transformer = IdentityCRSTransformer() self.extent = Box.make_square(0, 0, 10) self.tmp_dir_obj = rv_config.get_tmp_dir() self.tmp_dir = self.tmp_dir_obj.name self.class_id = 0 self.background_class_id = 1 self.line_buffer = 1 self.class_config = ClassConfig(names=['a']) self.uri = join(self.tmp_dir, 'tmp.json')
def test_get_chip_no_polygons(self): geojson = {'type': 'FeatureCollection', 'features': []} source = self.build_source(geojson) with source.activate(): # Get chip that partially overlaps extent. Expect that chip has zeros # outside of extent, and background_class_id otherwise. self.assertEqual(source.get_extent(), self.extent) chip = source.get_chip(Box.make_square(5, 5, 10)) self.assertEqual(chip.shape, (10, 10, 1)) expected_chip = np.full((10, 10, 1), self.background_class_id) np.testing.assert_array_equal(chip, expected_chip)
def test_get_labels(self): data = np.zeros((10, 10, 1), dtype=np.uint8) data[7:, 7:, 0] = 1 null_class_id = 2 raster_source = MockRasterSource([0], 1) raster_source.set_raster(data) label_source = SemanticSegmentationLabelSource(raster_source, null_class_id) with label_source.activate(): window = Box.make_square(7, 7, 3) labels = label_source.get_labels(window=window) label_arr = labels.get_label_arr(window) expected_label_arr = np.ones((3, 3)) np.testing.assert_array_equal(label_arr, expected_label_arr)
def test_get_labels_rgb(self): data = np.zeros((10, 10, 3), dtype=np.uint8) data[7:, 7:, :] = [1, 1, 1] null_class_id = 2 raster_source = MockRasterSource([0, 1, 2], 3) raster_source.set_raster(data) rgb_class_config = ClassConfig(names=['a'], colors=['#010101']) rgb_class_config.ensure_null_class() label_source = SemanticSegmentationLabelSource( raster_source, null_class_id, rgb_class_config=rgb_class_config) with label_source.activate(): window = Box.make_square(7, 7, 3) labels = label_source.get_labels(window=window) label_arr = labels.get_label_arr(window) expected_label_arr = np.zeros((3, 3)) np.testing.assert_array_equal(label_arr, expected_label_arr)
def set_return_vals(self, raster=None): self.mock.get_extent.return_value = Box.make_square(0, 0, 2) self.mock.get_dtype.return_value = np.uint8 self.mock.get_crs_transformer.return_value = IdentityCRSTransformer() self.mock._get_chip.return_value = np.random.rand(1, 2, 2, 3) if raster is not None: self.mock.get_extent.return_value = Box(0, 0, raster.shape[0], raster.shape[1]) self.mock.get_dtype.return_value = raster.dtype def get_chip(window): return raster[window.ymin:window.ymax, window.xmin:window.xmax, :] self.mock._get_chip.side_effect = get_chip
def setUp(self): self.file_name = 'labels.json' self.tmp_dir = rv_config.get_tmp_dir() self.file_path = os.path.join(self.tmp_dir.name, self.file_name) self.crs_transformer = DoubleCRSTransformer() self.geojson = { 'type': 'FeatureCollection', 'features': [{ 'type': 'Feature', 'geometry': { 'type': 'Polygon', 'coordinates': [[[0., 0.], [0., 1.], [1., 1.], [1., 0.], [0., 0.]]] }, 'properties': { 'class_id': 0, 'score': 0.9 } }, { 'type': 'Feature', 'geometry': { 'type': 'Polygon', 'coordinates': [[[1., 1.], [1., 2.], [2., 2.], [2., 1.], [1., 1.]]] }, 'properties': { 'score': 0.9, 'class_id': 1 } }] } self.extent = Box.make_square(0, 0, 10) self.class_config = ClassConfig(names=['car', 'house']) json_to_file(self.geojson, self.file_path)
def get_vector_scene(self, class_id, use_aoi=False): gt_uri = data_file_path('{}-gt-polygons.geojson'.format(class_id)) pred_uri = data_file_path('{}-pred-polygons.geojson'.format(class_id)) scene_id = str(class_id) rs = MockRasterSource(channel_order=[0, 1, 3], num_channels=3) rs.set_raster(np.zeros((10, 10, 3))) crs_transformer = IdentityCRSTransformer() extent = Box.make_square(0, 0, 360) config = RasterizedSourceConfig( vector_source=GeoJSONVectorSourceConfig(uri=gt_uri, default_class_id=0), rasterizer_config=RasterizerConfig(background_class_id=1)) gt_rs = config.build(self.class_config, crs_transformer, extent) gt_ls = SemanticSegmentationLabelSource(gt_rs, self.null_class_id) config = RasterizedSourceConfig( vector_source=GeoJSONVectorSourceConfig(uri=pred_uri, default_class_id=0), rasterizer_config=RasterizerConfig(background_class_id=1)) pred_rs = config.build(self.class_config, crs_transformer, extent) pred_ls = SemanticSegmentationLabelSource(pred_rs, self.null_class_id) pred_ls.vector_output = [ PolygonVectorOutputConfig(uri=pred_uri, denoise=0, class_id=class_id) ] if use_aoi: aoi_uri = data_file_path('{}-aoi.geojson'.format(class_id)) aoi_geojson = file_to_json(aoi_uri) aoi_polygons = [shape(aoi_geojson['features'][0]['geometry'])] return Scene(scene_id, rs, gt_ls, pred_ls, aoi_polygons) return Scene(scene_id, rs, gt_ls, pred_ls)
def get_extent(self): Box.make_square(0, 0, 2)