Source code for rastervision.core.data.utils.factory

from typing import TYPE_CHECKING
from uuid import uuid4

from rastervision.core.data.utils import listify_uris, get_polygons_from_uris

if TYPE_CHECKING:
    from rastervision.core.data import ClassConfig, Scene


[docs]def make_ss_scene(image_uri: str | list[str], label_raster_uri: str | list[str] | None = None, class_config: 'ClassConfig | None' = None, label_vector_uri: str | None = None, aoi_uri: str | list[str] = [], label_vector_default_class_id: int | None = None, image_raster_source_kw: dict = {}, label_raster_source_kw: dict = {}, label_vector_source_kw: dict = {}, scene_id: str | None = None) -> 'Scene': """Create a semantic segmentation scene from image and label URIs. This is a convenience method. For more fine-grained control, it is recommended to use the default constructor. Args: image_uri: URI or list of URIs of GeoTIFFs to use as the source of image data. label_raster_uri: URI or list of URIs of GeoTIFFs to use as the source of segmentation label data. If the labels are in the form of GeoJSONs, use ``label_vector_uri`` instead. Defaults to ``None``. label_vector_uri: URI of GeoJSON file to use as the source of segmentation label data. If the labels are in the form of GeoTIFFs, use ``label_raster_uri`` instead. Defaults to ``None``. class_config: The ``ClassConfig``. Can be ``None`` if not using any labels. aoi_uri: URI or list of URIs of GeoJSONs that specify the area-of-interest. If provided, the dataset will only access data from this area. Defaults to ``[]``. label_vector_default_class_id: If using ``label_vector_uri`` and all polygons in that file belong to the same class and they do not contain a ``class_id`` property, then use this argument to map all of the polygons to the appropriate class ID. See docs for :class:`.ClassInferenceTransformer` for more details. Defaults to ``None``. image_raster_source_kw: Additional arguments to pass to the :class:`.RasterioSource` used for image data. See docs for :class:`.RasterioSource` for more details. Defaults to ``{}``. label_raster_source_kw: Additional arguments to pass to the :class:`.RasterioSource` used for label data, if ``label_raster_uri`` is used. See docs for :class:`.RasterioSource` for more details. Defaults to ``{}``. label_vector_source_kw: Additional arguments to pass to the :class:`.GeoJSONVectorSource` used for label data, if ``label_vector_uri`` is used. See docs for :class:`.GeoJSONVectorSource` for more details. Defaults to ``{}``. scene_id: Optional scene ID. If None, will be randomly generated. Defaults to None. Raises: ValueError: If both label_raster_uri and label_vector_uri are specified. Returns: Scene: A semantic segmentation scene. """ # use local imports to avoid circular import problems from rastervision.core.data import ( GeoJSONVectorSource, RasterioSource, RasterizedSource, Scene, SemanticSegmentationLabelSource, ClassInferenceTransformer) if label_raster_uri is not None and label_vector_uri is not None: raise ValueError('Specify either label_raster_uri or ' 'label_vector_uri or neither, but not both.') if label_raster_uri is not None or label_vector_uri is not None: if class_config is None: raise ValueError('class_config is required if using labels.') class_config.ensure_null_class() image_uri = listify_uris(image_uri) raster_source = RasterioSource(uris=image_uri, **image_raster_source_kw) crs_transformer = raster_source.crs_transformer bbox = raster_source.bbox label_raster_source = None if label_raster_uri is not None: label_raster_uri = listify_uris(label_raster_uri) label_raster_source = RasterioSource( uris=label_raster_uri, **label_raster_source_kw) elif label_vector_uri is not None: if label_vector_default_class_id is not None: # add a ClassInferenceTransformer to the VectorSource class_inf_tf = ClassInferenceTransformer( default_class_id=label_vector_default_class_id) vector_tfs = label_vector_source_kw.get('vector_transformers', []) label_vector_source_kw['vector_transformers'] = ( [class_inf_tf] + vector_tfs) vector_source = GeoJSONVectorSource( uris=label_vector_uri, crs_transformer=crs_transformer, **label_vector_source_kw) label_raster_source = RasterizedSource( vector_source=vector_source, background_class_id=label_raster_source_kw.pop( 'background_class_id', class_config.null_class_id), bbox=bbox, **label_raster_source_kw) label_source = None if label_raster_source is not None: label_source = SemanticSegmentationLabelSource( raster_source=label_raster_source, class_config=class_config) aoi_polygons = get_polygons_from_uris(aoi_uri, crs_transformer) scene = Scene( id=uuid4() if scene_id is None else scene_id, raster_source=raster_source, label_source=label_source, aoi_polygons=aoi_polygons) return scene
[docs]def make_cc_scene(image_uri: str | list[str], label_vector_uri: str | None = None, class_config: 'ClassConfig | None' = None, aoi_uri: str | list[str] = [], label_vector_default_class_id: int | None = None, image_raster_source_kw: dict = {}, label_vector_source_kw: dict = {}, label_source_kw: dict = {}, scene_id: str | None = None) -> 'Scene': """Create a chip classification scene from image and label URIs. This is a convenience method. For more fine-grained control, it is recommended to use the default constructor. Args: image_uri: URI or list of URIs of GeoTIFFs to use as the source of image data. label_vector_uri: URI of GeoJSON file to use as the source of segmentation label data. Defaults to ``None``. class_config: The ClassConfig. Must be non-``None`` if creating a scene without a ``LabelSource``. Defaults to ``None``. aoi_uri: URI or list of URIs of GeoJSONs that specify the area-of-interest. If provided, the dataset will only access data from this area. Defaults to ``[]``. label_vector_default_class_id: If using ``label_vector_uri`` and all polygons in that file belong to the same class and they do not contain a `class_id` property, then use this argument to map all of the polygons to the appropriate class ID. See docs for :class:`.ClassInferenceTransformer` for more details. Defaults to ``None``. image_raster_source_kw: Additional arguments to pass to the :class:`.RasterioSource` used for image data. See docs for :class:`.RasterioSource` for more details. Defaults to ``{}``. label_vector_source_kw: Additional arguments to pass to the :class:`.GeoJSONVectorSource` used for label data, if ``label_vector_uri`` is used. See docs for :class:`.GeoJSONVectorSource` for more details. Defaults to ``{}``. label_source_kw: Additional arguments to pass to the :class:`.ChipClassificationLabelSourceConfig` used for label data, if ``label_vector_uri`` is set. See docs for :class:`.ChipClassificationLabelSourceConfig` for more details. Defaults to ``{}``. scene_id: Optional scene ID. If ``None``, will be randomly generated. Defaults to ``None``. Returns: Scene: A chip classification scene. """ # use local imports to avoid circular import problems from rastervision.core.data import ( RasterioSource, Scene, ClassInferenceTransformerConfig, ChipClassificationLabelSourceConfig, GeoJSONVectorSourceConfig) image_uri = listify_uris(image_uri) raster_source = RasterioSource(image_uri, **image_raster_source_kw) crs_transformer = raster_source.crs_transformer bbox = raster_source.bbox label_source = None if label_vector_uri is not None: if class_config is None: raise ValueError('class_config is required if using labels.') if label_vector_default_class_id is not None: # add a ClassInferenceTransformer to the VectorSource class_inf_tf = ClassInferenceTransformerConfig( default_class_id=label_vector_default_class_id) vector_tfs = label_vector_source_kw.get('transformers', []) label_vector_source_kw['transformers'] = ( [class_inf_tf] + vector_tfs) geojson_cfg = GeoJSONVectorSourceConfig( uris=label_vector_uri, **label_vector_source_kw) # use config to ensure required transformers are auto added label_source_cfg = ChipClassificationLabelSourceConfig( vector_source=geojson_cfg, **label_source_kw) label_source = label_source_cfg.build( class_config, crs_transformer, bbox=bbox) aoi_polygons = get_polygons_from_uris(aoi_uri, crs_transformer) scene = Scene( id=uuid4() if scene_id is None else scene_id, raster_source=raster_source, label_source=label_source, aoi_polygons=aoi_polygons) return scene
[docs]def make_od_scene(image_uri: str | list[str], label_vector_uri: str | None = None, class_config: 'ClassConfig | None' = None, aoi_uri: str | list[str] = [], label_vector_default_class_id: int | None = None, image_raster_source_kw: dict = {}, label_vector_source_kw: dict = {}, label_source_kw: dict = {}, scene_id: str | None = None) -> 'Scene': """Create an object detection scene from image and label URIs. This is a convenience method. For more fine-grained control, it is recommended to use the default constructor. Args: image_uri: URI or list of URIs of GeoTIFFs to use as the source of image data. label_vector_uri: URI of GeoJSON file to use as the source of label. Defaults to ``None``. class_config: The ClassConfig. Must be non-None if creating a scene without a ``LabelSource``. Defaults to ``None``. aoi_uri: URI or list of URIs of GeoJSONs that specify the area-of-interest. If provided, the dataset will only access data from this area. Defaults to ``[]``. label_vector_default_class_id: If using label_vector_uri and all polygons in that file belong to the same class and they do not contain a `class_id` property, then use this argument to map all of the polygons to the appropriate class ID. See docs for ClassInferenceTransformer for more details. Defaults to ``None``. image_raster_source_kw: Additional arguments to pass to the :class:`.RasterioSource` used for image data. See docs for :class:`.RasterioSource` for more details. Defaults to ``{}``. label_vector_source_kw: Additional arguments to pass to the :class:`.GeoJSONVectorSourceConfig` used for label data, if label_vector_uri is set. See docs for :class:`.GeoJSONVectorSourceConfig` for more details. Defaults to ``{}``. label_source_kw: Additional arguments to pass to the :class:`.ObjectDetectionLabelSourceConfig` used for label data, if label_vector_uri is set. See docs for :class:`.ObjectDetectionLabelSourceConfig` for more details. Defaults to ``{}``. scene_id: Optional scene ID. If None, will be randomly generated. Defaults to None. Returns: Scene: An object detection scene. """ # use local imports to avoid circular import problems from rastervision.core.data import ( RasterioSource, Scene, ClassInferenceTransformerConfig, GeoJSONVectorSourceConfig, ObjectDetectionLabelSourceConfig) image_uri = listify_uris(image_uri) raster_source = RasterioSource(image_uri, **image_raster_source_kw) crs_transformer = raster_source.crs_transformer bbox = raster_source.bbox label_source = None if label_vector_uri is not None: if class_config is None: raise ValueError('class_config is required if using labels.') if label_vector_default_class_id is not None: # add a ClassInferenceTransformer to the VectorSource class_inf_tf = ClassInferenceTransformerConfig( default_class_id=label_vector_default_class_id) vector_tfs = label_vector_source_kw.get('transformers', []) label_vector_source_kw['transformers'] = ( [class_inf_tf] + vector_tfs) geojson_cfg = GeoJSONVectorSourceConfig( uris=label_vector_uri, **label_vector_source_kw) # use config to ensure required transformers are auto added label_source_cfg = ObjectDetectionLabelSourceConfig( vector_source=geojson_cfg, **label_source_kw) label_source = label_source_cfg.build( class_config, crs_transformer, bbox=bbox) aoi_polygons = get_polygons_from_uris(aoi_uri, crs_transformer) scene = Scene( id=uuid4() if scene_id is None else scene_id, raster_source=raster_source, label_source=label_source, aoi_polygons=aoi_polygons) return scene