2026-11-13 · 21 min · robotics · world-models · video-generation · flow-matching · distillation · depth-estimation · 3d
A 5:07 narrated explainer, drawn in code. Every number and picture in it is this article's own; the sources are below.
› transcript
A robot reads its next moves off a video it imagined. What if that video only looks right? Hi, I'm Nico! GEM-4D is a video world model for robot arms that learns 3D geometry in training, then sheds the part that taught it. Chapter one. Video in, actions out. The recipe: don't learn actions directly. Imagine the future, then measure it. A world model takes the first frame and an instruction, and generates the next few seconds. An extractor finds the gripper in each frame and lifts it into 3D with estimated depth. Inverse kinematics turns that path into joint commands. Here is the trap. On the left, five generated frames: the gripper steps right by the same few pixels. On the right, what they mean in 3D. Make the scene deeper, and the reach grows. The frames do not change. Or the camera panned, and the gripper barely moved. Same frames again. Now the real failure. Each frame implies its own depth. Every frame looks fine, but in 3D the reach zigzags, and the arm would follow. A pixel loss cannot tell these apart. A model with one consistent geometry can. The paper writes it down. Where a pixel lands in the next frame depends on four things. The depth at that pixel. How the camera rotated and moved. And how the point itself moved, its scene flow. Get those four right inside the model, and every correspondence is fixed. Chapter two. A branch it will lose. Here's the idea. Bolt a small network onto a middle block of the video model, and make it predict what a frozen depth model sees. It only succeeds if that block encodes geometry. Along the bottom, an ordinary video transformer learns to denoise the clip. Along the top, a frozen geometry model turns the clip into features, noised and half masked, for a Geometry DiT to denoise. Its only view of the scene is this arrow: the video model's features. So its gradient pushes geometry into them. In the released code, the teacher is Depth Anything 3. Its twelfth layer gives a thousand and twenty-four channels. A frozen random projection squeezes that to two hundred and fifty-six. Every four frames are averaged: forty-nine become thirteen. Then sixteen channels, shaped exactly like a video latent. Half its tokens are masked, and the geometry loss is weighted by zero point zero three. One training step. The clip goes through the video transformer, forty blocks, and gets the usual video loss. The frozen teacher's features are the target for the four-block Geometry DiT. It reads block twenty through cross-attention, and the gradient flows back. Nothing flows the other way. After training, the teacher and the branch are deleted. A plain video model ships. The cost: on the released model, the video transformer is sixteen point three nine billion parameters. The branch adds one point seven three billion in training, and nothing when generating. Chapter three. From frames to a gripper. Then the extractor. A vision-language model and SAM 2 find the object and the gripper, and a pose model fits the gripper's shape. A point tracker follows the gripper, and finds it again when tracking suddenly drops. Bad poses are repaired, a grasp is chosen, and inverse kinematics makes the motion. This part is not released. Chapter four. Does it hold up? TesserAct outputs depth directly. Lift its frames to 3D, and the arm smears. GEM-4D's frames, lifted the same way, hold together. On RLBench, where depth is exact, the point-cloud error falls to less than half the best baseline's. The headline: twenty-two point seven to seventy-five point one percent on seven tasks, with TesserAct's videos run through GEM-4D's own extractor. Before you quote it: There is no success number for the same model without the branch. No trial counts, and no spread. And the real-world sixty-one to eighty-one percent is fifteen people rating videos. No robot moved. Real robot runs exist: a generated cup pickup beside the real arm, then a pepper. Demonstrations, without a success rate. The thing to keep: geometry can be taught through a branch you delete. The generator keeps the structure and pays nothing to run it. To recap. Pixels alone cannot fix depth. A deleted branch teaches the model geometry. And the success headline still needs a fair baseline. Every source is in the full article. I'm Nico. Bye!
Why read this
Notabletop 60%Reads the training code and checkpoint to show what the geometry branch costs and where it goes, and rebuilds the 52.4-point headline from Table 2.
- Original analysis
- A lasting reference
- A new technique
Robotics & embodiedNeeds datacenter GPUsMixed licencesPractitioner paper
How this was scored
- Is it new?
- 2 of 3: A real new idea, method or capability
- Can I trust it?
- 2 of 3: Measures key facts from files, code or configs
- Can I run it?
- 1 of 3: API-only, gated or restrictive licence
- Will I understand it?
- 2 of 3: Mechanism from first principles with figures
- Can I act on it?
- 2 of 3: A concrete recipe, numbers or comparison
- Will it last?
- 2 of 3: A reference for a year or more
- Does it affect many?
- 1 of 3: A specialist community
- Only here?
- 2 of 3: A teardown or measurement few others did
Score 63 of 100, ranked 349 of 740 rated articles. Each question is answered 0–3 by hand, and a 3 is rare. How articles are scored
A video model can show a robot arm picking up a cup and still be no use for picking up the cup. The frames look right one at a time. Between them, the gripper's fingers bend a little, the cup's rim slides a few pixels against the table, and the depth an estimator reads off frame 12 does not agree with frame 13. A person watching does not notice. A program that turns the video into joint angles does, because it has to commit to one 3D position per frame.
GEM-4D, from Kaichen Zhou, Yuzhen Chen and colleagues at Harvard, MIT and Princeton (ECCV 2026), attacks that gap during training only. A second, small transformer is bolted onto the video model's middle layer and made to predict what a frozen geometry model sees in the same clip. Its loss can only fall if that middle layer encodes depth, camera motion and object motion. After training, the second transformer is thrown away. The launch post by @alex_kai2020 puts it as "Train with 3D geometry. No extra video-generation overhead", and quotes seven simulated tasks going from 22.7% to 75.1% success with the same action extractor.
I read the paper (v4, 3 August 2026), the project page, the released code at
kaichen-z/GEM-4d and the index of the
released checkpoint. I did not train or run anything. The
training trick is clean and the code matches the paper's description of it. The headline numbers need more care
than the post gives them, and the part that turns video into robot actions is not in the release.
A video model as a robot policy
The recipe GEM-4D builds on goes back to UniPi: do not learn actions directly. Learn to predict the future as video, then read the actions off that video. The paper writes it as two functions. A world model takes the first frame and an instruction and returns frames . A policy extractor takes those frames and returns actions .
The attraction is data. Robot demonstrations with actions are scarce and tied to one arm. Video of things being manipulated is plentiful, and a pretrained video generator already knows a lot about how objects move. The action-specific part, , can be a fixed pipeline of off-the-shelf vision models with no training per task.
That differs from the world action models this site has covered recently. Praxis-1 and FLUX 3 Action put an action head inside the video model and denoise actions in the same pass, trained on robot data, and Flex-π denoises 3D pointmaps and actions in one shared latent. Vision-language-action models skip the video and map pixels and text straight to motor commands. GEM-4D keeps the two stages apart, so the video has to be good enough for a separate program to measure. Whether it is depends on a property the training loss of a video model never asks for.
Why pixels cannot pin down geometry
The paper's Section 3.2 starts from where a scene point lands in the next frame. A point seen at pixel , at depth , with the camera moving by rotation and translation and the point itself moving by scene flow , projects to
where is the camera's intrinsic matrix. Four unknowns, , decide every correspondence between frames. The paper draws two conclusions from it.
The first is that a pixel loss cannot enforce correspondence. Many settings of the four unknowns produce the same pixels: double the depth and double the motion and nothing on screen changes; pan the camera left while the object stays still, and it looks like the object moved right. The paper's sentence is blunt: "A pixel loss can reach zero while the underlying correspondences are entirely wrong." A video diffusion model trained on pixels or VAE latents is graded on what is on screen, so nothing stops it from implying one depth in one frame and another in the next.
The second is the reverse. A representation that does encode the four unknowns has no freedom left, because the equation then fixes where every point goes.
The widget makes the first point concrete in one dimension. The left panel is fixed: five frames in which the gripper moves the same number of pixels each step. The right panel is what those frames mean in 3D under different choices of depth and camera motion, lifted the way an action extractor lifts them, with depth times the ray through the pixel.
Scaling the depth stretches the reach, and shifting motion onto the camera shrinks how far the gripper itself travels; the frames never change. The drift toggle is the failure that matters for a robot. Each frame is lifted with its own depth, as happens when a generator's geometry is not consistent across frames, and a straight reach becomes a zigzag. An extractor that follows it will drive the arm along the zigzag.
Teaching the backbone through a branch it will lose
Earlier fixes for this changed what the video model outputs. TesserAct generates RGB, depth and surface normals together; 3DFlowAction predicts 3D flow. GEM-4D's argument against that route is that it needs geometric labels at scale and constrains the output space of a pretrained backbone.
GEM-4D leaves the output alone and works on the inside. Feed-forward geometry models in the DUSt3R and VGGT line, and Depth Anything 3, are trained to estimate per-frame depth and camera pose across a clip. Those are the dominant factors in the equation above. The paper's claim is that their intermediate features therefore encode the correspondence structure, including object motion, since a point whose depth changes in a way the camera motion does not explain must be moving. Making the video model predict those features should push the same structure into it.

