#!/usr/bin/env python3
"""
TODO: rectify with run_teamfeat_acsc_landcover.py
"""
import ubelt as ub
import scriptconfig as scfg
from geowatch.cli.smartflow_ingress import smartflow_ingress
from geowatch.cli.smartflow_egress import smartflow_egress
[docs]
class TeamFeatLandcoverConfig(scfg.DataConfig):
"""
Run DZYNE landcover feature computation as baseline framework component
"""
input_path = scfg.Value(None, type=str, position=1, required=True, help=ub.paragraph(
'''
Path to input T&E Baseline Framework JSON
'''))
input_region_path = scfg.Value(None, type=str, position=2, required=True, help=ub.paragraph(
'''
Path to input T&E Baseline Framework Region definition JSON
'''))
output_path = scfg.Value(None, type=str, position=3, required=True, help='S3 path for output JSON')
model_path = scfg.Value(None, type=str, required=True, help='File path to landcover model')
aws_profile = scfg.Value(None, type=str, help=ub.paragraph(
'''
AWS Profile to use for AWS S3 CLI commands
'''))
dryrun = scfg.Value(False, isflag=True, short_alias=['d'], help='Run AWS CLI commands with --dryrun flag')
outbucket = scfg.Value(None, type=str, required=True, short_alias=['o'], help=ub.paragraph(
'''
S3 Output directory for STAC item / asset egress
'''))
requester_pays = scfg.Value(False, isflag=True, short_alias=['r'], help=ub.paragraph(
'''
Run AWS CLI commands with `--requestor_payer requester` flag
'''))
newline = scfg.Value(False, isflag=True, short_alias=['n'], help=ub.paragraph(
'''
Output as simple newline separated STAC items
'''))
[docs]
def main():
config = TeamFeatLandcoverConfig.cli(strict=True)
print('config = {}'.format(ub.urepr(dict(config), nl=1, align=':')))
run_landcover_for_baseline(config)
[docs]
def run_landcover_for_baseline(config):
from geowatch.utils.util_framework import download_region
####
# DEBUGGING:
# Print info about what version of the code we are running on
from geowatch.utils.util_framework import NodeStateDebugger
node_state = NodeStateDebugger()
node_state.print_environment()
node_state.print_local_invocation(config)
# 1. Ingress data
print("* Running baseline framework kwcoco ingress *")
ingress_dir = ub.Path('/tmp/ingress')
ingressed_assets = smartflow_ingress(
config.input_path,
['enriched_bas_kwcoco_file',
'enriched_bas_kwcoco_teamfeats',
'enriched_bas_kwcoco_rawbands'],
ingress_dir,
config.aws_profile,
config.dryrun)
# 2. Download and prune region file
print("* Downloading and pruning region file *")
local_region_path = '/tmp/region.json'
download_region(
input_region_path=config.input_region_path,
output_region_path=local_region_path,
aws_profile=config.aws_profile,
strip_nonregions=True,
)
# 2. Generate Landcover features
print("* Generating landcover features *")
dzyne_landcover_features_kwcoco_path = ingress_dir / 'dzyne_landcover_kwcoco.json'
enriched_bas_kwcoco_file = ingressed_assets['enriched_bas_kwcoco_file']
ub.cmd([
'python', '-m', 'geowatch.tasks.landcover.predict',
'--dataset', enriched_bas_kwcoco_file,
'--deployed', config.model_path,
'--output', dzyne_landcover_features_kwcoco_path,
'--num_workers', '2',
'--with_hidden', '32',
'--assets_dname', '_teamfeats',
'--select_images', '.sensor_coarse == "S2"',
'--device', '0'
], check=True, verbose=3, capture=False)
# 3. Combining landcover features with input features to pass to BAS
print("* Combining input features with computed landcover features *")
combo_features_kwcoco_path = ingress_dir / 'features_combo_with_landcover_kwcoco.json'
ub.cmd([
'python', '-m', 'geowatch.cli.coco_combine_features',
'--src', enriched_bas_kwcoco_file, dzyne_landcover_features_kwcoco_path,
'--dst', combo_features_kwcoco_path,
], check=True, verbose=3, capture=False)
# Reroot kwcoco files to make downloaded results easier to work with
ub.cmd(['kwcoco', 'reroot', f'--src={combo_features_kwcoco_path}', '--inplace=1', '--absolute=0'])
# 4. Egress (envelop KWCOCO dataset in a STAC item and egress;
# will need to recursive copy the kwcoco output directory up to
# S3 bucket)
print("* Egressing KWCOCO dataset and associated STAC item *")
# Add new assets to be egressed
ingressed_assets['timecombined_kwcoco_file_for_bas_with_landcover'] = (
combo_features_kwcoco_path)
ingressed_assets['landcover_assets'] = ingress_dir / '_teamfeats'
ingressed_assets['enriched_bas_kwcoco_file'] = combo_features_kwcoco_path
ingressed_assets['enriched_bas_kwcoco_teamfeats'] = ingress_dir / '_teamfeats'
smartflow_egress(ingressed_assets,
local_region_path,
config.output_path,
config.outbucket,
aws_profile=None,
dryrun=False,
newline=False)
if __name__ == "__main__":
main()