geowatch.cli.coco_time_combine module¶
- SeeAlso:
~/code/watch/geowatch/cli/queue_cli/prepare_time_combined_dataset.py
CommandLine
DVC_DATA_DPATH=$(geowatch_dvc --tags='phase2_data' --hardware=auto)
python -m geowatch.cli.coco_time_combine \
--input_kwcoco_fpath="$DVC_DATA_DPATH/Drop6/imgonly-KR_R002.kwcoco.zip" \
--output_kwcoco_fpath="$DVC_DATA_DPATH/Drop6_MeanYear/imgonly-KR_R002.kwcoco.zip" \
--channels="red|green|blue|nir|swir16|swir22" \
--resolution=10GSD \
--time_window=1year \
--merge_method=mean \
--workers=4
python -m geowatch reproject_annotations \
--src $DVC_DATA_DPATH/Drop6_MeanYear/imgonly-KR_R002.kwcoco.zip \
--dst $DVC_DATA_DPATH/Drop6_MeanYear/imganns-KR_R002.kwcoco.zip \
--site_models="$DVC_DATA_DPATH/annotations/drop6/site_models/*.geojson"
Example
>>> # Toydata example for CI
>>> import geowatch
>>> from geowatch.cli import coco_time_combine
>>> import ubelt as ub
>>> dpath = ub.Path.appdir('geowatch/tests/cli/time_combine/t0')
>>> dset = geowatch.coerce_kwcoco(
>>> 'geowatch-msi', geodata=True,
>>> dates={'start_time': '2020-01-01', 'end_time': '2020-06-01'},
>>> image_size=(32, 32)
>>> )
>>> dpath.delete().ensuredir()
>>> output_fpath = dpath / 'time_combined/data.kwcoco.json'
>>> gsd = dset.videos().objs[0]['target_gsd']
>>> kwargs = coco_time_combine.TimeCombineConfig(
>>> input_kwcoco_fpath=dset.fpath,
>>> output_kwcoco_fpath=output_fpath,
>>> time_window='2month',
>>> merge_method='mean',
>>> resolution=f'{gsd}GSD',
>>> start_time='2019-06-01',
>>> )
>>> cmdline = 0
>>> coco_time_combine.main(cmdline=cmdline, **kwargs)
>>> import kwcoco
>>> out_dset = kwcoco.CocoDataset(output_fpath)
>>> assert len(out_dset.videos()) == len(dset.videos())
>>> assert out_dset.n_images < dset.n_images
from geowatch.cli import coco_visualize_videos coco_visualize_videos.main(cmdline=0, src=output_fpath, stack=’only’, workers=’avail’)
- class geowatch.cli.coco_time_combine.TimeCombineConfig(*args, **kwargs)[source]¶
Bases:
DataConfig
Averages kwcoco images over a sliding temporal window in a video.
Valid options: []
- Parameters:
*args – positional arguments for this data config
**kwargs – keyword arguments for this data config
- default = {'assets_dname': <Value('_assets')>, 'avoid_quality_values': <Value(['cloud'])>, 'channels': <Value('*')>, 'exclude_sensors': <Value(None)>, 'filter_season': <Value([])>, 'include_sensors': <Value(None)>, 'input_kwcoco_fpath': <Value(None)>, 'mask_low_quality': <Value(True)>, 'max_images_per_group': <Value(None)>, 'merge_method': <Value('mean')>, 'output_kwcoco_fpath': <Value(None)>, 'resolution': <Value('10GSD')>, 'select_images': <Value(None)>, 'select_videos': <Value(None)>, 'sensor_weights': <Value(0)>, 'separate_sensors': <Value(True)>, 'spatial_tile_size': <Value(None)>, 'start_time': <Value(None)>, 'time_window': <Value('1month')>, 'workers': <Value(0)>}¶
- geowatch.cli.coco_time_combine.main(cmdline=1, **kwargs)[source]¶
CommandLine
DEVEL_TEST=1 xdoctest -m geowatch.cli.coco_time_combine main from geowatch.cli.coco_time_combine import * # NOQA import geowatch data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') cmdline = 0 channels='red|green|blue' kwargs = dict( input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imgonly-KR_R001.kwcoco.zip', output_kwcoco_fpath=data_dvc_dpath / 'TestAveDrop6/test-timeave-valid_split1_1yr_mean_test.kwcoco.zip', workers=4, mask_low_quality=True, time_window='1 year', channels=channels, ) output_coco_dset = main(cmdline=cmdline, **kwargs) coco_visualize_videos.main(cmdline=cmdline, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 0: Baseline run. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imgonly-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-imgonly-KR_R001.kwcoco.zip', >>> workers=11, >>> mask_low_quality=False, >>> time_window='1 year', >>> channels='red|green|blue', >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 1: Check cloudmasking. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imgonly-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-KR_R001-cloudmask.kwcoco.zip', >>> workers=11, >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 2: Check that resolution can be updated. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imgonly-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-KR_R001-cloudmask-5GSD.kwcoco.zip', >>> workers=11, >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='5GSD', >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 3: Median combining. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imgonly-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-KR_R001-median.kwcoco.zip', >>> workers=11, >>> merge_method='median', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=False, >>> resolution='10GSD', >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 4: Median combining with cloudmask. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imganns-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-KR_R001-cloudmask-median.kwcoco.zip', >>> workers=11, >>> merge_method='median', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='10GSD', >>> separate_sensors=True, >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 5: Dont separate sensors. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imgonly-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-KR_R001-cloudmask-no_sensor_separate.kwcoco.zip', >>> workers=11, >>> merge_method='mean', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='10GSD', >>> separate_sensors=False, >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 6: Adjust the effect of S2 imagery. >>> from geowatch.cli.coco_time_combine import * # NOQA >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imganns-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-test_6-KR_R001.kwcoco.zip', >>> workers=11, >>> merge_method='mean', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='10GSD', >>> separate_sensors=False, >>> sensor_weights=dict(S2=2.5, L8=1.0, WV=5.0) >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 7: Tile images instead of computing average all at once. >>> from geowatch.cli.coco_time_combine import * # NOQA >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imganns-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-test_7-KR_R001.kwcoco.zip', >>> workers=11, >>> merge_method='median', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='10GSD', >>> separate_sensors=False, >>> spatial_tile_size=200, >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 8: Tile images on large kwcoco file. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/data_train_split1.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-test_8-train_split1.kwcoco.zip', >>> workers=4, >>> merge_method='median', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='10GSD', >>> separate_sensors=False, >>> spatial_tile_size=400, >>> include_sensors=['S2', 'L8'], >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
Example
>>> # 9: Exclude winter seasons for time average. >>> from geowatch.cli.coco_time_combine import * # NOQA >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> cmdline = 0 >>> kwargs = dict( >>> input_kwcoco_fpath=data_dvc_dpath / 'Drop6/imganns-KR_R001.kwcoco.zip', >>> output_kwcoco_fpath=data_dvc_dpath / 'Drop6/test-timeave-test_9-KR_R001.kwcoco.zip', >>> workers=11, >>> merge_method='mean', >>> time_window='1 year', >>> channels='red|green|blue', >>> mask_low_quality=True, >>> resolution='10GSD', >>> separate_sensors=False, >>> filter_season='winter', >>> ) >>> output_coco_dset = main(cmdline=cmdline, **kwargs) >>> from geowatch.cli import coco_visualize_videos >>> coco_visualize_videos.main(cmdline=0, src=kwargs['output_kwcoco_fpath'], smart=True)
- geowatch.cli.coco_time_combine.combine_kwcoco_channels_temporally(config)[source]¶
Combine spatial data within a temporal window from a kwcoco dataset and save the result to a new kwcoco dataset.
High level steps: 1. Load kwcoco dataset. 2. Divide the dataset into temporal windows. 3. For each temporal window, combine the spatial data from each channel. 4. Save the combined image result to a new kwcoco dataset.
- geowatch.cli.coco_time_combine.get_quality_mask(coco_image, space, resolution, avoid_quality_values=None, crop_slice=None, qa_scale=None)[source]¶
Get a binary mask of the quality data.
- Parameters:
coco_image (kwcoco.coco_image.CocoImage) – Object that contains references to the image and assets including the quality mask.
space (str) – The space that the quality mask will be loaded in. Choices: ‘image’, ‘video’, ‘asset’
resolution (str | int) – The resolution that the quality mask will be loaded in. E.g. ‘10GSD’.
avoid_quality_values (list | None) – The values to include as bad quality according to the bitmask. Defaults to [‘cloud’, ‘cloud_shadow’, ‘cloud_adjacent’].
crop_slice (Tuple[slice, slice] | None) – The height and width crop slices to load from quality mask. Defaults to None, which loads full quality mask.
- Returns:
A binary numpy array of shape [H, W, 1] where the 1 values corresponds to a quality pixel vice versa for 0 values.
- Return type:
np.ndarray
- geowatch.cli.coco_time_combine.estimate_top_quality_images(window_coco_images, max_images_per_group, avoid_quality_values)[source]¶
Heuristic to subselect top images.
- geowatch.cli.coco_time_combine.merge_images(window_coco_images, merge_method, requested_chans, space, resolution, new_bundle_dpath, mask_low_quality, sensor_weights, og_kwcoco_fpath, spatial_tile_size, config)[source]¶
- Parameters:
window_coco_images (List[kwcoco.CocoImage]) – images with channels to merge
- Returns:
a new coco image that points at the merged image on disk.
- Return type:
Dict
- geowatch.cli.coco_time_combine.generate_frames(window_coco_images, crop_slice, resolution, space, merge_chans, mask_low_quality, avoid_quality_values)[source]¶
- geowatch.cli.coco_time_combine.filter_image_ids_by_season(coco_dset, image_ids, filtered_seasons, ignore_winter_torrid_zone=True)[source]¶
Filter a sequence of image ids by season and geolocation.
- Parameters:
coco_dset (kwcoco.CocoDataset) – A KWCOCO dataset object.
image_ids (List(int)) – A list of image ids that belong in coco_dset.
filtered_seasons (str | List(str) | None) – Which seasons to not include in the returned image ids.
ignore_winter_torrid_zone (bool, optional) – Do not filter images within the Torrid region when winter is one of the filtered seasons. Defaults to True.
- Raises:
ValueError – Check if the filtered seasons varible is a correctable type.
ValueError – Check if one of the filtered seasons is not a valid season.
- Returns:
- A list of filtered image ids. Should never be longer than the input
image ids.
- Return type:
Example
>>> # 0: Baseline run. >>> # xdoctest: +REQUIRES(env:DEVEL_TEST) >>> from geowatch.cli.coco_time_combine import * # NOQA >>> import geowatch >>> data_dvc_dpath = geowatch.find_dvc_dpath(tags='phase2_data', hardware='auto') >>> # Load KWCOCO dataset. >>> input_kwcoco_fpath = data_dvc_dpath / 'Drop6/imgonly-AE_C001.kwcoco.json' >>> coco_dset = kwcoco.CocoDataset(input_kwcoco_fpath) >>> image_ids = coco_dset.images().gids >>> ignore_torrid_regions_gids = filter_image_ids_by_season(coco_dset, >>> image_ids, >>> filtered_seasons='winter', >>> ignore_winter_torrid_zone=True) >>> all_filtered_gids = filter_image_ids_by_season(coco_dset, >>> image_ids, >>> filtered_seasons='winter', >>> ignore_winter_torrid_zone=True) >>> assert len(all_filtered_gids) > len(ignore_torrid_regions_gids)