NODEDC_MISSION_CORE/experiments/perception/prepare_e1_qualification.py

91 lines
3.1 KiB
Python

#!/usr/bin/env python3
"""Prepare immutable E1 preprocessing and frame-selection inputs."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from k1link.compute.qualification import (
DEFAULT_QUALIFICATION_FRAME_COUNT,
prepare_recorded_qualification_slice,
)
from k1link.device_plugins.xgrids_k1.analyze.valid_fov import (
DEFAULT_EDGE_MARGIN_PIXELS,
prepare_k1_valid_fov_mask,
)
def _arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("--job-root", type=Path, required=True)
parser.add_argument("--calibration-root", type=Path, required=True)
parser.add_argument("--source-id", required=True)
parser.add_argument("--output-root", type=Path, required=True)
parser.add_argument(
"--sample-count",
type=int,
default=DEFAULT_QUALIFICATION_FRAME_COUNT,
)
parser.add_argument(
"--edge-margin-pixels",
type=float,
default=DEFAULT_EDGE_MARGIN_PIXELS,
)
return parser.parse_args()
def main() -> int:
args = _arguments()
mask = prepare_k1_valid_fov_mask(
calibration_snapshot_root=args.calibration_root,
source_id=args.source_id,
output_root=args.output_root / "valid-fov",
edge_margin_pixels=args.edge_margin_pixels,
)
qualification = prepare_recorded_qualification_slice(
job_root=args.job_root,
output_root=args.output_root / "qualification-slices",
sample_count=args.sample_count,
)
print(
json.dumps(
{
"schema_version": "missioncore.e1-qualification-preparation/v1",
"valid_fov": {
"generation_id": mask.generation_id,
"manifest": str(mask.manifest_path),
"mask": str(mask.mask_path),
"calibration_sha256": mask.calibration_sha256,
"source_id": mask.source_id,
"calibration_slot": mask.calibration_slot,
"center_xy": list(mask.center_xy),
"radius_pixels": mask.radius_pixels,
"crop_xyxy_exclusive": list(mask.crop_xyxy),
"valid_pixel_count": mask.valid_pixel_count,
"valid_fraction": mask.valid_fraction,
},
"qualification_slice": {
"generation_id": qualification.generation_id,
"manifest": str(qualification.manifest_path),
"job_id": qualification.job_id,
"input_sha256": qualification.input_sha256,
"policy": qualification.policy,
"source_frame_count": qualification.source_frame_count,
"selected_frame_count": len(qualification.frames),
"first_frame_index": qualification.frames[0].frame_index,
"last_frame_index": qualification.frames[-1].frame_index,
},
},
ensure_ascii=False,
indent=2,
sort_keys=True,
)
)
return 0
if __name__ == "__main__":
raise SystemExit(main())