#!/usr/bin/env python3
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 TeamFeatInvariantsConfig(scfg.DataConfig):
"""
Run UKY invariant 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 UKY invariants model')
pca_projection_path = scfg.Value(None, type=str, required=True, help=ub.paragraph(
'''
File path to UKY invariants PCA projections file
'''))
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
'''))
do_pca = scfg.Value(False, isflag=True, help='Perform PCA on invariants')
newline = scfg.Value(False, isflag=True, short_alias=['n'], help=ub.paragraph(
'''
Output as simple newline separated STAC items
'''))
[docs]
def main():
config = TeamFeatInvariantsConfig.cli(strict=True)
print('config = {}'.format(ub.urepr(dict(config), nl=1, align=':')))
run_uky_invariants_for_baseline(config)
[docs]
def run_uky_invariants_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)
timecombined_kwcoco_file_for_bas = ingressed_assets['enriched_bas_kwcoco_file']
# 2. Download and prune region file
print("* Downloading and pruning region file *")
local_region_path = ub.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 Invariants
print("* Generating UKY/WU invariant features *")
# FIXME: probably should not be called "SC" invariants
invariants_kwcoco_path = ingress_dir / 'sc_invariants_kwcoco.json'
ub.cmd([
'python', '-m', 'geowatch.tasks.invariants.predict',
'--input_kwcoco', timecombined_kwcoco_file_for_bas,
'--output_kwcoco', invariants_kwcoco_path,
'--pretext_package_path', config.model_path,
'--pca_projection_path', config.pca_projection_path,
'--assets_dname', '_teamfeats',
'--input_space_scale', '30GSD',
'--window_space_scale', '30GSD',
'--patch_size', '256',
'--do_pca', str(1 if config.do_pca else 0),
'--patch_overlap', '0.3',
'--num_workers', '2',
'--write_workers', '0',
'--tasks', 'before_after', 'pretext'
], check=True, verbose=3, capture=False)
# 3. 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 *")
# Reroot kwcoco files to make downloaded results easier to work with
ub.cmd(['kwcoco', 'reroot', f'--src={invariants_kwcoco_path}', '--inplace=1', '--absolute=0'])
ingressed_assets['enriched_bas_kwcoco_file'] = invariants_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()