Human-hand WAM datasets

Training data for the World Action Model: videos of hands moving objects, with the depth, cameras, hand images and outcome for every frame.

25,773short windows, up to 81 frames
22,117long points, 2.49 M frames
8,865short failures
5groups, 3 sources

See the data

Each video: rgb, depth, and two hand images below, with the caption bar at the bottom. Synthetic = all sim. Real-paired = real video with sim replays.

groupkindshortfailuresuccessvallongfailuresuccess
hot3d_synth_hsynthetic15,0365,2309,80642612,7365,0657,671
graspxl_synth_hsynthetic6,5572,8233,7341246,5572,8233,734
hocap_synth_hsynthetic2,3518121,539362,0207921,228
hot3d_real_hreal-paired1,33901,339336400640
hocap_real_hreal-paired4900490111640164
total25,7738,86516,90863022,1178,68013,437

hot3d_synth_h

synthetic

HOT3D (Aria + Quest) · Aria ego, Quest ego, 2 virtual exo · 448×448 ego, 384×512 exo px

15,036 short (5,230 failure / 9,806 success) · 12,736 long (5,065 / 7,671)

6,392 success replay · 4,990 failure · 2,801 still success · 853 recovery

failure Failure: object slips (Aria ego)
failure Failure, virtual exo camera
failure Failure (Quest ego)
success Still success: the same push, but it holds
success Success replay
success Recovery: fail, re-grasp, finish

graspxl_synth_h

synthetic

GraspXL · 1 exo, 1 ego · 384×512 exo, 448×448 ego px

6,557 short (2,823 failure / 3,734 success) · 6,557 long (2,823 / 3,734)

3,734 success replay · 2,823 failure

success Success (exo)
success Success (ego)
failure Failure (exo)
failure Failure (ego)

hocap_synth_h

synthetic

HO-Cap · 6 static RealSense, HoloLens ego · 384×512 exo, 384×640 ego px

2,351 short (812 failure / 1,539 success) · 2,020 long (792 / 1,228)

852 success replay · 746 failure · 401 still success · 352 recovery

success Success replay (static RealSense)
failure Failure (HoloLens ego)
failure Failure (static exo)
success Still success
success Recovery story

hot3d_real_h

real-paired

HOT3D (Aria) · Aria ego · 448×448 px

1,339 short (0 failure / 1,339 success) · 640 long (0 / 640)

1,339 success replay

success Real Aria video + sim replay + composite depth
success Real + sim replay
success Real + sim replay

hocap_real_h

real-paired

HO-Cap · 3 static RealSense, HoloLens ego · 384×512 exo, 384×640 ego px

490 short (0 failure / 490 success) · 164 long (0 / 164)

490 success replay

success Real RealSense video + sim replay
success Real + sim replay
success Real + sim replay

How it was made

Code: onticlabs/real2sim, branch human-wam/prod. The README there maps each step to its code.

  1. 1

    Replay the recording in MuJoCo

    Real hands (MANO) and objects become a physics twin. Below: real video beside sim replays. Preview round.

    preview HO-Cap: real and two sim looks
    preview HOT3D Aria: real and two sim looks
  2. 2

    Make failures through physics

    Same start, same instruction. Friction, grip or mass changes make it fail. Left: failure. Right: the success it branched from.

    failure HO-Cap failure vs its success
    failure HOT3D failure vs its success
    failure GraspXL failure vs its success
  3. 3

    Recover from the failure

    Some failures continue: the hand re-grasps and finishes the task.

    success HO-Cap recovery
    success HOT3D recovery
  4. 4

    Render a synthetic room

    Random room and light; the frame-0 scene matches the success twin. Preview round.

    preview HO-Cap synthetic room
    preview HOT3D synthetic room
  5. 5

    Draw the action images

    act = hands + intended target. act_fk = hands only. Bottom panels.

    failure act vs act_fk, GraspXL
    failure act vs act_fk, GraspXL ego
  6. 6

    Depth for real-paired video

    The sim has no arm or body. Sim depth where it matches, MoGe-2 on person and room. Green panel = loss weight.

    success Aria: composite depth + weight
    success HO-Cap: composite depth + weight
  7. 7

    Encode short and long

    Wan2.2 VAE latents. Shorts are 81-frame windows. Long points follow a whole episode (10 s shown).

    success Long: recovery story
    failure Long: failure
    success Long: success

Then five independent validators checked the frozen data: all PASS, two after fixes, 133 items dropped. After the depth fix, all 2,633 real-paired items changed only in depth and its weight.

