GraphAttributeLearning / scripts /data /extract_visual_genome.py
Ashish Mehta
Add data pipeline scripts and configuration files for Visual Genome processing
4687353
Raw
History Blame Contribute Delete
2.16 kB
from __future__ import annotations
import argparse
from pathlib import Path
import sys
REPO_ROOT = Path(__file__).resolve().parents[2]
SRC_DIR = REPO_ROOT / "src"
if str(SRC_DIR) not in sys.path:
sys.path.insert(0, str(SRC_DIR))
from data.io_utils import ensure_dir, extract_archive, load_yaml # noqa: E402
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Extract Visual Genome raw archives.")
parser.add_argument(
"--config",
type=Path,
default=REPO_ROOT / "configs" / "dataset.yaml",
help="Path to dataset config yaml.",
)
parser.add_argument(
"--force-extract",
action="store_true",
help="Force extraction even if marker exists.",
)
return parser.parse_args()
def main() -> None:
args = parse_args()
cfg = load_yaml(args.config)
dataset_cfg = cfg["dataset"]
extraction_cfg = cfg.get("extraction", {})
if not extraction_cfg.get("enabled", True):
print("Extraction disabled in config. Nothing to do.")
return
raw_root = REPO_ROOT / dataset_cfg["root_dir"]
ensure_dir(raw_root)
marker_file = raw_root / extraction_cfg.get("marker_file", ".extract_complete")
force_extract = args.force_extract or bool(extraction_cfg.get("force_extract", False))
safe_extract = bool(extraction_cfg.get("safe_extract", True))
if marker_file.exists() and not force_extract:
print(f"[skip] Extraction marker found: {marker_file}")
return
archives = extraction_cfg.get("archives", [])
if not archives:
raise RuntimeError("No extraction archives configured.")
for archive_name in archives:
archive_path = raw_root / archive_name
if not archive_path.exists():
raise RuntimeError(f"Archive missing: {archive_path}")
print(f"[extract] {archive_name}")
extract_archive(archive_path=archive_path, output_dir=raw_root, safe_extract=safe_extract)
marker_file.write_text("ok\n", encoding="utf-8")
print(f"[ok] Extraction completed. Marker written at {marker_file}")
if __name__ == "__main__":
main()