SAM 3D Team (Meta Superintelligence Labs), 2026

SAM 3D: 3Dfy Anything
in a Single Image

A generative model that recovers full 3D shape, texture, and layout for any object in a cluttered, occluded photo — by treating 3D reconstruction like an LLM: synthetic pretraining, then a human-and-model-in-the-loop data flywheel that breaks the "3D data barrier".

Prerequisites: Flow matching intuition + basic transformers
11
Chapters
6
Simulations

Chapter 0: The Problem

You take one photo of your living room. A chair is half-hidden behind a table, a mug sits on a cluttered desk, a plant leans in the corner. Now ask: what is the full 3D shape of each of those objects — not just the front you can see, but the back, the bottom, the parts buried behind other things?

Your brain does this instantly. You know the chair has four legs even though two are occluded. You know the mug is a hollow cylinder even though you only see one curved face. This is single-image 3D perception, and humans are astonishingly good at it.

The core question: From a single RGB image and a mask telling us "reconstruct this object", can a model output its full 3D shape S, its surface texture T, and its layout — rotation R, translation t, scale s — in the camera's coordinate frame? And can it do this for any object, in messy real photos, not just clean studio renders?

Why a single image is a hard inverse problem

Photography is a lossy projection: it maps a rich 3D object down to a flat grid of pixels. Depth is collapsed. Occluded surfaces vanish. We are trying to invert a function that threw away most of its input. There is no unique answer — many different 3D objects produce the exact same photo.

SAM 3D's response is to refuse to predict one answer. It models the problem as a conditional distribution p(S, T, R, t, s | I, M): given image I and mask M, there is a whole distribution of plausible 3D objects, and we train a generative model q to approximate it. The "one number" mindset (regress the depth) is replaced by a "generate a plausible sample" mindset (like an image diffusion model, but for shape).

The reason this was unsolved: the 3D data barrier

Why hadn't this been cracked? Data. Text models train on trillions of tokens scraped from the web. Image models train on billions of captioned photos. But "a natural photo paired with the ground-truth 3D mesh of an object inside it" is a data type that essentially does not exist at scale.

Modeling a single mesh from a reference image takes a skilled 3D artist hours. You cannot crowd-source it the way SAM crowd-sourced segmentation masks (anyone can trace an outline; almost nobody can sculpt a mesh). So prior 3D generators trained on clean synthetic objects (Objaverse) — and promptly fell apart on real, occluded, cluttered photos.

DomainWeb-scale paired data?Consequence
TextYes — trillions of tokensStrong LLMs
ImagesYes — billions of (image, caption)Strong image generators
3D from natural imagesNo — meshes take artists hours eachModels stuck on synthetic objects
The central insight from psychology (Koenderink, 1992): humans recover 3D from recognition. Once you know "that's a chair", you know its likely 3D shape — even a novel chair, because it's made of parts you've seen. SAM 3D bets that a model with enough visual recognition priors can do the same. The whole paper is about getting it enough of the right data to learn that.
Why does SAM 3D model reconstruction as a conditional distribution p(S,T,R,t,s | I,M) rather than regressing a single 3D output?

Chapter 1: The Key Insight

SAM 3D's breakthrough is not a clever new network layer. It is a recipe borrowed from LLMs: stop trying to find scarce real 3D data, and instead build a multi-stage training pipeline plus a self-improving data engine that manufactures it.

The insight: Break the 3D data barrier with three moves. (1) Pretrain on synthetic 3D — millions of clean rendered objects teach a "vocabulary" of shape. (2) Mid-train on render-paste — paste synthetic meshes into real photos so the model learns occlusion and mask-following with free ground truth. (3) Post-train with a human-and-model-in-the-loop flywheel — humans can't make meshes, but they can pick the best from a model's proposals and pose it. Those picks become training data, which improves the model, which makes better proposals. The flywheel spins.

Two ideas that made the data engine possible

Idea 1
Render synthetic 3D models and paste them into real images (with occluders). Free pixel-perfect 3D ground truth in realistic scenes.
Idea 2
Humans can't author meshes, but can select the best of N model-proposed meshes and align its pose. Selection « authoring in effort, yet yields supervised data.

