Volver a Learn

HDF5 vs RLDS vs LeRobot: Comparado de los formatos del conjunto de datos del robot

Comparación completa de los formatos de conjunto de datos de robots <unk> HDF5, RLDS, LeRobot. Cuándo usar cada uno, cómo convertir entre ellos y cómo RCSV entrega sus datos.

[← Guías]

La guía definitiva para los ingenieros de robótica que necesitan entender, producir y convertir entre los tres formatos dominantes de conjuntos de datos de robots utilizados por ACT, Octo, LeRobot y Open X-Embodiment. Actualizado para 2026.

Por qué es importante el formato de los conjuntos de datos

El formato de los datos de entrenamiento de robots no es un detalle que puedas posponer.

1. Compatibilidad del marco de formación

Cada marco de entrenamiento principal espera datos en un formato específico. ACT y Política de difusión leen HDF5 de forma nativa. Octo y los guiones de mezcla de datos Open X-Embodiment esperan RLDS/TFRecord. La biblioteca de entrenamiento LeRobot lee LeRobot Parquet. Si sus datos están en el formato equivocado, está escribiendo scripts de conversión antes de poder entrenar y los scripts de conversión son donde se esconden los errores sutiles de corrupción de datos.

2. Eficiencia de almacenamiento y patrones de acceso

Un conjunto de datos de 500 episodios con 3 cámaras a 30 fps ocupa 25-50 GB en HDF5 crudo, 15-30 GB en HDF5 comprimido, 3-8 GB en LeRobot (vidéo MP4) o 20-40 GB en RLDS / TFRecord. La diferencia de almacenamiento importa para los costos de alojamiento en la nube, los tiempos de descarga y la velocidad de carga de datos de entrenamiento. Pero la eficiencia de almacenamiento se opone a la fidelidad de los datos: la compresión de MP4 de LeRobot es perdida, mientras que HDF5 y RLDS conservan valores de píxeles exactos.

3. Comunidad y participación

Si desea compartir su conjunto de datos públicamente, el formato LeRobot le da una sola orden de carga a Hugging Face Hub con visualización web integrada. RLDS le da compatibilidad con el ecosistema Open X-Embodiment (50+ conjuntos de datos, 22 tipos de robots). HDF5 le da la máxima flexibilidad pero no una plataforma de compartir estandarizada.

Nuestra recomendación: Utilice HDF5 como su formato de recogida y almacenamiento de la fuente de la verdad. Convertirse en LeRobot para compartir y en RLDS para entrenamiento de encarnación cruzada. Esto le da lo mejor de los tres ecosistemas sin las desventajas de ningún formato de bloqueo.

HDF5: El estándar de oro para el almacenamiento de datos de robots

HDF5 (Hirarchical Data Format 5) almacena datos en una jerarquía similar a un sistema de archivos de grupos (directorios) y conjuntos de datos (arrayes). Fue desarrollado originalmente para la computación científica y se ha convertido en el estándar de facto para los datos de demostración de robots gracias a su flexibilidad, herramientas maduras y acceso aleatorio eficiente.

Estructura de los episodios

El diseño estándar ACT/ALOHA HDF5 almacena cada episodio como un grupo de nivel superior con observaciones, acciones y atributos de metadatos:

/episode_0/
    observations/
        images/
            cam_high          # uint8 [T x 480 x 640 x 3]   overhead camera
            cam_wrist_left    # uint8 [T x 480 x 640 x 3]   left wrist camera
            cam_wrist_right   # uint8 [T x 480 x 640 x 3]   right wrist camera
        qpos                  # float32 [T x 14]  joint positions (7 per arm)
        qvel                  # float32 [T x 14]  joint velocities
    action                    # float32 [T x 14]  leader arm positions (supervision signal)
    attrs:
        task = "pick_cube_bimanual"
        operator_id = "op_03"
        success = True
        num_timesteps = 450
        timestamp = "2026-04-10T14:32:00Z"

Lectura de HDF5 con Python

La lectura de episodios con h5py es sencilla. Aquí hay un ejemplo completo que carga las observaciones y acciones de un episodio:

import h5py
import numpy as np

# Open a single episode file
with h5py.File("episode_0.hdf5", "r") as f:
    # Read joint positions and actions
    qpos = f["/observations/qpos"][:]        # shape: [T, 14]
    action = f["/action"][:]                  # shape: [T, 14]

    # Read a specific camera frame (random access)
    frame_100 = f["/observations/images/cam_high"][100]  # shape: [480, 640, 3]

    # Read all frames for a camera
    all_frames = f["/observations/images/cam_high"][:]   # shape: [T, 480, 640, 3]

    # Read metadata
    task = f.attrs.get("task", "unknown")
    success = f.attrs.get("success", False)

    print(f"Task: {task}, Success: {success}")
    print(f"Episode length: {qpos.shape[0]} timesteps")
    print(f"Joint positions range: [{qpos.min():.3f}, {qpos.max():.3f}]")