Both branches are flow matching. The video branch is a standard latent video DiT: noise and a clean latent , a velocity field trained against the analytic target,
The geometry branch runs the same objective on a different latent. A frozen geometry model turns the clip into , which is noised to , half its tokens are masked, and a Geometry DiT predicts the velocity, conditioned on , the video DiT's features at one middle block:
The design choice that makes this work is in what the Geometry DiT can see. It gets the masked, noised geometry latent and , and nothing else from the scene: no pixels, no depth, no camera. To predict how the geometry latent should be denoised, the information has to come through , and the gradient of the geometry loss flows back into the video backbone through it. The coupling runs one way. The Geometry DiT reads the video features and never writes back, so the video DiT runs alone at inference with the same weights layout and the same cost as before.
This is close in spirit to REPA, which aligns a diffusion model's hidden states with a frozen encoder's features through a projection. The difference is that GEM-4D's target is a whole generative problem rather than a cosine similarity: the branch has to denoise the teacher's features, not just point in the same direction. Geometry Forcing, the closest baseline in the paper, is the REPA-style version with a geometry teacher.
What the code actually trains
The paper does not give , which block comes from, or which geometry model is the teacher
for the main results. It lists PAGE-4D, Depth Anything 3, VGGT and the DUSt3R family as examples. The released
code fixes all of it, in training/config/default.yaml and model/gem4d/:
geometry:
teacher: weights/da3 # DepthAnything-3 (local dir or depth-anything/DA3-LARGE-1.1)
feat_layer: 12 # DA3 ViT-L layer used as the geometry representation g0
depth: 4 # Geometry DiT blocks
mask_ratio: 0.5 # fraction of geometry tokens masked (mask mechanism M)
alpha: 0.03 # weight of L_geo
coupled_noise: true # geometry and video share one noise sampleA few details in the code are not in the paper and change how I read the method.
- The teacher is DA3-Large, layer 12, through a frozen random projection.
GeometryProjectorcompresses the 1,024-channel features to 256 with a Xavier-initialised 1x1 convolution, box-averages every 4 frames (49 frames become 13, matching the VAE's temporal stride), resizes to the latent grid, and projects to the latent's channel count (16 on Wan-14B). All of it hasrequires_grad_(False). The geometry latent is a fixed random view of DA3's features, shaped like a video latent. - The noise is shared. With
coupled_noise: truethe geometry latent is noised with the same sample as the video latent, so both branches denoise the same random draw at the same timestep. - The Geometry DiT reads only through cross-attention. Each of its 4 blocks is self-attention
over geometry tokens, cross-attention to the video features, and an MLP, with zero-initialised gates so the
branch starts as the identity. On the Wan-14B config
hook_layer: 20of 40 blocks; on Wan-5B it is block 15 of 30. The hook does not detach the features, so the gradient reaches the backbone. - The weight is small. is 0.03, ramped in linearly over the first 100 steps.
What "no extra overhead" covers
At inference, the claim holds exactly. inference/infer.py loads only the video DiT. The released checkpoint's
index lists 1,303 tensors and a total of 32,789,757,568 bytes; in bf16 that is 16.39B parameters, and none of
the tensor names contain geo. The deployed model is a plain Wan2.1 image-to-video DiT.
Training is another matter. Counting the Geometry DiT from heads/geo_dit.py with the Wan-14B width of 5,120 and
40 heads, I get 1.73B parameters: four blocks at about 419M each, plus the timestep MLP and the in and out
projections. Added to the 16.39B backbone that is 18.1B, which matches the README's "18.1 B trainable parameters"
for full fine-tuning with the branch. So training carries about 10.6% more trainable weights, plus a DA3-Large
forward pass on every 49-frame clip. The README asks for eight GPUs with at least 141 GB each for the 14B run, or
optimizer state offloaded to CPU on eight 80 GB cards. On Wan-5B the branch is 0.62B by the same count. That is
the right trade for a model you train once and sample many times, and it is still a cost.
From frames to a gripper pose
The second half of the paper is the extractor, the Adaptive Inverse Dynamic System. Its job is to turn a generated clip into a 6-DoF end-effector trajectory and then joint commands. It uses no learned parameters of its own and no per-task training; it chains existing models.

- 3D grounding. The geometry model supplies depth and intrinsics for the generated frames. Qwen3.5-VL and SAM 2 segment the target object and the end effector from the instruction. FoundationPose aligns a CAD model of the gripper to its point cloud to get the starting pose.
- Tracking with two triggers. CoTracker3 follows keypoints sampled on the gripper mask. The system watches the fraction of anchors still tracked, , and its frame-to-frame change . A slow decay below a threshold means drift: re-sample keypoints from the last good mask. A sudden drop means a generation artifact: ask the vision-language model to find the gripper again.
- Pose fallback. FoundationPose gives a pose and a confidence per frame. Where the confidence is low, or the pose jumps more than a threshold in translation or rotation, the frame is rejected; translation is taken from the centroid of the gripper's depth pixels and rotation is slerped between the nearest good poses.
- Grasp and inverse kinematics. GraspGen proposes grasps on the object's point cloud. The one closest, in a weighted sum of translation and rotation error, to the trajectory's pose nearest the object is inserted as a waypoint, the path is smoothed, and inverse kinematics produces the actions.
Read as engineering, this is a robust tracker written to survive bad video. The two-trigger rule and the depth-centroid fallback exist because generated frames have exactly the artifacts the first half of the paper tries to train out. Two things follow. "No extra overhead" is a statement about the generator; the full path from image to motion runs a VLM, SAM 2, CoTracker3, FoundationPose with a CAD model of the gripper, GraspGen and a geometry model on top of 30 sampling steps of a 14B DiT with classifier-free guidance. And the extractor is open-loop: it reads a whole imagined clip and plans from it. The README is explicit that this module is "Not in this repository", along with the VGGT and depth-target ablations.
What the video numbers say
Table 1 scores generated clips on two held-out sets: 400 unseen Droid samples (real) and 780 unseen RLBench samples (simulated), each generated 20 times. Appearance is FVD, SSIM and PSNR. Geometry is AbsRel, and of depth estimated from the generated frames by Depth Anything 3, a Chamfer distance between point clouds, and , the fraction of visible points tracked within 1 to 16 pixels.
| Droid (real) | FVD ↓ | SSIM ↑ | AbsRel ↓ | δ1 ↑ | Chamfer ↓ | Tracking ↑ |
|---|---|---|---|---|---|---|
| CogVideoX | 35.56 | 75.91 | 22.33 | 68.32 | 0.2670 | 66.22 |
| Wan 2.2-14B | 33.43 | 76.24 | 21.39 | 71.18 | 0.2349 | 68.18 |
| TesserAct | 33.28 | 75.66 | 22.07 | 66.80 | 0.2630 | 67.14 |
| Geometry-Forcing | 33.17 | 76.12 | 21.96 | 69.74 | 0.2443 | 67.97 |
| GEM-4D | 31.82 | 82.05 | 20.13 | 78.19 | 0.2001 | 71.23 |
GEM-4D leads every column on both sets. The largest margins are geometric: on RLBench, Chamfer falls from 0.1813 (TesserAct) and 0.1488 (Geometry-Forcing) to 0.0702, and on Droid rises from 71.18 (Wan) to 78.19. The paper says the standard deviation across the 20 generations is 1 to 2%, which is smaller than most of these gaps.

Two caveats sit under the geometry columns. On Droid there is no recorded depth, so "ground truth" depth is Depth Anything 3 run on the real frames, and the code's teacher is the same model. A generator trained to encode DA3's features being scored by how DA3 reads its output is not circular in a way that invalidates the result, but it favours this method by construction. RLBench, where depth is the simulator's, does not have that problem, and the gaps there are as large. GEM-4D's RLBench Chamfer is less than half the best baseline's.
The second is the backbone. The paper does not name GEM-4D's own backbone in Table 1; the README says those rows are "GEM-4D on a CogVideoX-5B backbone, not part of this release". So the cleanest comparison in the table is GEM-4D against CogVideoX, same family, fine-tuned on the same training set without the branch, and the gap there (AbsRel 22.33 to 20.13, Chamfer 0.2670 to 0.2001 on Droid) is the effect of the geometry loss plus whatever else differed in the recipe.
The ablation in Table 3 is real-domain only. Predicting depth velocity instead of geometry features (GEM-4D (Dep)) recovers part of the gain: 74.60 against 78.19. Swapping in VGGT as the teacher lands below the fine-tuned Wan baseline on SSIM (75.89 against 76.24) and AbsRel (21.73 against 21.39), roughly where plain CogVideoX sits, which the authors attribute to VGGT being trained on static scenes. That result is the most interesting one in the paper to me: the teacher matters, and a weak teacher is not free.
Where 22.7% to 75.1% comes from
The post's headline is not printed in the paper. It is the unweighted mean of seven RLBench columns in Table 2. TesserAct's cells sum to 159, so 159 / 7 = 22.7%; GEM-4D's sum to 526, so 526 / 7 = 75.1%; the difference is 52.4 points. That arithmetic checks out. What the numbers measure needs reading carefully.
The extractor is GEM-4D's own. The paper says it plainly: "As the inverse dynamics module of TesserAct is not open-source, we use our AIDS to process its generated videos." "Same action extractor" is true, and it is the right choice when the alternative is no comparison. The paper does not say how the extractor's thresholds were set, but it was built by the same authors alongside their own model's videos, and I would not assume it is neutral. TesserAct's own pipeline might do better or worse on its videos; nobody has measured it.
One baseline, and it is not the same model minus the branch. CogVideoX would have been the ablation that isolates the geometry loss, and it has no RLBench row: "most videos generated by CogVideoX cannot be reliably processed by our AIDS". That is itself evidence for the paper's thesis, since the extractor fails outright on a plain fine-tune. But it leaves no success number for "same backbone, same data, no geometry branch". The ablation table has no success column either.
The training data is not stated to match. CogVideoX and Wan are described as fine-tuned on the authors' training set (ManiSkill3, RLBench, Bridge, RT-1). TesserAct is described as a CogVideoX model that "further fine-tunes CogVideoX on robotics datasets", with no mention of retraining it on the same set.
No trial counts or spread. Table 2 gives one percentage per task and no number of episodes or variance. Two TesserAct cells, Put Rubbish In Bin at 0 and Reach Target at 2, carry a lot of the mean; leave them out and the gap is 42.4 points over five tasks. That is still large. It is also a sign of how much rides on whether the extractor can lock onto a gripper at all.
The real-world number needs the most correction. The abstract says GEM-4D "improves real-world manipulation success from 61% to 81%". The Metric paragraph of Section 4.2 says the Droid columns come from "a human study to assess the quality of generated videos, focusing on task success, object and robot-arm deformation, and instruction following", averaged over 15 participants. No robot executed those tasks. The three columns average 60.7 and 81.7, so "81" is rounded down. The project page calls it "Real-robot success", which is the wrong label for a rating of videos.
There are real-robot runs: the paper's Figures 4 and 6 and the post's video show a UF arm executing trajectories extracted from generated rollouts. They are qualitative, with no count of attempts.

What was released, and what was not
The repository is more useful than most paper code. It trains GEM-4D on two backbones, Wan2.2-TI2V-5B and
Wan2.1-I2V-14B, with RGB-only baseline configs beside them (wan14b_rgb.yaml, wan5b_rgb.yaml), so the missing
ablation can at least be run by someone with the GPUs. It ships a 14B checkpoint under Apache-2.0 on Hugging Face,
a post-processing tool that estimates depth and scene flow from any generated clip, and CPU smoke tests with tiny
random models. The repository itself has no licence file.
It does not reproduce the paper. The checkpoint is a Wan-14B model, while Table 1's rows are a CogVideoX-5B model that is not released. The release's training mix is RLBench, Bridge, RT-1 and Droid at 0.40, 0.25, 0.25 and 0.10; the paper's training list does not include Droid and evaluates on "unseen" Droid samples. And without the action extractor, nothing in the release turns a video into a robot motion, so the RLBench success table cannot be checked from it. Inference alone needs about 48 GB of GPU memory at 240 by 416, 49 frames, per the README.
The idea is worth more than the headline
I like the method. "Make the hidden state predict what a frozen expert sees, through a branch you will delete" is a general move, and here it targets the right failure: video that is plausible frame by frame and incoherent as geometry. It costs nothing at sampling time and about a tenth more parameters at training time, and on RLBench, with simulator depth, the geometry metrics improve by more than the noise. The VGGT ablation adds a useful warning that the choice of teacher can make things worse.
I do not buy "+52.4 pp" as a measure of what geometry supervision does for manipulation. It compares GEM-4D
against a different model trained on possibly different data, through an extractor its authors built for their
own videos, on seven tasks with no trial counts. The "61% to 81%" real-world claim is a rating of videos by 15
people. The experiment that would settle it is in the repo's configs already: train wan14b_rgb and
wan14b_gem4d on the same manifest, run both through one extractor, report episodes. Until that exists, I would
cite GEM-4D for Table 1 and the training trick, and treat the success numbers as encouraging.
For a related angle on the same problem, the Cosmos 3 and ABot-World-0 pieces cover world models scored on generation, and SAIL is a policy that searches imagined trajectories in a simulator rather than in video.