Delivery format

Custom WebDataset Video Dataset for Robot Learning

WebDataset stores samples as sharded tar archives so a large video dataset streams during training instead of being staged on local disk. We collect custom first-person video on demand against your written skill spec and deliver it as WebDataset shards: 512 samples per shard, head and wrist images, 16-bit depth and an ann.json per sample, a QA gate before anything ships, and a buyer-owned licence.
Container
.tar shards, 512 samples each
Per-sample keys
__key__ · head.jpg · wrist_l.jpg · wrist_r.jpg · depth.png · ann.json
Also ships as
RLDS · LeRobot · HDF5 · Rerun .rrd
First batch
Median 48 h in deep-coverage settings
A contributor wearing a head-mounted capture rig performs a manual task, beside a graphic of synchronized hand-pose, depth, and action-segment annotation layers.
One captured and annotated episode, exported into WebDataset shards of image, depth and annotation keys.

What a WebDataset delivery includes

Captured to your spec, exported shard-ready.

01

Built to stream, not to stage

Samples are packed into .tar shards of 512 and streamed from signed URLs, so you can train over more hours than you want to keep on local disk.

02

Images, depth and labels in one sample

Each sample holds head.jpg, wrist_l.jpg, wrist_r.jpg, a 16-bit depth.png and an ann.json, so a loader pulls exactly the keys it needs with .to_tuple().

03

The same QA-passed episodes as every other format

QA runs once against the canonical episode before any export, so the shards inherit the same calibrated, synced, anonymized data as the HDF5, RLDS and LeRobot deliveries.

Definition

What is a custom WebDataset video dataset?

WebDataset is a format in which a dataset is stored as a set of tar archives, with files that belong to one training sample grouped together by name. The WebDataset repository describes it as tar files in which files that make up a sample share a basename, with shards numbered in sequence. A custom WebDataset video dataset is egocentric video that a buyer specifies, that is captured against that written spec, and that is delivered in this layout.

This page is about ordering a collection with WebDataset as the delivery format. It is the WebDataset counterpart of the custom HDF5, custom RLDS and custom LeRobot dataset pages, for teams whose training stack streams sharded tars rather than reading a file per episode or a TFDS or LeRobot layout.

Why WebDataset

Why do robot-learning teams ask for WebDataset delivery?

The main reason is I/O. At egocentric-video scale, reading data becomes the training bottleneck, and sharded streaming keeps accelerators fed without a random-access database. The WebDataset README makes the same point in general terms: its tar representation allows sequential I/O pipelines, and it can read from local disk or from a pipe, which lets it reach cloud object stores.

The second reason is scale beyond local disk. Firsthand ships shards that stream from signed URLs, so a team can train over more hours than it wants to stage locally. The Python quickstart shows the same idea from the command line: fh stream with a skill line and the webdataset format pipes shards straight into a trainer.

Contents

What does a WebDataset delivery contain?

A delivery is a set of .tar shards of 512 samples each, plus the reject log for the batch and the batch data card. Each sample carries a __key__, head.jpg, wrist_l.jpg and wrist_r.jpg for the head and wrist views, depth.png for metric depth, and ann.json for the annotations.

Depth is recovered from the calibrated stereo rig rather than from a standalone depth sensor. In a shard it travels as depth.png, a 16-bit PNG that must be decoded as uint16 millimetres and not as an 8-bit image.

Which keys a given delivery holds depends on what the written skill spec ordered. The site also describes the IMU streams as shipping in WebDataset, but it does not itemise their key names or the key that carries per-stream timestamps. Those are agreed in the skill spec and confirmed on the Spec Pilot batch rather than assumed.

Layout

How is an episode stored in WebDataset shards?

WebDataset is the one delivery format that differs in structure rather than in content. The site’s delivery-formats guide notes that it keys samples by frame rather than by episode, with hand-pose and action annotations delivered inline as ann.json beside the image and depth keys of that sample. The format page states that ordering is shuffled across episodes, with sequence preserved inside a sample.

Expect shards of samples rather than one file per episode, as in HDF5. How many frames one sample spans, how shards are named and file sizes are not itemised on this site, so they are set per program in the skill spec and confirmed on the Spec Pilot batch. The one stated figure is 512 samples per shard.

Whichever format you choose, the canonical field layout is the episode schema. Every delivery format is a projection of it, so switching formats later does not change what a hand-pose or wrist label contains. Stream naming stays consistent across HDF5, RLDS and WebDataset; only the container and the per-sample convention change.

Loading

How do you load and stream a WebDataset delivery?

The format page shows the pattern: pass the shard URLs to wds.WebDataset with shardshuffle=True, decode images, then call .to_tuple() with the keys you want, such as head.jpg, depth.png and ann.json. ann.json arrives as parsed JSON containing hand_joints and action.

Three gotchas are stated on the format page. Signed URLs expire, so regenerate them with fh stream rather than hard-coding one. depth.png is 16-bit, so decode it as uint16 millimetres. Shuffling happens across shards, so set a large enough shuffle buffer for good mixing.