Las mejores prácticas de HDF5

  • ** Chunking:** Siempre fragmenta los conjuntos de datos a lo largo del eje temporal. Utilice chunk_size=1 para el acceso aleatorio (debugging, visualización) o chunk_size=32 para la eficiencia de lectura secuencial (entrenamiento). Nunca almacene datos de imagen no fragmentos se carga como un solo bloque monolitico.
  • ** Compresión:** Utilice LZF para datos de imagen (3-5 veces más rápido que GZIP en proporciones similares para los marcos de cámara). Utilice GZIP nivel 4 para trayectorias conjuntas (proporción más alta, velocidad no crítica). No comprime imágenes en el momento de la recopilación aplicar compresión en el archivo final después de la validación de calificación.
  • ** Atributos de metadatos:** Almacenar metadatos de episodios como atributos del grupo HDF5: T10, T11, T12, T13. Incluir un atributo T14 en la raíz de archivo para rastrear los cambios de formato.
  • Un archivo por episodio frente a un archivo por conjunto de datos: Para conjuntos de datos menores a 1.000 episodios, un archivo HDF5 por episodio es más sencillo para el procesamiento paralelo y la recopilación parcial. Para conjuntos de datos más grandes, considere empacar 50-100 episodios por archivo para reducir el gasto general del sistema de archivos.

HDF5 Pros y Cons

Las cosas están bien.

  • Soporte de bibliotecas maduras (h5py, HDFView, Julia, C++)
  • Acceso aleatorio eficiente a cualquier marco
  • Esquema flexible agregar tipos de sensores personalizados libremente
  • El almacenamiento sin pérdidas conserva los valores exactos de los píxeles
  • Nativo de la política de ACT, ALOHA y difusión
  • Inspectable por el hombre con interfaz gráfica HDFView

Cons

  • No se incluye versiones o seguimiento de procedencia
  • No se puede transmitir en la nube (debe descargar el archivo completo)
  • Tamaños de archivos grandes sin compresión de vídeo
  • Incoherencias de esquemas entre laboratorios
  • No hay plataforma de intercambio estandarizada
  • Las escrituras concurrentes requieren un bloqueo cuidadoso

RLDS: La norma de los cuerpos X abiertos

RLDS (Reinforcement Learning Datasets) es el formato utilizado por el conjunto de datos Open X-Embodiment la mayor colección de datos de manipulación de robots con 2.2M+ episodios en 22 tipos de robots y 527K trayectorias únicas.

Plan de RLDS

Cada conjunto de datos RLDS es definido por un TensorFlow DatasetBuilder que especifica el esquema de características. Los episodios se representan como secuencias de pasos, donde cada paso contiene:

# Standard RLDS step structure
step = {
    "observation": {
        "image": tf.uint8,         # shape: [H, W, C]
        "state": tf.float32,       # shape: [D]  (joint positions + gripper)
        "wrist_image": tf.uint8,   # shape: [H, W, C]  (optional)
    },
    "action": tf.float32,          # shape: [D]
    "reward": tf.float32,          # scalar
    "discount": tf.float32,        # scalar (typically 1.0)
    "is_terminal": tf.bool,        # True on terminal state
    "is_first": tf.bool,           # True on first step
    "is_last": tf.bool,            # True on last step
    "language_instruction": tf.string,  # natural language task description
}

Carga de datos RLDS

import tensorflow_datasets as tfds

# Load an Open X-Embodiment dataset
dataset = tfds.load("berkeley_autolab_ur5", split="train")

# Iterate over episodes
for episode in dataset.take(5):
    steps = episode["steps"]
    for step in steps:
        image = step["observation"]["image"].numpy()    # [H, W, 3]
        state = step["observation"]["state"].numpy()     # [D]
        action = step["action"].numpy()                  # [D]
        instruction = step["language_instruction"].numpy().decode()
        print(f"Instruction: {instruction}")
        print(f"State shape: {state.shape}, Action shape: {action.shape}")
        break  # just first step

Los pros y los contras de RLDS

Las cosas están bien.

  • El esquema estandarizado permite la formación de conjuntos de datos
  • Transmisiones eficientes a través de las tuberías de tf.data
  • Nativo en la nube (transmitido desde GCS/S3 sin descarga)
  • 50 conjuntos de datos disponibles en formato compatible
  • Nativo de la mezcla de datos Octo, RT-2 y OXE
  • Campo de instrucción de idiomas incorporado

