feat(perception): integrate calibrated operator pipeline
Add calibrated K1 projection, recorded and near-live perception qualification, unified Rerun operator layers, bounded replay admission, audited viewer controls, worker experiments, and lab evidence.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user