Comparison

How do WebDataset, HDF5, RLDS and LeRobot deliveries compare?

They are four exports of the same QA-passed episodes, so the choice is about your pipeline, not about data availability. WebDataset suits streaming from object storage and training beyond local disk. HDF5 is the most complete and suits random access and sync verification. RLDS suits TensorFlow-based pipelines and RL-style step sequences. LeRobot suits imitation-learning pipelines on that ecosystem and is the smaller on-disk option.

The practical differences are the unit of storage and how depth and hand pose travel. WebDataset carries depth as a 16-bit depth.png per sample and hand pose inside ann.json. HDF5 keeps them as separate arrays, RLDS as per-step fields, and LeRobot folds hand pose into one state vector and leaves depth out of the mp4. If you need to verify synchronization yourself, ask for the HDF5 export alongside the shards.

Labels

Which annotations ship in ann.json?

The format page states that ann.json carries hand_joints, action and contact_events. hand_joints are 3D hand pose, 21 joints per hand, which the episode schema gives in metres in the head frame. The action key carries the action labelling, and the site’s annotation work elsewhere describes frame-accurate action segments with a verb and a noun.

The episode schema also lists hand_visible, instance_masks, body_joints, objects and gaze_target. Which of those appear inside a shard’s ann.json is set in the skill spec.

Sync

How are timestamps and sync carried across streams?

Every active stream is hardware-triggered onto one PTP clock domain, and the site states a cross-stream sync ceiling of 2.0 ms. That happens at capture and in QA, before any export, so it applies to the shards as it does to every other format.

On the delivery side, the glossary states that WebDataset exports preserve per-stream timestamps and metadata, and the guides state that WebDataset carries the same per-sample timestamped structure as RLDS, adapted to the format’s own convention. The exact key that holds a timestamp inside a shard is not itemised on this site.

The format that carries int64 nanosecond timestamps per stream, in the PTP domain, and lets you recompute the cross-stream residual yourself is HDF5. If synchronization verification matters to you, request it alongside the WebDataset shards. Both are built from the same episodes, so adding one adds no separate collection stage.

Skill spec

How does a skill spec define what is collected into WebDataset?

Every custom collection starts with a written skill spec: the task your pipeline needs covered, the setting, the object set, the capture tier, the annotation depth and the accept criteria, which are signed into it before capture begins.

For a WebDataset order the spec also names which keys go into each sample, how many frames one sample spans and that the delivery format is WebDataset. One attempt at the task is one episode, so any sample traces back to the skill and setting it came from.

Collection and QA

How is a custom WebDataset dataset collected and validated?

Paid, consented contributors perform the real task against your spec while wearing the capture rig. The instrumented tier is a head-mounted stereo rig: first-person RGB, a metric depth stream recovered from the calibrated stereo rig, and 6-DoF IMU data at 200 Hz from head- and wrist-mounted sensors. The rig is calibrated before the session and again after it. We do not capture robot or teleoperation data, and we do not capture at a customer’s own facility.

QA happens once, against the canonical episode, before any format-specific export is produced. An episode is accepted only if RMS reprojection stays under 0.28 px and the drift is within tolerance. Otherwise it goes to the reject log, which ships with every batch. Only footage that clears the signed accept criteria is billed as a validated hour, and rejected items are recaptured at our cost.

Privacy sits in the same gate. Every episode is linked to a signed contributor release under a documented consent chain, with consent artefact IDs listed per episode in the batch data card. Faces and screens in frame are detected and irreversibly blurred at ingest, with a reviewer confirming the result before anything ships, and clips that cannot be de-identified are discarded rather than delivered.

Licence and delivery

How is it licensed, and what do you receive?

You receive the dataset under a perpetual, irrevocable, worldwide commercial licence that is non-exclusive by default, with the buyer owning the resulting dataset and exclusivity available. The same terms apply whichever format the episodes are exported into.

The delivery is the WebDataset shards, the reject log and the data card for the batch.

Speed

How fast can a custom WebDataset dataset be delivered?

Where coverage for the requested tasks and regions is already deep, the median time from signed spec to first validated batch is a median of 48 hours. Where it is thin, turnaround runs three to four weeks while recruiting expands in parallel across more regions. WebDataset adds no separate stage.

Getting started

How do you request a custom WebDataset dataset?

Write down the tasks, environments, objects and camera tier your model needs, name the keys and annotations you want in each sample, and specify WebDataset as the delivery format. Most orders begin with a Spec Pilot: a small, fast first batch that proves the spec and the accept criteria hold up on real footage before you scale.

On that pilot, open a shard with wds.WebDataset and check the keys, depth decoding and ann.json fields you depend on.

At a glance

What you get.