Pointmaps

A pointmap stores the 3D position of every pixel, so a model can read geometry directly instead of combining depth and camera.

Human hands: pilot only

170 items tested, so this is not a downloadable dataset yet. Full production would take about 12 h and 22 GB, and is waiting on a decision.

Robots: full dataset

c16_pts_v7: 6,565 windows from the 4 sim groups, job f4fd5d37. c16_pts_long3: 4,094 long points, on Chaos only.

Point cloud viewerLoads as you reach it
t 0.00 s

Drag to orbit, scroll to zoom. Exact sim depth lifted to 3D, coloured by the decoded video, every 2nd frame. Shown in world coordinates so the scene stays still; the pointmap stream stores XYZ per camera.

Pilot result: after the VAE round trip, pointmaps are about 2× worse than depth + camera on hand pixels in synthetic groups (median 4–37 mm vs 2–17 mm). Real-paired groups are about equal. Details in docs/PTS_PILOT_REPORT.md on the code branch.

Which to use

You want toUseNote
Train a bidirectional WAM on handshuman_ship_v1, all 5 groupsThe current run uses this.
Train an autoregressive or long-rollout modelhuman_long_v1No trainer uses it yet.
Teach real video from sim (config c2)hocap_real_h, hot3d_real_hOnly these have sim replays.
Learn failures and recoveryThe three *_synth_h groupsReal-paired groups are all success.
Work on hand posemano_sim, mano_rec side arraysGraspXL has no mano_rec.
Use the original recordings or labelsSee other human data
Use pointmapsRobots: c16_pts_v7Humans: pilot only.

Use it

# Project world-models, tag human-wam. On Prometheus, prefix ontic with
# PYTHON_KEYRING_BACKEND=keyring.backends.fail.Keyring or it hangs.
J=de0238f4-cc54-493f-9517-6c212c2ece45     # human_ship_v1, 74.7 GiB
ontic pull $J --path data/_index           # the index (107 MB)
ontic pull $J --path data/FLAGS.txt        # trainer flags for this tree
ontic pull $J --path data/<group>/<episode>/<file>.npz   # one window
ontic pull $J --path data/_text            # 6.2 GB caption embeddings, for training only
git clone -b won/wam-mix5-v7-human git@github.com:onticlabs/experiments.git
# python snippet.py   (needs numpy + torch; run where you pulled the files)
import json, os, sys

sys.path.insert(0, "experiments/projects/world-models/2026-11-09_wam-mix5-v7-human/wam_src/mix5")
import data_mix5 as D

root = "output-pulls/de0238f4-cc54-493f-9517-6c212c2ece45/data"
rows = [json.loads(l) for l in open(f"{root}/_index/index.jsonl")]

for r in rows:
    files = [f"{root}/{r['group']}/{s['file']}" for s in r["slots"].values()]
    if not all(os.path.exists(f) for f in files):
        continue                               # only the windows you pulled
    w = D.load_window(root, r)                 # picks sim_rand0 or sim_rand1 at random
    lat = w["lat"][next(iter(w["lat"]))]       # slot "single" (static exo) or "moving" (ego)
    print(r["group"], r["kind"], r["outcome"], r["view"], r["captions_plain"][0])
    print({k: tuple(v.shape) for k, v in lat.items()})
    # real-paired: {'rgb': (48, 21, 24, 32), 'sim': (48, 21, 12, 16), 'depth': (48, 21, 12, 16),
    #               'act': ..., 'cam': (48, 21, 6, 8), 'act_fk': ..., 'depth_w': (1, 21, 12, 16)}

Run on five windows, one per group, pulled from the store on 2026-11-09. In a launch, add {job: de0238f4-cc54-493f-9517-6c212c2ece45, source: output/data} to r3.yaml. Names human-ship-v1 and human-long-v1 work once PR #390 merges.

Files and streams

Short window: one npz per camera. Long point: <group>/<episode>/<slot>__<stream>.npy plus flags.npy and meta.json. _index/index.jsonl is the only list to trust. Split by sequence: no root is in both train and val. Video is 15 fps. Latent j covers frames 4j−3 to 4j.

