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