Cons

  • Dependencia de TensorFlow (pesada para los equipos PyTorch)
  • Solo acceso secuencial (no hay marco aleatorio eficiente)
  • Esquema rígido sensores personalizados necesitan DatasetBuilder
  • Escribir un DatasetBuilder toma 2-4 horas
  • La inspección requiere herramientas TF
  • Menos intuitiva que HDF5 para el depuración

El ecosistema de la cara abrazada

LeRobot, desarrollado por Hugging Face, utiliza archivos Parquet para datos tablales (posiciones conjuntas, acciones, metadatos) y archivos de video MP4 para observaciones de cámara.

Estructura del conjunto de datos de LeRobot

Un conjunto de datos de LeRobot en Hugging Face Hub contiene:

my_dataset/
    data/
        train-00000-of-00001.parquet   # tabular data (all episodes)
    videos/
        observation.images.cam_high/
            episode_000000.mp4          # overhead camera video
            episode_000001.mp4
        observation.images.cam_wrist/
            episode_000000.mp4          # wrist camera video
            episode_000001.mp4
    meta/
        info.json                       # dataset metadata, features schema
        episodes.jsonl                  # per-episode metadata
        stats.json                      # per-feature mean/std/min/max

El archivo de Parquet contiene una fila por paso de tiempo con columnas para T15, T16, T17, T18 (posiciones conjuntas), T19, y referencias al índice de cuadros de vídeo correspondiente.

Carga de datos de LeRobot

from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

# Load a dataset from Hugging Face Hub
dataset = LeRobotDataset("lerobot/aloha_sim_transfer_cube_human")

# Access a single frame (returns a dict of tensors)
frame = dataset[0]
print(f"State: {frame['observation.state'].shape}")      # [D]
print(f"Action: {frame['action'].shape}")                 # [D]
print(f"Image: {frame['observation.images.cam_high'].shape}")  # [C, H, W]

# Get episode-level info
print(f"Number of episodes: {dataset.num_episodes}")
print(f"Number of frames: {dataset.num_frames}")
print(f"FPS: {dataset.fps}")

Los pros y los contras de LeRobot

Las cosas están bien.

  • Carga de un solo comando en Hugging Face Hub
  • Visualización web integrada en hf.co/datasets/
  • Almacenamiento compacto (video MP4 5-10 veces más pequeño que el crudo)
  • Más de 300 conjuntos de datos públicos y creciendo rápidamente
  • Apoyo a la formación en materia de ACT y de política de difusión
  • Estadísticas (medio/sd) calculadas automáticamente

Cons

  • La compresión de MP4 es de pérdida no fuente de la verdad calidad
  • El decodificación de video agrega latencia durante el entrenamiento
  • Parquet no ideal para episodios de longitud variable
  • Los cambios en el esquema requieren la reconstrucción completa del conjunto de datos
  • Formatos más nuevos con herramientas en evolución
  • No hay acceso al marco al azar sin decodificar el video

Tabla de comparación de formato

Feature HDF5 RLDS / TFRecord LeRobot / Parquet
Native frameworks ACT, Diffusion Policy, custom Octo, RT-2, OXE data mix LeRobot, ACT (via lib), DP (via lib)
Storage size (500 eps, 3 cams) 15-30 GB (compressed) 20-40 GB 3-8 GB (MP4)
Image fidelity Lossless (raw uint8) Lossless (raw uint8) Lossy (MP4 H.264/H.265)
Random frame access Efficient (chunked) Inefficient (sequential) Requires video decode
Cloud streaming No (download required) Yes (tf.data from GCS/S3) Yes (HF Hub streaming)
Schema flexibility High (any structure) Low (fixed DatasetBuilder) Medium (Parquet columns)
Sharing platform None (manual hosting) TFDS catalog Hugging Face Hub
Community datasets Many (no central catalog) 50+ (Open X-Embodiment) 300+ (Hugging Face Hub)
Python tooling h5py (mature, lightweight) tensorflow-datasets (heavy) lerobot, datasets (growing)
Recommended for Primary storage, ACT/DP training Cross-embodiment, Octo training Sharing, community, quick start

Convertir entre formatos

Con el tiempo necesitarás datos en múltiples formatos. Aquí está la guía práctica de conversión, con las herramientas y el esfuerzo estimado para cada camino.

HDF5 a LeRobot

La biblioteca LeRobot proporciona la conversión nativa para conjuntos de datos HDF5 de estilo ALOHA:

# Convert ALOHA HDF5 to LeRobot format and push to Hub
python -m lerobot.scripts.push_dataset_to_hub \
    --raw-dir /path/to/hdf5/episodes \
    --raw-format aloha_hdf5 \
    --repo-id your-org/dataset-name \
    --push-to-hub 1

Para esquemas HDF5 personalizados (no ALOHA), es necesario escribir una pequeña función de adaptador que mapee los nombres de sus claves al esquema esperado de LeRobot.

HDF5 a RLDS

Convertir a RLDS requiere escribir un TensorFlow DatasetBuilder personalizado. Esta es la conversión más laboriosa (2-4 horas para un nuevo esquema), pero es un costo único por formato de conjunto de datos:

# Skeleton RLDS DatasetBuilder (simplified)
import tensorflow_datasets as tfds

class MyRobotDataset(tfds.core.GeneratorBasedBuilder):
    VERSION = tfds.core.Version("1.0.0")

    def _info(self):
        return tfds.core.DatasetInfo(
            builder=self,
            features=tfds.features.FeaturesDict({
                "steps": tfds.features.Dataset({
                    "observation": tfds.features.FeaturesDict({
                        "image": tfds.features.Image(shape=(480, 640, 3)),
                        "state": tfds.features.Tensor(shape=(14,), dtype=tf.float32),
                    }),
                    "action": tfds.features.Tensor(shape=(14,), dtype=tf.float32),
                    "is_terminal": tf.bool,
                    "is_first": tf.bool,
                    "is_last": tf.bool,
                    "language_instruction": tfds.features.Text(),
                }),
            }),
        )

    def _generate_examples(self, path):
        # Read from your HDF5 files and yield episodes
        for episode_path in sorted(path.glob("*.hdf5")):
            with h5py.File(episode_path, "r") as f:
                # Map HDF5 fields to RLDS schema
                yield episode_id, {"steps": steps_list}

RLDS a LeRobot

LeRobot proporciona un convertidor incorporado para conjuntos de datos RLDS, incluyendo todos los conjuntos de datos Open X-Embodiment:

# Convert any RLDS dataset to LeRobot format
python -m lerobot.scripts.push_dataset_to_hub \
    --raw-dir /path/to/rlds/dataset \
    --raw-format rlds \
    --repo-id your-org/converted-dataset \
    --push-to-hub 1

LeRobot a HDF5

No existe una herramienta oficial para esta dirección, pero es sencillo escribir (30-60 minutos):

from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
import h5py
import numpy as np

dataset = LeRobotDataset("your-org/dataset-name")

for ep_idx in range(dataset.num_episodes):
    ep_frames = [dataset[i] for i in range(len(dataset))
                 if dataset[i]["episode_index"] == ep_idx]

    with h5py.File(f"episode_{ep_idx:05d}.hdf5", "w") as f:
        qpos = np.stack([fr["observation.state"].numpy() for fr in ep_frames])
        action = np.stack([fr["action"].numpy() for fr in ep_frames])
        f.create_dataset("observations/qpos", data=qpos, chunks=(1, qpos.shape[1]))
        f.create_dataset("action", data=action, chunks=(1, action.shape[1]))
        # Decode and store video frames as image arrays
        # ... (video decode step adds complexity)

** Importante advertencia:** Convertir de LeRobot de nuevo a HDF5 no puede recuperar la fidelidad original a nivel de píxeles porque LeRobot almacena imágenes como video MP4 de pérdida.

Cuadro de resumen de las conversiones

From → To Tool Effort Notes
HDF5 → LeRobot lerobot.scripts.push_dataset_to_hub 30 min Native ALOHA support; custom schemas need adapter
HDF5 → RLDS Custom DatasetBuilder 2-4 hours One-time per schema; requires TF knowledge
RLDS → LeRobot lerobot.scripts.push_dataset_to_hub --raw-format rlds 15 min Works for all OXE datasets
LeRobot → HDF5 Custom script 30-60 min Lossy: MP4 frames, not original raw images
Any → Any RCSV Platform 5 min Upload once, export to any format via UI

Cómo el RCSV entrega sus datos

Cuando usted involucra RCSV para una campaña de recopilación de datos, aquí es cómo manejamos la entrega de formato:

Formatos de recogida

Los datos de los sensores se almacenan sin pérdidas con timestamps por marco, metadatos completos y conjuntos de datos en pedazos para un acceso eficiente. Esta copia maestra se conserva durante la duración de su proyecto.

Formatos de entrega

