From 15ff6f64339177b561ce8c29254cd220cdb60c8c Mon Sep 17 00:00:00 2001 From: Jens Date: Thu, 30 Jul 2026 00:10:15 +0200 Subject: [PATCH] Train against merged national roof instances --- .../tests/test_training_loop_supervisor.py | 11 +++ scripts/supervise_container_training_loop.py | 1 + scripts/tower-v48-v47-loop-command.json | 75 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 scripts/tower-v48-v47-loop-command.json diff --git a/backend/tests/test_training_loop_supervisor.py b/backend/tests/test_training_loop_supervisor.py index 23f195f5..3ea94b57 100644 --- a/backend/tests/test_training_loop_supervisor.py +++ b/backend/tests/test_training_loop_supervisor.py @@ -29,3 +29,14 @@ def test_process_detection_requires_exact_marker(monkeypatch) -> None: monkeypatch.setattr(MODULE.subprocess, "run", lambda *args, **kwargs: Result()) assert MODULE.process_active("geointel", "run_belgium_building_training_loop.py") assert not MODULE.process_active("geointel", "other_loop.py") + + +def test_write_state_creates_output_directory_atomically(tmp_path: Path) -> None: + state_path = tmp_path / "new-run" / "supervisor-state.json" + + MODULE.write_state(state_path, {"schema_version": 1, "status": "monitoring"}) + + written = json.loads(state_path.read_text(encoding="utf-8")) + assert written["status"] == "monitoring" + assert written["updated_at"] + assert not state_path.with_suffix(".json.tmp").exists() diff --git a/scripts/supervise_container_training_loop.py b/scripts/supervise_container_training_loop.py index 3e90551e..d4762cd6 100644 --- a/scripts/supervise_container_training_loop.py +++ b/scripts/supervise_container_training_loop.py @@ -33,6 +33,7 @@ def process_active(container: str, marker: str) -> bool: def write_state(path: Path, state: dict) -> None: state["updated_at"] = datetime.now(UTC).isoformat() + path.parent.mkdir(parents=True, exist_ok=True) temporary = path.with_suffix(path.suffix + ".tmp") temporary.write_text(json.dumps(state, indent=2), encoding="utf-8") temporary.replace(path) diff --git a/scripts/tower-v48-v47-loop-command.json b/scripts/tower-v48-v47-loop-command.json new file mode 100644 index 00000000..22206922 --- /dev/null +++ b/scripts/tower-v48-v47-loop-command.json @@ -0,0 +1,75 @@ +[ + "docker", + "exec", + "-d", + "geointel", + "/opt/geointel/venv/bin/python", + "/app/scripts/run_belgium_building_training_loop.py", + "--initial-model", + "/app/storage/training/building-be-v43-v42-closed-loop-r1/iteration-005/candidate.pt", + "--train-yaml", + "/app/storage/operator-data/building-be-v47-merged-rotated-holdouts-r1/train/dataset.yaml", + "--train-summary", + "/app/storage/operator-data/building-be-v47-merged-rotated-holdouts-r1/train/yolo_tile_dataset_summary.json", + "--dataset-audit", + "/app/storage/training/building-be-v47-corpus-audit-r1/belgium-building-corpus-audit.json", + "--train-quality-audit", + "/app/storage/training/building-be-v47-yolo-quality-audit-r1/operator_yolo_dataset_quality_audit.json", + "--calibration-summary", + "/app/storage/operator-data/building-be-v47-merged-rotated-holdouts-r1/calibration/yolo_tile_dataset_summary.json", + "--test-summary", + "/app/storage/operator-data/building-be-v47-merged-rotated-holdouts-r1/test/yolo_tile_dataset_summary.json", + "--background-summary", + "/app/storage/operator-data/building-be-v47-merged-rotated-holdouts-r1/background-test/yolo_tile_dataset_summary.json", + "--corpus-manifest", + "/app/storage/operator-data/building-be-v47-merged-rotated-holdouts-r1/operator_samples_manifest.json", + "--output-dir", + "/app/storage/training/building-be-v48-v47-merged-loop-r1", + "--iterations", + "20", + "--epochs", + "100", + "--patience", + "12", + "--batch", + "8", + "--workers", + "0", + "--max-det", + "1000", + "--imgsz", + "640", + "--optimizer", + "AdamW", + "--lr0", + "0.00005", + "--mosaic", + "0", + "--scale", + "0.15", + "--translate", + "0.05", + "--degrees", + "180", + "--flipud", + "0.5", + "--fliplr", + "0.5", + "--warmup-epochs", + "1", + "--warmup-bias-lr", + "0.01", + "--hsv-h", + "0.01", + "--hsv-s", + "0.2", + "--hsv-v", + "0.15", + "--seed", + "20260948", + "--yolo", + "/opt/geointel/venv/bin/yolo" +] + + +