Files
Aislo/tester/run_terrain_models.py
T
2026-07-05 14:05:22 +09:00

85 lines
2.8 KiB
Python

from __future__ import annotations
import argparse
import shutil
import sys
from pathlib import Path
import numpy as np
ROOT_DIR = Path(__file__).resolve().parents[1]
if str(ROOT_DIR) not in sys.path:
sys.path.insert(0, str(ROOT_DIR))
from config import TERRAIN_MODEL_CONFIG
from utils.terrain_model_converter import build_all_terrain_models
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="기존 structured.npz와 필터 마스크를 이용해 지표면 모델 15개만 생성합니다.",
)
parser.add_argument("--project-id", default="upload_sample", help="instance 하위 프로젝트 ID")
return parser.parse_args()
def clean_terrain_outputs(project_dir: Path) -> None:
project_dir = project_dir.resolve()
terrain_dir = (project_dir / "terrain_models").resolve()
if terrain_dir.parent != project_dir:
raise RuntimeError(f"삭제 대상이 프로젝트 폴더 밖입니다: {terrain_dir}")
if terrain_dir.exists():
shutil.rmtree(terrain_dir)
print(f"[정리] 삭제: {terrain_dir}")
def main() -> int:
args = parse_args()
project_dir = ROOT_DIR / "instance" / args.project_id
structured_path = project_dir / "structured.npz"
if not structured_path.exists():
raise FileNotFoundError(
f"{structured_path}가 없습니다. run_filters_and_terrain_models.py를 먼저 실행하세요."
)
masks: dict[str, np.ndarray] = {}
for source_filter in TERRAIN_MODEL_CONFIG["source_filters"]:
mask_path = project_dir / f"mask_{source_filter}.npy"
if not mask_path.exists():
raise FileNotFoundError(
f"{mask_path}가 없습니다. run_filters_and_terrain_models.py를 먼저 실행하세요."
)
masks[source_filter] = np.load(mask_path, mmap_mode="r")
print(f"[입력] 프로젝트={args.project_id}")
print(f"[입력] 구조화={structured_path}")
clean_terrain_outputs(project_dir)
print("[모델] 기존 결과 삭제 후 15개 조합 새로 생성")
with np.load(structured_path) as data:
manifest = build_all_terrain_models(
data,
masks,
project_dir / "terrain_models",
TERRAIN_MODEL_CONFIG,
force=True,
)
print(
f"[완료] 상태={manifest['status']} | 실패={manifest['failure_count']} | "
f"{manifest['duration_seconds']:.2f}초"
)
print(f"[결과] {project_dir / 'terrain_models'}")
return 0 if manifest["failure_count"] == 0 else 1
if __name__ == "__main__":
try:
raise SystemExit(main())
except KeyboardInterrupt:
print("\n[중단] 사용자가 실행을 중단했습니다.")
raise SystemExit(130)
except Exception as exc:
print(f"\n[오류] {exc}", file=sys.stderr)
raise SystemExit(1)