Container
.tar shards, 512 samples per shard
Keys per sample
__key__, head.jpg, wrist_l.jpg, wrist_r.jpg, depth.png, ann.json
Depth
depth.png, 16-bit PNG, decoded as uint16 millimetres
Annotations
ann.json carries hand_joints, action and contact_events
Ordering
Shuffled across episodes, sequence preserved inside a sample
Streaming
Signed URLs, works directly with wds.WebDataset(url)
Shard naming, sample span, file sizes
Set per program in the skill spec
Also available as
RLDS, LeRobot, HDF5, zarr, Rerun .rrd
Spec to first batch
a median of 48 hours (deep coverage)
License
Perpetual, irrevocable, buyer-owned, non-exclusive by default

Every collection runs through the same seven-stage end-to-end custom collection pipeline. End-to-end custom data collection is a managed service that takes an AI data need from problem to owned dataset in a single accountable pipeline.

Key map

Keys in a WebDataset sample, as the site states them

Each key with what it holds and what the site states about it. "Not itemised" means the site does not state it; those details are set per program in the skill spec.
KeyWhat it holdsWhat the site states
__key__The sample identifierListed per sample; the naming scheme is not itemised
head.jpgHead-camera imageListed per sample; resolution and JPEG settings are not itemised
wrist_l.jpg, wrist_r.jpgLeft and right wrist-camera imagesListed per sample; resolution and JPEG settings are not itemised
depth.pngMetric depth from the calibrated stereo rig16-bit PNG; decode as uint16 millimetres, not as an 8-bit image
ann.jsonAnnotations for the sampleParsed JSON carrying hand_joints, action and contact_events
IMU and timestamp keysHead and wrist IMU, per-stream timestampsDescribed as shipping in WebDataset; key names not itemised
Depth confidence, masks, body jointsOther episode-schema fieldsNot itemised for shards; included only if the spec orders them

WebDataset vs HDF5 vs RLDS vs LeRobot

WebDataset, HDF5, RLDS and LeRobot delivery, as the site states them

The same QA-passed episodes can be exported to any of the four layouts.
WebDatasetHDF5 / zarrRLDSLeRobot
Container.tar shards, 512 samples per shardOne .h5 or .zarr group per episodeTFDS-compatible tfrecord shardsParquet + mp4 per camera, Hugging Face datasets layout
Read withwds.WebDataset(url)h5py (HDF5); zarrtensorflow_datasetslerobot.common.datasets.lerobot_dataset
Depthdepth.png, 16-bit, per samplestreams/depth_mm and streams/depth_confobservation.depth_mm per stepNot embedded in the mp4; pull it from the HDF5 export
Hand posehand_joints inside ann.jsonannotations/hand_joints [T, 2, 21, 3]observation.hand_joints per stepFlattened into observation.state
TimestampsPer-stream timestamps preserved; key not itemisedint64 nanoseconds per stream, PTP domainint64 nanoseconds, PTP domain, per streamPer-frame, aligned to the head-camera clock
Layout unitSample, in shards of 512Episode, in time-major 30-frame chunksStep, in ~1.9 GB shardsFrame and episode, the smaller on-disk option
Best forStreaming from object storage, training beyond local diskRandom access, sync verification, the most complete exportTensorFlow-based pipelines, RL-style step sequencesImitation-learning pipelines on the LeRobot ecosystem

FAQ

Custom WebDataset video dataset, answered.

What is a custom WebDataset video dataset?
An egocentric video collection captured to a buyer’s skill spec and delivered as .tar shards of 512 samples, each with head and wrist images, a 16-bit depth.png and an ann.json, streamed from signed URLs.
Which keys does a WebDataset sample include?
__key__, head.jpg, wrist_l.jpg, wrist_r.jpg, depth.png and ann.json. The spec decides which of them a given delivery holds, and IMU and timestamp key names are agreed in the spec.
How do I decode the depth?
depth.png is a 16-bit PNG. Decode it as uint16 millimetres, not as an 8-bit image.
What is in ann.json?
hand_joints, action and contact_events, as parsed JSON. Name any further labels you need in the spec and confirm them on the Spec Pilot batch.
What are the shard names, sample span and file sizes?
The site states 512 samples per shard. Shard naming, how many frames one sample spans and file sizes are not stated, so they are set per program in the skill spec.
Can I verify synchronization on a WebDataset delivery?
The exact timestamp key inside a shard is not itemised. The HDF5 export carries int64 nanosecond timestamps per stream, so request it alongside the shards if you want to recompute the residual yourself.
What licence does the dataset ship under, and how fast is it?
A perpetual, irrevocable, worldwide commercial licence that is non-exclusive by default, with the buyer owning the resulting dataset and exclusivity available. Where coverage is deep, the median time from signed spec to first validated batch is a median of 48 hours; thin coverage runs three to four weeks.

Sources

Where is the WebDataset format documented?

Request a custom WebDataset dataset.

Tell us the tasks, environments and camera tier your model needs, and specify WebDataset as the delivery format. The same episodes can also ship as RLDS, LeRobot or HDF5, with a first validated batch in a median of 48 hours where coverage is deep.