TTI / Release /scripts /prepare_reference_frames_pipeline.py
JosephBai's picture
Upload folder using huggingface_hub
857c2e9 verified
"""
One-command pipeline for LIBERO reference-frame preparation.
This script can:
1) optionally regenerate higher-resolution LIBERO trajectories, and
2) export expert-demo reference frames for agent view and optional wrist view.
Examples:
# Full pipeline (regen + agentview + wrist)
python scripts/prepare_reference_frames_pipeline.py \
--raw-datasets-root /data/libero/raw \
--working-root /data/libero/processed \
--reference-root /data/libero/reference_frames \
--include-wrist \
--overwrite
# Skip regeneration and use existing datasets directly
python scripts/prepare_reference_frames_pipeline.py \
--raw-datasets-root /data/libero/raw \
--working-root /data/libero/processed \
--reference-root /data/libero/reference_frames \
--skip-regen \
--overwrite
"""
from __future__ import annotations
import argparse
import subprocess
import sys
from pathlib import Path
from typing import List
DEFAULT_SUITES = ["libero_10", "libero_object", "libero_spatial", "libero_goal"]
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Prepare LIBERO reference frames for EVOLVE-VLA")
parser.add_argument(
"--raw-datasets-root",
type=Path,
required=True,
help="Root directory containing raw suite folders (libero_10/libero_object/libero_spatial/libero_goal)",
)
parser.add_argument(
"--working-root",
type=Path,
required=True,
help="Root directory used for regenerated datasets (one subfolder per suite)",
)
parser.add_argument(
"--reference-root",
type=Path,
required=True,
help="Root directory where exported reference frames are written",
)
parser.add_argument(
"--suites",
type=str,
default=",".join(DEFAULT_SUITES),
help="Comma-separated suites to process (default: libero_10,libero_object,libero_spatial,libero_goal)",
)
parser.add_argument(
"--skip-regen",
action="store_true",
help="Skip high-resolution regeneration and use raw datasets directly",
)
parser.add_argument(
"--include-wrist",
action="store_true",
help="Also export wrist-view references (eye_in_hand_rgb)",
)
parser.add_argument(
"--overwrite",
action="store_true",
help="Overwrite existing exported frame folders",
)
return parser.parse_args()
def run_cmd(cmd: List[str], cwd: Path) -> None:
print("\n[run]", " ".join(cmd))
subprocess.run(cmd, cwd=str(cwd), check=True)
def main() -> None:
args = parse_args()
script_dir = Path(__file__).resolve().parent
release_root = script_dir.parent
suites = [s.strip() for s in args.suites.split(",") if s.strip()]
if not suites:
raise SystemExit("No suite provided via --suites.")
regen_script = script_dir / "regenerate_libero_dataset.py"
expert_script = script_dir / "prepare_expert_demo.py"
if not regen_script.exists() or not expert_script.exists():
raise SystemExit("Required scripts missing in Release/scripts.")
raw_root = args.raw_datasets_root.expanduser().resolve()
working_root = args.working_root.expanduser().resolve()
ref_root = args.reference_root.expanduser().resolve()
working_root.mkdir(parents=True, exist_ok=True)
ref_root.mkdir(parents=True, exist_ok=True)
for suite in suites:
raw_dir = raw_root / suite
if not raw_dir.is_dir():
raise SystemExit(f"Raw suite directory not found: {raw_dir}")
if args.skip_regen:
dataset_dir = raw_dir
else:
dataset_dir = working_root / suite
regen_cmd = [
sys.executable,
str(regen_script),
"--libero_task_suite",
suite,
"--libero_raw_data_dir",
str(raw_dir),
"--libero_target_dir",
str(dataset_dir),
]
run_cmd(regen_cmd, cwd=release_root)
agentview_out = ref_root / "agentview"
agent_cmd = [
sys.executable,
str(expert_script),
"--libero_task_suite",
suite,
"--libero_raw_data_dir",
str(dataset_dir),
"--output_dir",
str(agentview_out),
]
if args.overwrite:
agent_cmd.append("--overwrite")
run_cmd(agent_cmd, cwd=release_root)
if args.include_wrist:
wrist_out = ref_root / "wrist"
wrist_cmd = [
sys.executable,
str(expert_script),
"--libero_task_suite",
suite,
"--libero_raw_data_dir",
str(dataset_dir),
"--output_dir",
str(wrist_out),
"--frame_key",
"eye_in_hand_rgb",
]
if args.overwrite:
wrist_cmd.append("--overwrite")
run_cmd(wrist_cmd, cwd=release_root)
print("\nReference-frame preparation finished.")
print("Set EVOLVE_LIBERO_REF_* env vars to suite-specific directories, for example:")
print(f" EVOLVE_LIBERO_REF_LIBERO_10={ref_root}/agentview/libero_10")
print(f" EVOLVE_LIBERO_REF_LIBERO_OBJECT={ref_root}/agentview/libero_object")
print(f" EVOLVE_LIBERO_REF_LIBERO_SPATIAL={ref_root}/agentview/libero_spatial")
print(f" EVOLVE_LIBERO_REF_LIBERO_GOAL={ref_root}/agentview/libero_goal")
if args.include_wrist:
print(f" EVOLVE_LIBERO_REF_LIBERO_OBJECT_WRIST={ref_root}/wrist/libero_object")
print(f" EVOLVE_LIBERO_REF_LIBERO_SPATIAL_WRIST={ref_root}/wrist/libero_spatial")
print(f" EVOLVE_LIBERO_REF_LIBERO_GOAL_WRIST={ref_root}/wrist/libero_goal")
if __name__ == "__main__":
main()