Multimodal fusion research on StripNet+GTA-UAV proxy: - 3 independent fusion tracks: condition-aware (A), token/bottleneck (B), role-aware (C) - Shared interfaces, protocol, dataset audit, baseline benchmarks - Canonical version-chain references to vault (SPEC, ANALYSIS, TRIAGE) - Personalized task plans and decision tables for each researcher - 3 generated DOCX task assignment files with milestones and DoD checklist - Full modality dropout diagnostics and missing-modality robustness requirements - Data contract, benchmark registry, experiment tracking infrastructure Operational documents: - docs/00_project/: MERIDIAN context, protocol, repository reuse guide, experiment specification - docs/01_tasks/: Master assignment + 3 individual researcher tracks + joint integration - docs/02_references/: Core literature, version-chain bases, code maps - docs/03_codebase_guides/: Existing code snapshots from vault - scripts/: gen_task_plans.js (DOCX generation), placeholder infrastructure - vendor_reference/: Snapshots of caption_test, depth_edges_annotate, existing SOFIA/SegModel code - reports/, results/, experiments/: Shared output structure for all 3 researchers 3 DOCX files generated from gen_task_plans.js (Times New Roman 14pt, GOST format): - План_заданий_Павленко_БВ.docx (Condition-Aware track, fusion API owner) - План_заданий_Близно_МВ.docx (Token/Bottleneck track, benchmark owner) - План_заданий_Мороз_ЕС.docx (Role-Aware track, data contract owner) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
88 lines
2.5 KiB
Python
88 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
"""Create 80/20 train/test split from GTA-UAV-LR pair JSONs.
|
|
|
|
Merges cross-area train+test (33,708 pairs), shuffles deterministically,
|
|
and saves new 80/20 split JSONs.
|
|
|
|
Usage:
|
|
python -m scripts.make_split [--ratio 0.8] [--seed 42]
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import logging
|
|
import random
|
|
from pathlib import Path
|
|
|
|
import coloredlogs
|
|
|
|
LOGGER = logging.getLogger("caption_test.make_split")
|
|
|
|
_RGB_ROOT = Path("/home/servml/Документы/datasets/GTA-UAV-LR")
|
|
|
|
|
|
def main() -> None:
|
|
parser = argparse.ArgumentParser(description="Create 80/20 split for GTA-UAV-LR.")
|
|
parser.add_argument("--ratio", type=float, default=0.8, help="Train ratio (default 0.8).")
|
|
parser.add_argument("--seed", type=int, default=42, help="Random seed.")
|
|
parser.add_argument(
|
|
"--output-dir", type=str, default="meta",
|
|
help="Output directory for split JSONs.",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
coloredlogs.install(
|
|
level="INFO", logger=LOGGER,
|
|
fmt="%(asctime)s %(name)s %(levelname)s %(message)s",
|
|
)
|
|
|
|
# Load both original splits.
|
|
train_path = _RGB_ROOT / "cross-area-drone2sate-train.json"
|
|
test_path = _RGB_ROOT / "cross-area-drone2sate-test.json"
|
|
|
|
LOGGER.info("📂 Loading %s", train_path.name)
|
|
with open(train_path) as f:
|
|
part1 = json.load(f)
|
|
LOGGER.info("📂 Loading %s", test_path.name)
|
|
with open(test_path) as f:
|
|
part2 = json.load(f)
|
|
|
|
all_pairs = part1 + part2
|
|
LOGGER.info("📊 Total pairs: %d", len(all_pairs))
|
|
|
|
# Shuffle deterministically.
|
|
rng = random.Random(args.seed)
|
|
rng.shuffle(all_pairs)
|
|
|
|
# Split.
|
|
n_train = int(len(all_pairs) * args.ratio)
|
|
train_pairs = all_pairs[:n_train]
|
|
test_pairs = all_pairs[n_train:]
|
|
|
|
LOGGER.info(
|
|
"✂️ Split %.0f/%.0f: train=%d (%.1f%%) test=%d (%.1f%%)",
|
|
args.ratio * 100, (1 - args.ratio) * 100,
|
|
len(train_pairs), 100 * len(train_pairs) / len(all_pairs),
|
|
len(test_pairs), 100 * len(test_pairs) / len(all_pairs),
|
|
)
|
|
|
|
# Save.
|
|
out_dir = Path(args.output_dir)
|
|
out_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
train_out = out_dir / "train_80.json"
|
|
test_out = out_dir / "test_20.json"
|
|
|
|
with train_out.open("w", encoding="utf-8") as f:
|
|
json.dump(train_pairs, f)
|
|
with test_out.open("w", encoding="utf-8") as f:
|
|
json.dump(test_pairs, f)
|
|
|
|
LOGGER.info("💾 Saved: %s (%d pairs)", train_out, len(train_pairs))
|
|
LOGGER.info("💾 Saved: %s (%d pairs)", test_out, len(test_pairs))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|