Add fail-closed sample filters to label QA
GeoIntel release gates / Compile, test, contracts and builds (push) Canceled after 0s
GeoIntel release gates / Python and npm vulnerability policy (push) Canceled after 0s
GeoIntel release gates / GIS image, SBOM and container scan (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-30 02:49:57 +02:00
parent 1267beb37b
commit 17984820e1
2 changed files with 46 additions and 1 deletions
@@ -29,6 +29,12 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--summary-path", required=True, help="Path to yolo_tile_dataset_summary.json")
parser.add_argument("--output-dir", required=True, help="Directory for JSON, Markdown and PNG artifacts")
parser.add_argument("--max-tiles", type=int, default=24, help="Maximum selected tiles to render")
parser.add_argument(
"--sample-slug",
action="append",
default=[],
help="Render only this sample slug; repeat to select multiple samples.",
)
parser.add_argument("--columns", type=int, default=4, help="Contact-sheet columns")
parser.add_argument("--thumb-size", type=int, default=256, help="Rendered tile thumbnail size in pixels")
parser.add_argument(
@@ -48,6 +54,17 @@ def load_json(path: Path) -> dict[str, Any]:
return data
def filter_tiles_by_samples(tiles: list[dict[str, Any]], sample_slugs: list[str]) -> list[dict[str, Any]]:
requested = {slug.strip() for slug in sample_slugs if slug.strip()}
if not requested:
return tiles
available = {str(tile.get("sample_slug") or "") for tile in tiles}
missing = sorted(requested - available)
if missing:
raise ValueError(f"Requested sample slugs absent from summary: {', '.join(missing)}")
return [tile for tile in tiles if str(tile.get("sample_slug") or "") in requested]
def resolve_path(raw_path: str | None, summary_path: Path) -> Path | None:
if not raw_path:
return None
@@ -254,7 +271,8 @@ def build_report(summary: dict[str, Any], summary_path: Path, args: argparse.Nam
if not isinstance(tiles, list):
raise ValueError("Expected summary tiles to be a list")
selected_tiles = select_tiles(tiles, args.max_tiles)
filtered_tiles = filter_tiles_by_samples(tiles, args.sample_slug)
selected_tiles = select_tiles(filtered_tiles, args.max_tiles)
rendered_cards: list[Image.Image] = []
selected_report_tiles: list[dict[str, Any]] = []
missing_image_count = 0
@@ -329,6 +347,7 @@ def build_report(summary: dict[str, Any], summary_path: Path, args: argparse.Nam
"dataset_output_dir": summary.get("output_dir"),
"class_names": summary.get("class_names", []),
"max_tiles": args.max_tiles,
"requested_sample_slugs": sorted(set(args.sample_slug)),
"columns": args.columns,
"thumb_size": args.thumb_size,
"selected_tile_count": len(selected_tiles),