| #!/usr/bin/env bash |
| set -euo pipefail |
| IFS=$'\n\t' |
|
|
| export PATH="$HOME/.local/bin:$PATH" |
|
|
| SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" |
| OPENPI_ROOT="${OPENPI_ROOT:-$(cd -- "$SCRIPT_DIR/.." && pwd)}" |
|
|
| log() { |
| printf '%s %s\n' "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" "$*" |
| } |
|
|
| on_exit() { |
| local rc=$? |
| if [[ $rc -eq 0 ]]; then |
| log "Run exited successfully" |
| else |
| log "Run exited with status $rc" |
| fi |
| } |
|
|
| trap on_exit EXIT |
|
|
| require_env() { |
| local name="$1" |
| if [[ -z "${!name:-}" ]]; then |
| echo "Required environment variable is not set: $name" >&2 |
| exit 1 |
| fi |
| } |
|
|
| project_python_path() { |
| echo "$OPENPI_ROOT/.venv/bin/python" |
| } |
|
|
| hf_cli() { |
| local venv_python |
| venv_python="$(project_python_path)" |
| if [[ -x "$venv_python" ]]; then |
| "$venv_python" -m huggingface_hub.commands.huggingface_cli "$@" |
| return |
| fi |
| if command -v huggingface-cli >/dev/null 2>&1; then |
| huggingface-cli "$@" |
| return |
| fi |
| if command -v hf >/dev/null 2>&1; then |
| hf "$@" |
| return |
| fi |
| echo "No Hugging Face CLI found in PATH or project venv." >&2 |
| exit 1 |
| } |
|
|
| project_python() { |
| local venv_python |
| venv_python="$(project_python_path)" |
| if [[ -x "$venv_python" ]]; then |
| "$venv_python" "$@" |
| return |
| fi |
| python3 "$@" |
| } |
|
|
| ensure_hf_auth() { |
| if hf_cli whoami >/dev/null 2>&1; then |
| return 0 |
| fi |
| if [[ -n "${HF_TOKEN:-}" ]]; then |
| hf_cli login --token "$HF_TOKEN" >/dev/null |
| hf_cli whoami >/dev/null |
| return 0 |
| fi |
| echo "Hugging Face auth is not available. Set HF_TOKEN or login with 'huggingface-cli login' first." >&2 |
| exit 1 |
| } |
|
|
| export HF_HUB_ENABLE_HF_TRANSFER=0 |
|
|
| export ROOT="${ROOT:-$HOME/pi05prep-work}" |
| export INBOX="${INBOX:-$ROOT/inbox}" |
| export TMPDIR="${TMPDIR:-$ROOT/tmp}" |
| export LOGDIR="${LOGDIR:-$ROOT/logs}" |
| export MODEL_REPO="${MODEL_REPO:-lsnu/pi05tests-openpi-multiarm}" |
| export HF_HOME="${HF_HOME:-$ROOT/hf-home}" |
| export HF_HUB_CACHE="${HF_HUB_CACHE:-$HF_HOME/hub}" |
| export HF_DATASETS_CACHE="${HF_DATASETS_CACHE:-$HF_HOME/datasets}" |
| export HF_LEROBOT_HOME="${HF_LEROBOT_HOME:-$HF_HOME/lerobot}" |
| export STATS_BATCH_SIZE="${STATS_BATCH_SIZE:-64}" |
| export STATS_NUM_WORKERS="${STATS_NUM_WORKERS:-0}" |
|
|
| |
| unset LEROBOT_HOME || true |
|
|
| export DP_TRAIN="${DP_TRAIN:-lsnu/twin_dual_push_256_train}" |
| export DP_VAL="${DP_VAL:-lsnu/twin_dual_push_256_val}" |
| export DP_TEST="${DP_TEST:-lsnu/twin_dual_push_256_test}" |
| export DP128_TRAIN="${DP128_TRAIN:-lsnu/twin_dual_push_128_train}" |
| export DP128_VAL="${DP128_VAL:-lsnu/twin_dual_push_128_val}" |
| export DP128_TEST="${DP128_TEST:-lsnu/twin_dual_push_128_test}" |
|
|
| export HO_TRAIN="${HO_TRAIN:-lsnu/twin_handover_256_train}" |
| export HO_VAL="${HO_VAL:-lsnu/twin_handover_256_val}" |
| export HO_TEST="${HO_TEST:-lsnu/twin_handover_256_test}" |
| export HOE_TRAIN="${HOE_TRAIN:-lsnu/twin_handover_item_easy_256_train}" |
| export HOE_VAL="${HOE_VAL:-lsnu/twin_handover_item_easy_256_val}" |
| export HOE_TEST="${HOE_TEST:-lsnu/twin_handover_item_easy_256_test}" |
|
|
| export SR_TRAIN="${SR_TRAIN:-lsnu/twin_straighten_rope_256_train}" |
| export SR_VAL="${SR_VAL:-lsnu/twin_straighten_rope_256_val}" |
| export SR_TEST="${SR_TEST:-lsnu/twin_straighten_rope_256_test}" |
| export LB_TRAIN="${LB_TRAIN:-lsnu/twin_lift_ball_256_train}" |
| export LB_VAL="${LB_VAL:-lsnu/twin_lift_ball_256_val}" |
| export LB_TEST="${LB_TEST:-lsnu/twin_lift_ball_256_test}" |
| export LT_TRAIN="${LT_TRAIN:-lsnu/twin_lift_tray_256_train}" |
| export LT_VAL="${LT_VAL:-lsnu/twin_lift_tray_256_val}" |
| export LT_TEST="${LT_TEST:-lsnu/twin_lift_tray_256_test}" |
| export PL_TRAIN="${PL_TRAIN:-lsnu/twin_pick_laptop_256_train}" |
| export PL_VAL="${PL_VAL:-lsnu/twin_pick_laptop_256_val}" |
| export PL_TEST="${PL_TEST:-lsnu/twin_pick_laptop_256_test}" |
| export PP_TRAIN="${PP_TRAIN:-lsnu/twin_pick_plate_256_train}" |
| export PP_VAL="${PP_VAL:-lsnu/twin_pick_plate_256_val}" |
| export PP_TEST="${PP_TEST:-lsnu/twin_pick_plate_256_test}" |
| export PB_TRAIN="${PB_TRAIN:-lsnu/twin_push_box_256_train}" |
| export PB_VAL="${PB_VAL:-lsnu/twin_push_box_256_val}" |
| export PB_TEST="${PB_TEST:-lsnu/twin_push_box_256_test}" |
| export PBF_TRAIN="${PBF_TRAIN:-lsnu/twin_put_bottle_in_fridge_256_train}" |
| export PBF_VAL="${PBF_VAL:-lsnu/twin_put_bottle_in_fridge_256_val}" |
| export PBF_TEST="${PBF_TEST:-lsnu/twin_put_bottle_in_fridge_256_test}" |
| export PID_TRAIN="${PID_TRAIN:-lsnu/twin_put_item_in_drawer_256_train}" |
| export PID_VAL="${PID_VAL:-lsnu/twin_put_item_in_drawer_256_val}" |
| export PID_TEST="${PID_TEST:-lsnu/twin_put_item_in_drawer_256_test}" |
| export SWEEP_TRAIN="${SWEEP_TRAIN:-lsnu/twin_sweep_to_dustpan_256_train}" |
| export SWEEP_VAL="${SWEEP_VAL:-lsnu/twin_sweep_to_dustpan_256_val}" |
| export SWEEP_TEST="${SWEEP_TEST:-lsnu/twin_sweep_to_dustpan_256_test}" |
| export OVEN_TRAIN="${OVEN_TRAIN:-lsnu/twin_take_tray_out_of_oven_256_train}" |
| export OVEN_VAL="${OVEN_VAL:-lsnu/twin_take_tray_out_of_oven_256_val}" |
| export OVEN_TEST="${OVEN_TEST:-lsnu/twin_take_tray_out_of_oven_256_test}" |
|
|
| mkdir -p "$INBOX" "$TMPDIR" "$LOGDIR" "$HF_HOME" "$HF_HUB_CACHE" "$HF_DATASETS_CACHE" "$HF_LEROBOT_HOME" |
|
|
| prepare_openpi_env() { |
| require_env HF_TOKEN |
| cd "$OPENPI_ROOT" |
|
|
| if rg -q 'jax\[cuda12\]==0\.5\.3' pyproject.toml; then |
| echo "pyproject.toml still points at jax[cuda12]; patch it before running." >&2 |
| exit 1 |
| fi |
|
|
| log "Authenticating Hugging Face CLI" |
| hf_cli login --token "$HF_TOKEN" |
| hf_cli whoami |
|
|
| log "Syncing uv environment" |
| GIT_LFS_SKIP_SMUDGE=1 uv sync --python 3.11 |
| GIT_LFS_SKIP_SMUDGE=1 uv pip install -e . |
|
|
| log "LeRobot cache root: $HF_LEROBOT_HOME" |
| } |
|
|
| download_and_verify() { |
| local remote_path="$1" |
| project_python - "$remote_path" "$INBOX" "$MODEL_REPO" <<'PY' |
| import hashlib |
| import json |
| import os |
| import sys |
| from pathlib import Path |
|
|
| from huggingface_hub import HfApi, hf_hub_download |
|
|
| remote_path, inbox, repo_id = sys.argv[1:4] |
| api = HfApi() |
|
|
| parent = str(Path(remote_path).parent) |
| info = None |
| for item in api.list_repo_tree(repo_id, repo_type="model", path_in_repo=parent, recursive=False, expand=True): |
| if getattr(item, "path", None) == remote_path: |
| info = item |
| break |
| if info is None: |
| raise SystemExit(f"Remote file not found: {remote_path}") |
| if info.lfs is None: |
| raise SystemExit(f"Expected an LFS file for {remote_path}") |
|
|
| local_path = hf_hub_download( |
| repo_id=repo_id, |
| repo_type="model", |
| filename=remote_path, |
| local_dir=inbox, |
| ) |
|
|
| size = os.path.getsize(local_path) |
| if size != info.size: |
| raise SystemExit(f"Size mismatch for {remote_path}: local={size} remote={info.size}") |
|
|
| digest = hashlib.sha256() |
| with open(local_path, "rb") as f: |
| for chunk in iter(lambda: f.read(16 * 1024 * 1024), b""): |
| digest.update(chunk) |
| sha256 = digest.hexdigest() |
| if sha256 != info.lfs.sha256: |
| raise SystemExit( |
| f"SHA256 mismatch for {remote_path}: local={sha256} remote={info.lfs.sha256}" |
| ) |
|
|
| print(local_path) |
| print( |
| json.dumps( |
| { |
| "remote_path": remote_path, |
| "local_path": local_path, |
| "size": size, |
| "sha256": sha256, |
| "commit": info.last_commit.oid if info.last_commit else None, |
| } |
| ) |
| ) |
| PY |
| } |
|
|
| probe_squashfs() { |
| local local_file="$1" |
| local log_file="$2" |
| log "Inspecting squashfs archive: $local_file" |
| unsquashfs -s "$local_file" | tee "$log_file" |
| } |
|
|
| convert_local() { |
| local local_file="$1" |
| local repo_id="$2" |
| local log_file="$3" |
| log "Converting $local_file -> $repo_id" |
| ( |
| cd "$OPENPI_ROOT" |
| .venv/bin/python scripts/convert_twin_squashfs_to_lerobot.py \ |
| --squashfs-path "$local_file" \ |
| --repo-id "$repo_id" \ |
| --verbose |
| ) >"$log_file" 2>&1 |
| log "Conversion log written to: $log_file" |
| } |
|
|
| verify_local_dataset() { |
| local repo_id="$1" |
| local log_file="$2" |
| log "Verifying local LeRobot dataset: $repo_id" |
| ( |
| cd "$OPENPI_ROOT" |
| .venv/bin/python - "$repo_id" <<'PY' |
| import json |
| import sys |
| from pathlib import Path |
|
|
| import pyarrow.parquet as pq |
| from lerobot.common.constants import HF_LEROBOT_HOME |
|
|
| repo_id = sys.argv[1] |
| root = Path(HF_LEROBOT_HOME) / repo_id |
| if not root.exists(): |
| raise SystemExit(f"Local dataset directory not found: {root}") |
|
|
| info_path = root / "meta" / "info.json" |
| episodes_path = root / "meta" / "episodes.jsonl" |
| episodes_stats_path = root / "meta" / "episodes_stats.jsonl" |
| if not info_path.exists(): |
| raise SystemExit(f"Missing info.json: {info_path}") |
| if not episodes_path.exists(): |
| raise SystemExit(f"Missing episodes.jsonl: {episodes_path}") |
| if not episodes_stats_path.exists(): |
| raise SystemExit(f"Missing episodes_stats.jsonl: {episodes_stats_path}") |
|
|
| parquet_files = sorted(root.rglob("*.parquet")) |
| if not parquet_files: |
| raise SystemExit(f"No parquet files found under {root}") |
|
|
| table = pq.read_table(parquet_files[0]) |
| columns = set(table.column_names) |
| required = {"front_image", "wrist_left_image", "wrist_right_image", "state", "action", "task_index"} |
| missing = sorted(required - columns) |
| if missing: |
| raise SystemExit(f"Missing required parquet columns in {parquet_files[0]}: {missing}") |
|
|
| state_type = str(table.schema.field("state").type) |
| action_type = str(table.schema.field("action").type) |
| if "16" not in state_type: |
| raise SystemExit(f"Unexpected state schema: {state_type}") |
| if "16" not in action_type: |
| raise SystemExit(f"Unexpected action schema: {action_type}") |
|
|
| info = json.loads(info_path.read_text()) |
| features = info.get("features", {}) |
| if features.get("state", {}).get("shape") != [16]: |
| raise SystemExit(f"Unexpected state feature shape in {info_path}: {features.get('state')}") |
| if features.get("action", {}).get("shape") != [16]: |
| raise SystemExit(f"Unexpected action feature shape in {info_path}: {features.get('action')}") |
|
|
| episode_lines = episodes_path.read_text().splitlines() |
| episodes_stats_lines = episodes_stats_path.read_text().splitlines() |
| if not episode_lines: |
| raise SystemExit(f"No episodes found in {episodes_path}") |
| if not episodes_stats_lines: |
| raise SystemExit(f"No episode stats found in {episodes_stats_path}") |
|
|
| episodes = info.get("total_episodes") |
| frames = info.get("total_frames") |
| if episodes is not None and episodes <= 0: |
| raise SystemExit(f"Invalid episode count in {info_path}: {episodes}") |
| if frames is not None and frames <= 0: |
| raise SystemExit(f"Invalid frame count in {info_path}: {frames}") |
|
|
| print( |
| json.dumps( |
| { |
| "repo_id": repo_id, |
| "root": str(root), |
| "parquet_files": len(parquet_files), |
| "first_parquet": str(parquet_files[0]), |
| "columns": sorted(columns), |
| "total_episodes": episodes, |
| "total_frames": frames, |
| "episode_lines": len(episode_lines), |
| "episodes_stats_lines": len(episodes_stats_lines), |
| } |
| ) |
| ) |
| PY |
| ) >"$log_file" 2>&1 |
| cat "$log_file" |
| } |
|
|
| upload_dataset() { |
| local repo_id="$1" |
| log "Uploading dataset repo: $repo_id" |
| hf_cli upload-large-folder "$repo_id" "$HF_LEROBOT_HOME/$repo_id" --repo-type dataset --num-workers 16 |
| } |
|
|
| verify_remote_dataset() { |
| local repo_id="$1" |
| project_python - "$repo_id" <<'PY' |
| import json |
| import sys |
|
|
| from huggingface_hub import HfApi |
|
|
| repo_id = sys.argv[1] |
| api = HfApi() |
| paths = [item.path for item in api.list_repo_tree(repo_id, repo_type="dataset", recursive=True, expand=True)] |
|
|
| required = {"meta/info.json", "meta/episodes.jsonl", "meta/episodes_stats.jsonl"} |
| missing = sorted(required - set(paths)) |
| if missing: |
| raise SystemExit(f"Remote dataset is missing required files: {missing}") |
|
|
| parquet_files = [p for p in paths if p.endswith(".parquet")] |
| video_files = [p for p in paths if p.endswith(".mp4")] |
| if not parquet_files: |
| raise SystemExit(f"Remote dataset {repo_id} has no parquet files") |
|
|
| print( |
| json.dumps( |
| { |
| "repo_id": repo_id, |
| "files": len(paths), |
| "parquet_files": len(parquet_files), |
| "video_files": len(video_files), |
| } |
| ) |
| ) |
| PY |
| } |
|
|
| stats_one() { |
| local config_name="$1" |
| local repo_id="$2" |
| log "Computing norm stats: $config_name / $repo_id" |
| ( |
| cd "$OPENPI_ROOT" |
| PYTHONUNBUFFERED=1 .venv/bin/python -u scripts/compute_norm_stats_repo.py \ |
| --config-name "$config_name" \ |
| --repo-id "$repo_id" \ |
| --batch-size "$STATS_BATCH_SIZE" \ |
| --num-workers "$STATS_NUM_WORKERS" \ |
| --assets-base-dir ./assets |
| ) >"$LOGDIR/${config_name//\//_}__${repo_id//\//_}.stats.log" 2>&1 |
| tail -n 40 "$LOGDIR/${config_name//\//_}__${repo_id//\//_}.stats.log" || true |
| } |
|
|
| upload_stats() { |
| local config_name="$1" |
| local repo_id="$2" |
| local src_dir="$OPENPI_ROOT/assets/$config_name/$repo_id" |
| local dst_dir="openpi/assets/$config_name/$repo_id" |
| log "Uploading norm stats: $MODEL_REPO::$dst_dir" |
| hf_cli upload "$MODEL_REPO" "$src_dir" "$dst_dir" |
| } |
|
|
| verify_remote_stats() { |
| local config_name="$1" |
| local repo_id="$2" |
| project_python - "$MODEL_REPO" "$config_name" "$repo_id" <<'PY' |
| import sys |
|
|
| from huggingface_hub import HfApi |
|
|
| model_repo, config_name, repo_id = sys.argv[1:4] |
| target = f"openpi/assets/{config_name}/{repo_id}/norm_stats.json" |
| api = HfApi() |
| paths = [item.path for item in api.list_repo_tree(model_repo, repo_type="model", recursive=True, expand=True)] |
| if target not in paths: |
| raise SystemExit(f"Missing remote norm stats file: {target}") |
| print(target) |
| PY |
| } |
|
|
| cleanup_local() { |
| local local_file="$1" |
| local repo_id="$2" |
| log "Cleaning local artifacts for $repo_id" |
| rm -f "$local_file" |
| rm -rf "$HF_LEROBOT_HOME/$repo_id" |
| } |
|
|
| process_train_split() { |
| local remote_path="$1" |
| local repo_id="$2" |
| local prefix="$3" |
|
|
| if verify_remote_dataset "$repo_id" >"$LOGDIR/${prefix}_verify_remote.json" 2>/dev/null; then |
| log "Remote dataset already verified; skipping conversion/upload for $repo_id" |
| else |
| log "Train split download+verify: $remote_path -> $repo_id" |
| mapfile -t dl_out < <(download_and_verify "$remote_path") |
| local local_file="${dl_out[0]}" |
| local meta_json="${dl_out[1]}" |
| log "Train split download verified: $local_file" |
| echo "$meta_json" | tee "$LOGDIR/${prefix}_download.json" |
| probe_squashfs "$local_file" "$LOGDIR/${prefix}_unsquashfs.txt" |
| convert_local "$local_file" "$repo_id" "$LOGDIR/${prefix}_convert.log" |
| verify_local_dataset "$repo_id" "$LOGDIR/${prefix}_verify_local.json" |
| upload_dataset "$repo_id" |
| verify_remote_dataset "$repo_id" | tee "$LOGDIR/${prefix}_verify_remote.json" |
| fi |
|
|
| if verify_remote_stats "pi05_twin_bimanual_finetune" "$repo_id" >"$LOGDIR/${prefix}_baseline_stats_remote.txt" 2>/dev/null; then |
| log "Baseline norm stats already verified remotely; skipping compute/upload for $repo_id" |
| else |
| stats_one "pi05_twin_bimanual_finetune" "$repo_id" |
| upload_stats "pi05_twin_bimanual_finetune" "$repo_id" |
| verify_remote_stats "pi05_twin_bimanual_finetune" "$repo_id" | tee "$LOGDIR/${prefix}_baseline_stats_remote.txt" |
| fi |
|
|
| if verify_remote_stats "pi05_twin_bimanual_parallel_finetune" "$repo_id" >"$LOGDIR/${prefix}_parallel_stats_remote.txt" 2>/dev/null; then |
| log "Parallel norm stats already verified remotely; skipping compute/upload for $repo_id" |
| else |
| stats_one "pi05_twin_bimanual_parallel_finetune" "$repo_id" |
| upload_stats "pi05_twin_bimanual_parallel_finetune" "$repo_id" |
| verify_remote_stats "pi05_twin_bimanual_parallel_finetune" "$repo_id" | tee "$LOGDIR/${prefix}_parallel_stats_remote.txt" |
| fi |
|
|
| if [[ -n "${local_file:-}" ]]; then |
| cleanup_local "$local_file" "$repo_id" |
| fi |
| } |
|
|
| process_eval_split() { |
| local remote_path="$1" |
| local repo_id="$2" |
| local prefix="$3" |
|
|
| if verify_remote_dataset "$repo_id" >"$LOGDIR/${prefix}_verify_remote.json" 2>/dev/null; then |
| log "Remote eval dataset already verified; skipping conversion/upload for $repo_id" |
| else |
| log "Eval split download+verify: $remote_path -> $repo_id" |
| mapfile -t dl_out < <(download_and_verify "$remote_path") |
| local local_file="${dl_out[0]}" |
| local meta_json="${dl_out[1]}" |
| log "Eval split download verified: $local_file" |
| echo "$meta_json" | tee "$LOGDIR/${prefix}_download.json" |
| probe_squashfs "$local_file" "$LOGDIR/${prefix}_unsquashfs.txt" |
| convert_local "$local_file" "$repo_id" "$LOGDIR/${prefix}_convert.log" |
| verify_local_dataset "$repo_id" "$LOGDIR/${prefix}_verify_local.json" |
| upload_dataset "$repo_id" |
| verify_remote_dataset "$repo_id" | tee "$LOGDIR/${prefix}_verify_remote.json" |
| cleanup_local "$local_file" "$repo_id" |
| fi |
| } |
|
|
| process_task() { |
| local task_name="$1" |
| local train_remote="$2" |
| local train_repo="$3" |
| local val_remote="$4" |
| local val_repo="$5" |
| local test_remote="$6" |
| local test_repo="$7" |
|
|
| log "=== Task: $task_name / train split ===" |
| process_train_split "$train_remote" "$train_repo" "${task_name}_train" |
|
|
| log "=== Task: $task_name / val+test splits ===" |
| process_eval_split "$val_remote" "$val_repo" "${task_name}_val" & |
| local val_pid=$! |
| process_eval_split "$test_remote" "$test_repo" "${task_name}_test" & |
| local test_pid=$! |
| wait "$val_pid" |
| wait "$test_pid" |
| } |
|
|
| main() { |
| if [[ "${SKIP_PREPARE:-0}" == "1" ]]; then |
| ensure_hf_auth |
| log "Skipping environment bootstrap; using HF_LEROBOT_HOME=$HF_LEROBOT_HOME" |
| else |
| prepare_openpi_env |
| fi |
|
|
| process_task \ |
| "dual_push_buttons_128" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_128/bimanual_dual_push_buttons.train.squashfs" \ |
| "$DP128_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_128/bimanual_dual_push_buttons.val.squashfs" \ |
| "$DP128_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_128/bimanual_dual_push_buttons.test.squashfs" \ |
| "$DP128_TEST" |
|
|
| process_task \ |
| "dual_push_buttons" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256_dual_push_buttons/bimanual_dual_push_buttons.train.squashfs" \ |
| "$DP_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256_dual_push_buttons/bimanual_dual_push_buttons.val.squashfs" \ |
| "$DP_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256_dual_push_buttons/bimanual_dual_push_buttons.test.squashfs" \ |
| "$DP_TEST" |
|
|
| process_task \ |
| "handover_item" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_handover_item/bimanual_handover_item.train.squashfs" \ |
| "$HO_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_handover_item/bimanual_handover_item.val.squashfs" \ |
| "$HO_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_handover_item/bimanual_handover_item.test.squashfs" \ |
| "$HO_TEST" |
|
|
| process_task \ |
| "handover_item_easy" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_handover_item_easy/bimanual_handover_item_easy.train.squashfs" \ |
| "$HOE_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_handover_item_easy/bimanual_handover_item_easy.val.squashfs" \ |
| "$HOE_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_handover_item_easy/bimanual_handover_item_easy.test.squashfs" \ |
| "$HOE_TEST" |
|
|
| process_task \ |
| "lift_ball" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_lift_ball/bimanual_lift_ball.train.squashfs" \ |
| "$LB_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_lift_ball/bimanual_lift_ball.val.squashfs" \ |
| "$LB_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_lift_ball/bimanual_lift_ball.test.squashfs" \ |
| "$LB_TEST" |
|
|
| process_task \ |
| "lift_tray" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_lift_tray/bimanual_lift_tray.train.squashfs" \ |
| "$LT_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_lift_tray/bimanual_lift_tray.val.squashfs" \ |
| "$LT_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_lift_tray/bimanual_lift_tray.test.squashfs" \ |
| "$LT_TEST" |
|
|
| process_task \ |
| "pick_laptop" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_pick_laptop/bimanual_pick_laptop.train.squashfs" \ |
| "$PL_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_pick_laptop/bimanual_pick_laptop.val.squashfs" \ |
| "$PL_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_pick_laptop/bimanual_pick_laptop.test.squashfs" \ |
| "$PL_TEST" |
|
|
| process_task \ |
| "pick_plate" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_pick_plate/bimanual_pick_plate.train.squashfs" \ |
| "$PP_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_pick_plate/bimanual_pick_plate.val.squashfs" \ |
| "$PP_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_pick_plate/bimanual_pick_plate.test.squashfs" \ |
| "$PP_TEST" |
|
|
| process_task \ |
| "push_box" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_push_box/bimanual_push_box.train.squashfs" \ |
| "$PB_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_push_box/bimanual_push_box.val.squashfs" \ |
| "$PB_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_push_box/bimanual_push_box.test.squashfs" \ |
| "$PB_TEST" |
|
|
| process_task \ |
| "put_bottle_in_fridge" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_put_bottle_in_fridge/bimanual_put_bottle_in_fridge.train.squashfs" \ |
| "$PBF_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_put_bottle_in_fridge/bimanual_put_bottle_in_fridge.val.squashfs" \ |
| "$PBF_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_put_bottle_in_fridge/bimanual_put_bottle_in_fridge.test.squashfs" \ |
| "$PBF_TEST" |
|
|
| process_task \ |
| "put_item_in_drawer" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_put_item_in_drawer/bimanual_put_item_in_drawer.train.squashfs" \ |
| "$PID_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_put_item_in_drawer/bimanual_put_item_in_drawer.val.squashfs" \ |
| "$PID_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_put_item_in_drawer/bimanual_put_item_in_drawer.test.squashfs" \ |
| "$PID_TEST" |
|
|
| process_task \ |
| "straighten_rope" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_straighten_rope/bimanual_straighten_rope.train.squashfs" \ |
| "$SR_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_straighten_rope/bimanual_straighten_rope.val.squashfs" \ |
| "$SR_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_straighten_rope/bimanual_straighten_rope.test.squashfs" \ |
| "$SR_TEST" |
|
|
| process_task \ |
| "sweep_to_dustpan" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_sweep_to_dustpan/bimanual_sweep_to_dustpan.train.squashfs" \ |
| "$SWEEP_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_sweep_to_dustpan/bimanual_sweep_to_dustpan.val.squashfs" \ |
| "$SWEEP_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_sweep_to_dustpan/bimanual_sweep_to_dustpan.test.squashfs" \ |
| "$SWEEP_TEST" |
|
|
| process_task \ |
| "take_tray_out_of_oven" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_take_tray_out_of_oven/bimanual_take_tray_out_of_oven.train.squashfs" \ |
| "$OVEN_TRAIN" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_take_tray_out_of_oven/bimanual_take_tray_out_of_oven.val.squashfs" \ |
| "$OVEN_VAL" \ |
| "datasets/benchmarks/peract2_twin/bimanual/image_size_256/bimanual_take_tray_out_of_oven/bimanual_take_tray_out_of_oven.test.squashfs" \ |
| "$OVEN_TEST" |
|
|
| log "All tasks completed" |
| } |
|
|
| if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then |
| main "$@" |
| fi |
|
|