The LLM playbook, mapped to 3D

LLM stageSAM 3D equivalentData
PretrainingShape vocabulary from isolated synthetic objectsIso-3DO (2.7M meshes, 2.5T tokens)
Mid-trainingOcclusion, mask-following, layout — skillsRP-3DO (61M render-paste samples)
SFTAdapt synthetic → real on vetted meshesMITL-3DO + Art-3DO
Preference alignmentDPO on human-preferred vs rejected shapesMITL preference pairs
DistillationCut inference from 25 steps to 4Shortcut-model distillation

The payoff: a 5:1 human-preference win rate on real-world objects and 6:1 on full scenes over the previous best methods. Reframing 3D as an LLM-style data problem is the entire contribution.

Why can humans contribute to the data engine even though they cannot author 3D meshes?

Chapter 2: Flow Matching Background

Before the architecture, we need the engine that generates shapes. SAM 3D is a rectified flow matching model. If you've met diffusion, flow matching is its straighter, faster cousin — and you need it to understand how a voxel grid gets conjured from noise.

Manufacturing the need

We said reconstruction is sampling from a distribution. But how do you sample a complex object like "a 64³ voxel grid of a chair"? You can't just pick from a list. The trick of all modern generative models: learn to transport a simple distribution (Gaussian noise) into the complex one (real shapes).

Imagine noise at time t=0 and a real shape at t=1. Draw a straight line between a noise sample x₀ and a data sample x₁. A point on that line at time t is:

xt = (1 − t)·x0 + t·x1

Here x₀ is pure Gaussian noise (the easy distribution), x₁ is a real shape latent (the hard distribution we want), and t ∈ [0,1] is a "how far along" knob — 0 means all noise, 1 means finished shape. Differentiate that line with respect to t and the velocity is gorgeously simple:

dxt/dt = x1 − x0

That constant x₁ − x₀ is the target velocity — the direction and speed you'd move to get from noise to data along the straight path. The network's only job is to predict that velocity at any (xt, t), conditioned on the image. Call the network vθ. The training loss is just regression:

L(θ) = Et, x₀, x₁ ∥ vθ(xt, t, I, M) − (x1 − x0) ∥²

Every symbol: E = average over random t and random noise/data pairs; vθ = the network's predicted velocity; the squared term = how wrong that prediction is. Minimize it and the network learns the velocity field that flows noise to shapes.

Why "rectified" and why it beats diffusion here: the straight-line path means the ideal trajectory has constant velocity — no curving. A straight path can be integrated in very few steps (Euler integration of a line is exact). Diffusion's curved paths need dozens of steps. This straightness is exactly what lets SAM 3D later distill to just 4 steps.

Sampling: integrate the velocity

At inference you start from noise x₀ and walk forward in N steps of size Δt = 1/N, each step nudging x by the predicted velocity:

xt+Δt = xt + Δt · vθ(xt, t, I, M)

This is one function evaluation (NFE) per step. SAM 3D's base model uses 25 NFE; the distilled one uses 4. Play with the simulation below to see noise flow into a shape, and watch what too-few steps does to the result.

Flow Matching: Noise → Shape (the sampling loop)

A 1D toy: each dot is a noise sample being transported toward the target shape distribution (two clusters = a multimodal "shape"). Drag the step count to see why few steps still works for straight flows — but overshoots if too few.

In rectified flow, what does the network vθ actually learn to predict?

Chapter 3: The Architecture

SAM 3D is a two-stage cascade. A Geometry model first predicts a coarse shape and the object's layout. Its output is then handed to a Texture & Refinement model that adds high-resolution detail and color. Think: rough clay form first, then sculpt and paint.

SAM 3D Pipeline (click a stage)
Click any box to inspect its data flow (tensor shapes, frozen/trained).

The data flow, with actual shapes

Let's trace exactly what tensors move through the system — this is where "concept" becomes "realization".

StageInput → Output (shapes)What it does
DINOv2 encoder4 image+mask pairs → 4 sets of conditioning tokensExtracts visual features (frozen)
Geometry model (1.2B)tokens → O ∈ R64³, R ∈ R6, t ∈ R3, s ∈ R3Coarse voxel shape + 6D pose + layout
Texture & Refine (600M)active voxels of O → refined latent S, TSparse latent flow over occupied voxels only
VAE decoders Dm, Dglatent → mesh OR 3D Gaussian splatsTwo decoders, one shared latent space