Especifica tu formato objetivo en el informe del proyecto.

  • HDF5: Entrega directa de los archivos de origen de la verdad. Incluye documentación de esquema y un guión de ejemplo de Python para cargar.
  • RLDS / TFRecord: Conversado con un DatasetBuilder personalizado que coincida con su esquema. Incluye el código fuente de DatasetBuilder para que pueda volver a ejecutar la conversión usted mismo.
  • LeRobot / Parquet: Empujado a un repositorio privado de Hugging Face Hub bajo su organización. Incluye tarjeta de conjunto de datos con metadatos completos, estadísticas y visualización.
  • Formatos personalizados: bolso ROS, CSV, líneas JSON o esquemas propietarios. Escribemos el adaptador de exportación e incluimos en la entrega.

Lo que incluye

Cada entrega de conjunto de datos incluye:

  • Los archivos del conjunto de datos en el formato solicitado
  • Un manifiesto de datos (JSON) que enumera todos los episodios con metadatos, puntuaciones de calidad y estadísticas
  • Documentación de esquema que describe cada campo, tipo de datos y unidad
  • Un guión de Python que carga un episodio e imprime formas y rangos
  • Estadísticas de las características (media, std, min, max) para la normalización durante la formación
  • Informe de calificación que resume las métricas de calidad en todo el conjunto de datos

Exportación de la plataforma RCSV

Si utiliza la [RCSV Fearless Platform]T22), puede subir conjuntos de datos en cualquier formato y exportar a cualquier otro formato a través de la interfaz de usuario web. La plataforma maneja la normalización de esquemas, el cálculo de estadísticas y la codificación específica de formato (MP4 para LeRobot, TFRecord para RLDS) automáticamente. Sube una vez, exporta tantas veces como necesite.

Preguntas frecuentes

¿Qué formato debería usar si estoy empezando?

Comienza con HDF5. Tiene el sistema de herramientas más simple (h5py), el esquema más flexible, y es nativo de los marcos de entrenamiento más populares (ACT, Política de difusión). Siempre puede convertirse a LeRobot o RLDS más tarde. Si desea compartir su conjunto de datos inmediatamente en Hugging Face Hub, use LeRobot desde el principio pero mantenga el HDF5 crudo como copia de seguridad.

¿La compresión de MP4 de LeRobot es un problema para el entrenamiento?

Para la mayoría de las tareas de manipulación, no. Los artefactos visuales de la compresión H.264 en configuraciones de calidad razonables (CRF 20-23) están por debajo del nivel de ruido de los sensores de cámara típicos. Sin embargo, para tareas donde la precisión a nivel de píxel importa servo visual a objetivos sub-milimétricos, detección de cables o hilos delgados, o investigación que analiza los artefactos de compresión use HDF5 sin pérdidas como fuente de entrenamiento. El equipo de LeRobot está explorando los codecs de vídeo sin pérdidas (FFV1) para futuras versiones.

¿Puedo mezclar conjuntos de datos de diferentes formatos para entrenamiento?

Si estás entrenando con Octo o haciendo experimentos de encarnación cruzada, conviértelo todo en RLDS. Si estás entrenando con la biblioteca LeRobot, conviértelo todo en formato LeRobot. La plataforma RCSV puede normalizar y exportar cargas de formato mixto en un conjunto de datos unificado.

¿Cómo puedo controlar mis conjuntos de datos de robots?

Para los conjuntos de datos de LeRobot en Hugging Face Hub, la versión se construye a través de git-lfs. Para HDF5, use un archivo de manifiesto de datos (JSON) junto a sus archivos HDF5 que registra el esquema_versión, fecha de creación, lista de episodios y estadísticas.

¿Qué hay del formato de bolso ROS?

ROS bag (rosbag2 en ROS2) es excelente para la grabación de datos durante la recopilación porque capta todos los temas de ROS con sellos de tiempo de forma nativa. Sin embargo, no es adecuado como formato de entrenamiento porque requiere bibliotecas de ROS2 para leer, no tiene acceso aleatorio y almacena los datos en un formato optimizado para la repetición en lugar de entrenamiento ML. El flujo de trabajo estándar es: grabar en la bolsa ROS durante la recogida, luego convertir en HDF5 (o LeRobot/RLDS) para el entrenamiento y el intercambio.

Deja que RCSV maneje los formatos de tu conjunto de datos

Cargue sus datos de robots a la Plataforma RCSV para visualización, revisión de calificación y exportación con un clic al formato HDF5, LeRobot Parquet o RLDS. O permítanos recopilar sus datos y entregarlos en el formato exacto que su línea de entrenamiento necesita.

[Servicios de recogida de datos] [T23] [Abre la plataforma] [T24]