## OXE (Open-X Embodiment) Dataset Guide OXE refers to a collection of RLDS-format robot datasets accessible via TensorFlow Datasets (TFDS). This loader unifies many constituent datasets into a single pipeline for Robometer dataset generation. ### Overview - **TFDS-based**: Loads subsets by TFDS dataset names from a local TFDS `data_dir` - **Multi-source**: Iterates across several OXE datasets (Bridge, DROID, Language-Table, etc.) - **Language tasks**: Extracts task strings from step observations using common keys - **Frame selection**: Uses per-dataset `image_obs_keys` to pick RGB streams; filters all-black frames - **Standardized output**: Videos are resized and downsampled during generation - **Robot data**: Marked `is_robot=True`; actions are currently not exported ### Prerequisites - Python dependencies are already in this repo; ensure TFDS is available: `pip install tensorflow-datasets` - Local TFDS store containing the OXE datasets you want to use (see path examples below) - Optional: environment for pushing to HF Hub - `export HF_USERNAME=` ### Quick Start - Download the OXE datasets with [this repo](https://github.com/jesbu1/rlds_dataset_mod/tree/df1a698af48302b573bc880ac9fd24f602ba4e7a) (see `prepare_openx.sh`) - Using the provided config to generate individual datasets: ```bash uv run python dataset_upload/generate_hf_dataset.py --config_path=dataset_upload/configs/data_gen_configs/oxe.yaml --dataset.dataset_name oxe_ ``` - Using the provided script to generate all datasets: ```bash bash dataset_upload/data_scripts/oxe/gen_all_oxe.sh ``` - Manual CLI example: ```bash uv run dataset_upload/generate_hf_dataset.py --config_path=dataset_upload/configs/data_gen_configs/oxe.yaml \ --output.max_trajectories=10 \ --output.output_dir ~/scratch_data/oxe_rfm_test ``` ### Supported TFDS datasets (enabled in this loader) These names are loaded from the TFDS store (as `split="train"`). Each name must exist under your TFDS `data_dir`: - `austin_buds_dataset_converted_externally_to_rlds` - `dlr_edan_shared_control_converted_externally_to_rlds` - `iamlab_cmu_pickup_insert_converted_externally_to_rlds` - `toto` - `austin_sirius_dataset_converted_externally_to_rlds` - `droid` - `jaco_play` - `ucsd_kitchen_dataset_converted_externally_to_rlds` - `berkeley_cable_routing` - `fmb` - `language_table` ← special handling for byte-array language - `utaustin_mutex` - `berkeley_fanuc_manipulation` - `fractal20220817_data` - `stanford_hydra_dataset_converted_externally_to_rlds` - `viola` - `bridge_v2` - `furniture_bench_dataset_converted_externally_to_rlds` - `taco_play` Note: Additional per-dataset configs (e.g., wrist cams, multiple externals) are defined in `dataset_upload/dataset_helpers/oxe_helper.py` via `OXE_DATASET_CONFIGS`. The loader currently iterates only the list above. ### Configuration Edit `dataset_upload/configs/data_gen_configs/oxe.yaml`: ```yaml dataset: dataset_path: "/path/to/tensorflow_datasets/openx_datasets/" # TFDS data_dir dataset_name: oxe output: output_dir: datasets/oxe_rfm max_trajectories: 10 # cap processing (see notes below) max_frames: 64 shortest_edge_size: 240 use_video: true fps: 30 center_crop: false hub: push_to_hub: false hub_repo_id: your-username/oxe_rfm ``` ### What the loader extracts - Frames: For each episode and configured image key(s), a small callable (`OXEFrameLoader`) yields RGB frames on demand. - Task strings: Taken from first step using keys in priority order: - `natural_language_instruction`, `language_instruction`, `instruction` - For `language_table`, instruction bytes are decoded from a zero-padded array - Multiple viewpoints: The loader will create a trajectory per valid image key when available (e.g., primary/secondary/tertiary), skipping all-black streams. - Actions: Not exported yet for OXE in this loader (`actions=None`). - Labels: `is_robot=True`, `quality_label="successful"`. ### Video processing during generation Downstream, frames are converted to MP4 using the project’s optimized writer: - Downsample to `output.max_frames` - Resize by shortest edge to `output.shortest_edge_size` (default 240) - Optional center crop to square - Encode to H.264 with `yuv420p` for web compatibility ### TFDS data_dir layout and path Point `dataset.dataset_path` to your TFDS store containing OXE datasets, for example: ``` /data/tensorflow_datasets/openx_datasets/ ├── bridge_v2/ ├── droid/ ├── language_table/ ├── ... ``` The loader will call `tfds.load(, data_dir=, split="train")` for each supported name. ### Sample console output ``` ==================================================================================================== LOADING OXE DATASET ==================================================================================================== max_trajectories per task for OXE is: 10 Loading OXE dataset from: /data/tensorflow_datasets/openx_datasets ``` ### Troubleshooting - Missing TFDS datasets: Ensure the TFDS `data_dir` actually contains the OXE dataset(s) you reference. Download/build them ahead of time via the respective dataset release instructions. - Wrong dataset_name: Use `--dataset.dataset_name=oxe` so the OXE path is chosen. - Large runtime: Limit with `--output.max_trajectories` and reduce `--output.max_frames`. - Language decoding issues: Some datasets store instructions differently (e.g., `language_table`). The loader already handles the common cases. ### Notes and caveats - Per-task cap: The loader enforces a cap per task when provided. - Multi-camera episodes: A separate trajectory is created for each valid configured image stream. - Actions: Placeholder (`None`) for OXE currently; future updates may add per-dataset action decoding.