streamlatent shape (exo)meaningin
rgb(48, F, 24, 32)video; real frames in real-paired groupsall
depth(48, F, 12, 16)metric depth, 0.15–3 m; sim, or sim + MoGe-2 compositeall
depth_w(F, 12, 16), uint8depth loss weight per cell: 1 sim, 0.5 person, 0.25 room, 0 bad framereal-paired
act(48, F, 12, 16)hands + intended target and placeall
act_fk(48, F, 12, 16)hands onlyall
cam(48, F, 6, 8)camera mapall
sim_rand0/1(48, F, 12, 16)sim replay in two random looksreal-paired
mano_sim(T, 2, 7+n)hand after physics; side array, trainer does not read itall
mano_rec(T, 2, 51 or 22)recorded MANO; NaN after a story's slipHO-Cap, HOT3D
proprio, proprio_mask(T, 18), (18,)zeros and False: humans have no proprioall
captionsindex + _text/three plain, three with outcome; umT5 embeddings in _textall

Latents: Wan2.2 VAE, 48 channels, int16 storing bfloat16 bits. FLAGS.txt holds the build path: the trainer swaps it for your data root (see run.py). Long points: format c16_long/1; loader code pipeline/ar_data_code on the branch.

See it in the dataset viewer

Viewer support for human_ship_v1 is PR #27, open and unmerged. It shows id rasters and false-colour latent previews, not decoded video. The long set has no viewer card.

Train

configgiven (with text + frame 0)generatednote
c1nothingrgb, depth, act, cam
c2sim cliprgb, depth, act, camreal-paired only: synth rgb is already the sim, so --no-sim-groups removes c2
c3actrgb, depth, camno proprio for humans, so c3 always gives hand images
c4depth + camrgb, act
c5rgb videodepth, act, cam

Limits

  • About 40 % of HOT3D real frames count as bad, so person and room depth has weight 0 there. The values are correct; the loss ignores them. Mean depth_w: HOT3D 0.33, HO-Cap 0.68.
  • Short windows that reuse a long point match it in every stream except act, by design: each window draws only its own captioned moves.
  • 20 reuse shorts, all hot3d_real_h, have their long point in _dropped (job b2b153a9).
  • Thin depth specks at the sim / MoGe seam on some real-paired samples (right).
  • The long set is 2.49 M frames in 261,266 small files, so reads are slow. Pull only the points you need.
  • No human pointmap dataset yet: pilot only. Robots have one.
Depth map with thin dotted specks along the table edge
Specks along the seam, 2× zoom, Aria P0009

Licences

Commercial use is unresolved. MANO applies to all five groups and is non-commercial. Ask Won before any use beyond internal research.

sourcelicence stated upstreameffect here
MANO modelNon-commercial scientific research only; no sharing with third partiesAll five groups. Hand renders are derived from it; the licence does not say whether that counts.
GraspXLCC BY-NC 4.0 (data)Non-commercial
HOT3DSequences CC BY-SA 4.0; hand annotations CC BY-NC-SA 4.0; object models CC BY-SA, no saleNon-commercial through hand annotations
HO-CapCC BY 4.0 (data)The store description groups it with non-commercial sources. The data is CC BY; MANO is what restricts it.
Room texturesrobosuite, LIBERO: MITNone
MoGe-2 weightsMIT, from the Hugging Face tag onlyUsed for real-paired depth
SAM 3; Wan2.2 VAESAM License; Apache-2.0Used as tools. No non-commercial clause found.
Objaverse / PartNet (GraspXL assets)Per object, not checkedUnverified

Sources read 2026-11-09; this is not legal advice.

Other human data

DataWhereStatus
HO-Cap originalsstore hocap (410fadfb), hocap-color-labels; raw non-front frames on Chaos datasets/hocap_rawSource of this set
HOT3D (Aria, Quest)store point-clouds-hot3d; twins 29487cfc; VRS on Chaos datasets/hot3dSource. VRS is on Chaos only.
GraspXLstore point-clouds-graspxl, tracking-graspxl, loader 50cf9815Source
About 25 hand-object releases (TACO, DexYCB, ARCTIC, GRAB, ...)Leonardo scratch hoi_data/Purgeable, not in the store. Read each MANIFEST.tsv; avoid find and du. Scratch files untouched for 40 days are deleted.
MuJoCo twins for DexYCB, TACO, GRAB, ARCTIC, OakInkstore 58b1bd06, 45335ea8, 4dbf15f1, dc193fff, d4aeb0f8Body variants not used here
Dropped itemsstore b2b153a9, 164,681 filesOld or rejected versions
PointmapsHuman pilot in the viewer above; pts_pilot/REPORT.mdPilot only; robot set is c16_pts_v7
Gerard's hand-sim-dataonticlabs/hand-tabletopRejected for v1: capsule hand, states only