The four conditioning token sets — and WHY four

SAM 3D feeds DINOv2 two pairs of (image, mask), giving four token sets. This is a deliberate engineering choice:

Why both crop and full image? The crop alone loses context (you can't tell scale or identity of a heavily-occluded object). The full image alone loses resolution on small/distant objects. Together they give recognition and detail — exactly the pictorial cues Koenderink described.

The optional pointmap: graceful degradation

SAM 3D can optionally take a coarse scene point map P (from an iPhone LiDAR or a monocular depth estimator). Here's the key failure-mode lesson: if no pointmap is provided, the model still predicts shape and texture fine — only metric layout (translation/scale) becomes less accurate, because absolute scale is genuinely unknowable from RGB alone. The model degrades gracefully rather than crashing.

Why does SAM 3D encode BOTH a cropped view and the full image of the object?

Chapter 4: The Geometry Model & Mixture-of-Transformers

The Geometry model is the heart of the system. It is a 1.2B-parameter flow transformer that models p(O, R, t, s | I, M): coarse shape O (a 64³ voxel occupancy field), 6D rotation R, translation t, and scale s. It must generate two very different things — a big spatial voxel grid AND a tiny 12-number layout vector — in one model. How?

Mixture-of-Transformers (MoT): two streams, one attention

SAM 3D uses a Mixture-of-Transformers. Picture two parallel transformer "streams" — one specialized for geometry tokens, one for layout tokens. Each stream has its own weights (feed-forward, norms). But they share a single multi-modal self-attention layer where the two streams can read each other.

Why MoT instead of one shared transformer? Geometry and layout are different "modalities" with different statistics — a voxel grid is high-dimensional and spatial; a pose is low-dimensional and continuous. Giving each its own feed-forward weights lets each specialize, while the shared attention still lets geometry inform pose and vice versa ("a mug seen from above implies this rotation"). It's the sparse-but-coupled middle ground between fully separate models and one monolith.
SHOWCASE — Generate a Shape with the Geometry Model

This reconstructs the Geometry model's core loop: a 2D occupancy slice of a voxel object is generated by flowing noise → shape via the velocity field, while a separate stream predicts the pose. Pick a target object, set the recognition strength (how much the image conditions the flow), and the NFE step budget. Watch shape AND pose emerge together.

t = 0.00 · pure noise. Press Reconstruct.

Notice two things in the sim. Low recognition strength (image barely conditions the flow) gives a blobby, generic shape — the model falls back to a prior, ignoring the photo. This is exactly what under-trained or no-context models do. Too few NFE leaves the shape noisy and the pose jittery — the integration hasn't converged. Both are real failure modes SAM 3D had to engineer around.

6D rotation: why not Euler angles or quaternions?

R is a 6D rotation representation (Zhou et al., 2019), not 3 Euler angles. Euler angles have discontinuities (gimbal lock) and the wraparound at 360° makes them a nightmare to regress — a network predicting 359° vs 1° gets a huge loss for a 2° error. The 6D form (two 3-vectors, then Gram-Schmidt orthogonalized into a rotation matrix) is continuous, so the loss surface is smooth and learnable. A small ablation in the paper confirms 6D beats alternatives for pose.

What does the shared multi-modal self-attention layer in MoT enable?

Chapter 5: Texture, Refinement & Decoding

The Geometry model gives a coarse 64³ voxel blob. That's the silhouette in 3D, but it's low-res and colorless. The Texture & Refinement model — a 600M-parameter sparse latent flow transformer — fixes both.

Why "sparse"? A crucial efficiency decision

A 64³ grid has 262,144 voxels. But most of them are empty — an object only occupies a thin shell of that cube. Running a dense transformer over all 262K positions would be enormously wasteful.

The engineering move: first extract the active voxels from the coarse shape O (the ones the geometry model marked occupied), then only run the refinement flow over those. This is "sparse latent flow". Computation scales with the object's surface, not the bounding cube — typically a 10–20× reduction.
Coarse Voxels → Sparse Refinement (toggle active-voxel masking)

Left: the dense 64³ cube — most cells empty. Right: only active voxels survive. Toggle to see how many computations are saved.

Dense grid: every cell processed.

Two decoders, one latent space

The refined latent can be decoded two ways by a pair of VAE decoders that share the same encoder and latent space:

Why share the latent space (frozen encoder, two trained decoders)? Training one structured latent space and attaching multiple decoders means the expensive generative model is trained once; you get both output formats for free, and they're guaranteed consistent (same underlying 3D). If each format had its own latent, you'd duplicate the whole flow model and risk mesh and splats disagreeing.

What degrades, and why

Texture quality depends on visible surface. The back of an occluded object is hallucinated from the learned prior — plausible, but not "true". The paper notes common failure modes the post-training stage specifically hunts down: floaters (stray disconnected voxels), bottomless meshes (no base), and broken symmetry. These are exactly the artifacts flow-matching's per-voxel objective doesn't penalize — which motivates the next two chapters.

Why does the Texture & Refinement model operate only on "active voxels"?

Chapter 6: The Data Engine (the real contribution)

Architecture aside, the paper's genuine innovation is the model-in-the-loop (MITL) data engine — the flywheel that manufactures real-world 3D training data. This is the part you'd present in an interview as "what's actually new here".

The cold-start problem

On iteration zero, the model is synthetic-only and produces few good real-world meshes. So how do you bootstrap? An ensemble. Early on, candidate meshes come mostly from a suite of existing learned + retrieval-based models. As the model improves, it dominates — eventually producing ~80% of the annotated data. The crutch is kicked away once the model can walk.

The annotation pipeline: humans select, don't author

Stage 1
Choose targets (I, M). Sample diverse real images, get object masks (reuse SAM, plus human labelers). Defines what to lift to 3D.
Stage 2
Rank & select shape (S, T). Show annotator N=8 candidates from the model/ensemble; they pick the best and rate it r ∈ [0,1]. Best-of-N search, with a human as the judge.
Stage 2.5
Hard-example triage (artists). When NO candidate is good, route to professional 3D artists. These rare, expensive labels become Art-3DO.
Stage 3
Align pose (R, t, s). Annotator positions the chosen mesh against a point cloud. Point clouds give just enough structure for consistent placement.

Best-of-N: the math of why selection works

Why ask for N=8 candidates instead of 1? Suppose any single model sample is "good enough" (r > α) with probability p. The probability that the best of N is good enough is:

P(success) = 1 − (1 − p)N

Worked example: say p = 0.30 (a lone sample is good 30% of the time). With N=1 you get 30%. With N=8: P = 1 − (0.70)⁸ = 1 − 0.0576 = 94.2%. By spending 8 samples and one cheap human pick, the success rate jumps from 30% to 94%. SAM 3D further boosts effective N by pre-filtering candidates with a model, then having the human filter — a two-stage funnel.

Best-of-N Annotation Success

Drag the per-sample quality p and the candidate count N. The curve shows P(success)=1−(1−p)ⁿ. See why N=8 is the chosen sweet spot.

The flywheel as an API. The paper frames data collection as a function: give it the current model q(·), it returns (i) accepted training samples D⁺, (ii) a quality rating r, and (iii) rejected, lower-preferred candidates D⁻. Those D⁺/D⁻ pairs are exactly what preference optimization needs — collected for free as a byproduct of annotation. In total: ~1M images, ~3.14M untextured meshes, ~100K textured — unprecedented scale for natural-image 3D.
With per-sample quality p=0.30, why does asking annotators to pick the best of N=8 candidates help so much?

Chapter 7: Multi-Stage Post-Training (SFT + DPO)

The base model has only ever seen (semi-)synthetic data. The domain gap to real photos is large. Post-training closes it, in a careful order.

SFT: noisy-then-clean curriculum

Supervised fine-tuning starts with the larger, noisier non-expert labels (MITL-3DO) to broadly adapt the model to real images, then finishes on the small, high-quality artist set (Art-3DO). Order matters: the artist data is precious, so you use it last to polish — it aligns outputs with artists' aesthetic sense and specifically suppresses floaters, bottomless meshes, and broken symmetry.

Why SFT alone isn't enough → DPO

Flow matching's objective is a per-voxel reconstruction loss. It has no notion of "humans find symmetric, closed shapes more pleasing". You can have low flow-matching loss and still output an ugly, asymmetric, hole-riddled mesh. The objective and human preference are misaligned.

So after SFT comes Direct Preference Optimization (DPO), borrowed straight from LLM alignment. Recall the D⁺/D⁻ pairs the data engine produced for free: D⁺ is the human-chosen shape, D⁻ is a rejected candidate. DPO nudges the model to raise the likelihood of preferred outputs and lower the rejected ones — without needing an explicit reward model.

LDPO = − log σ( β·[ log (qθ(D⁺)/qref(D⁺)) − log (qθ(D⁻)/qref(D⁻)) ] )

Symbols: qθ = model being trained; qref = frozen reference (the SFT model); σ = sigmoid; β = a temperature controlling how hard we push. The bracket is "how much more does our model prefer the chosen over the rejected, relative to the reference". Maximizing it = learning human aesthetic preferences. The paper finds this off-policy preference data is effective at eliminating undesirable outputs even after Art-3DO SFT.

The cascade ablation — every stage earns its keep

Table 4 of the paper shows near-monotonic improvement as each stage is stacked. Watch the metric climb:

Cascading Improvement on SA-3DAO (F1@0.01, higher is better)
Each bar adds one training stage on top of the previous. Chamfer distance (lower=better) drops in lockstep: 0.104 → 0.040.
The repeatable loop. Post-training can repeat: collect new data with the improved model, retrain, repeat. Each iteration aggregates all prior data but raises the quality threshold α over time (an idea borrowed from the cross-entropy method for optimization). Figure 10 of the paper shows near-linear Elo gains across iterations — the flywheel doesn't plateau.
Why does SAM 3D add a DPO stage after SFT instead of just doing more SFT?

Chapter 8: Distillation to Sub-Second Inference

The aligned Geometry model is great but slow: 25 function evaluations per reconstruction. For an interactive demo ("convert image to 3D" in a browser) you want sub-second. The final stage cuts NFE from 25 → 4.

Shortcut models: learn to take big steps

SAM 3D adapts the shortcut model idea (Frans et al., 2024). A normal flow model only knows how to take an infinitesimal step — that's why you need many. A shortcut model is additionally conditioned on the step size d, and trained so that one big step of size d lands in the same place as two small steps of size d/2 would. This self-consistency property lets it leap.

vθ(x, t, d) ≈ ½[ vθ(x, t, d/2) + vθ(x', t+d/2, d/2) ]

Where x' is where the first half-step lands. Read it as: "your big-step velocity should equal the average of two consistent half-steps." Train this and the model can take 4 giant strides instead of 25 baby ones — because the straight rectified-flow path makes large steps accurate in the first place (recall Chapter 2).

25-Step vs 4-Step Distilled Sampling (same straight path)

Both walk the same trajectory from noise to shape. The distilled model takes 4 large self-consistent steps; the base takes 25. On a straight path, the endpoints nearly coincide — that's why distillation barely hurts quality.

Both start at the same noise point.
Why distillation works here but not for diffusion easily: shortcut/consistency distillation is most accurate when the underlying trajectory is straight. Rectified flow's whole design goal (Ch. 2) was straight paths. The architecture choice in Ch. 2 pays off in Ch. 8 — a beautiful example of how an early decision enables a later capability. This is the kind of cross-chapter causality worth flagging in an interview.
What makes a "shortcut model" able to take 4 steps where the base needs 25?

Chapter 9: Experiments & The Core Insight in Code

The headline: on the new SA-3DAO benchmark (1,000 artist-made meshes from real images), SAM 3D dominates. It's not mainly about clean synthetic objects — it's about messy real ones.

SA-3DAO: SAM 3D vs Prior SOTA (F1@0.01 ↑, vIoU ↑)

Reading the numbers

MetricBest priorSAM 3DMeaning
F1@0.01 (↑)~0.163 (Hi3DGen)0.234Surface point match within 1% — +44% relative
vIoU (↑)~0.1530.231Volumetric overlap with GT
Chamfer (↓)~0.0840.040Avg point-to-surface distance — halved
Human pref. (objects)155:1 win rate on real images
Human pref. (scenes)166:1 win rate on full-scene reconstruction
Layout ADD-S@0.1 (ADT, ↑)0.02 (joint MIDI)0.77A new real-world capability, not a small gain

Note the honest detail in the paper: on the isolated synthetic ISO3D set, SAM 3D merely matches prior work on perceptual metrics. The win is entirely on hard, real, occluded inputs — which is exactly what the data engine was built for. The method does what it was designed to do, and not more — a credibility signal.

The core insight as runnable code

Strip away the 1.2B params and the engineering. The beating heart is: train a velocity field that flows image-conditioned noise into shape latents, and sample by integrating it. Here is that core, runnable:

python
import torch, torch.nn as nn

class VelocityField(nn.Module):
    """Predicts dx/dt = x1 - x0, conditioned on image features + time."""
    def __init__(self, latent_dim, cond_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(latent_dim + cond_dim + 1, 512), nn.SiLU(),
            nn.Linear(512, 512), nn.SiLU(),
            nn.Linear(512, latent_dim),   # outputs a velocity, same shape as latent
        )
    def forward(self, x_t, t, cond):           # cond = DINOv2 image+mask tokens
        t = t.view(-1, 1)
        return self.net(torch.cat([x_t, cond, t], dim=-1))

def flow_matching_loss(model, x1, cond):
    """Rectified flow: regress the straight-line velocity x1 - x0."""
    x0 = torch.randn_like(x1)                  # noise (easy distribution)
    t  = torch.rand(x1.size(0), 1)             # random point along the path
    x_t = (1 - t) * x0 + t * x1                # point on the straight line
    target_v = x1 - x0                         # constant target velocity
    pred_v = model(x_t, t, cond)
    return ((pred_v - target_v) ** 2).mean()

@torch.no_grad()
def sample(model, cond, latent_dim, nfe=25):
    """Integrate noise -> shape latent. nfe=25 base, nfe=4 distilled."""
    x = torch.randn(cond.size(0), latent_dim)  # start at noise (t=0)
    dt = 1.0 / nfe
    for i in range(nfe):
        t = torch.full((cond.size(0), 1), i * dt)
        x = x + dt * model(x, t, cond)         # Euler step along velocity
    return x                                    # -> decode with VAE to mesh/splats

That's the whole idea in 30 lines. SAM 3D scales the network to 1.2B params, makes cond the four DINOv2 token sets, splits the latent into geometry+layout via MoT, and wraps it all in the data-engine flywheel. But this is the engine.

On the ISO3D (isolated synthetic) benchmark, SAM 3D only matches prior work, while crushing them on SA-3DAO. Why is this consistent with the paper's thesis?

Chapter 10: Connections & Cheat Sheet

SAM 3D sits at the crossroads of generative modeling, the Segment Anything lineage, and the LLM training playbook.

2023
SAM — segment anything (2D masks, human-annotatable at scale)
2025
TRELLIS / Xiang et al. — two-stage latent flow for isolated objects (SAM 3D builds on this)
2026
SAM 3D — in-the-wild 3D via render-paste + MITL data flywheel + LLM-style multi-stage training

The cheat sheet — every key symbol

SymbolMeaning
I, MInput image and object mask (the conditioning)
S, TShape and texture to recover
R, t, s6D rotation, translation, scale (the layout in camera frame)
O ∈ R64³Coarse voxel occupancy from the Geometry model
xt=(1−t)x₀+t·x₁Point on the straight flow path; x₀ noise, x₁ data
vθLearned velocity field; target = x₁−x₀
NFEFunction evals per sample: 25 (base) → 4 (distilled)
1−(1−p)NBest-of-N annotation success probability
D⁺ / D⁻Engine's chosen / rejected meshes → DPO pairs
αQuality threshold; rises across data-engine iterations

When to reach for what

What the paper doesn't solve

"Recognition enables 3D reconstruction."
— the central thesis, traced from Roberts (1963) to SAM 3D