pixal3d_mrp_mlx/pixal3d_mlx
m3ultra 06a080b18d SLAT stage: image -> occupancy -> sparse latents -> mesh, running end to end
The whole geometry chain now runs on a real photograph:

  [1] occupancy   12948 voxels                     19.7s
  [2] cond        proj (1, 262144, 2048) @ 64^3     2.6s
      gathered    proj (12948, 2048)
  [3] SLAT        (12948, 32)                      88.7s
  [4] MESH        3556515 verts, 7071196 faces     11.0s   grid 1024^3
      peak 22.6 GB, bounds inside the unit cube

Two bugs fixed on the way:

1. "global" must be FLAT [M,C] for the sparse blocks, not the dense stage's [B,T,C].
   The sparse cross-attention takes a token stack plus an explicit layout, so the
   dense shape dies inside to_kv's reshape rather than anywhere informative. Gathering
   now reshapes it, and refuses batch > 1 rather than silently mislabelling a layout.
2. o_voxel needs the decoder OUTPUT grid, not its configured resolution. The shape
   decoder applies four 2x upsamples, so a res-64 latent decodes into 1024^3, while
   the config says 256 (upstream overrides it per run via set_resolution). Passing 256
   raised an opaque out-of-bounds inside o_voxel's hashmap insert. Added
   output_resolution() and a guard that names the real cause.

HONEST LIMITATION - this is NOT yet the shipped cascade. Upstream's
sample_shape_slat_cascade runs the 512 flow (res 32) first, denormalises, UPSAMPLES
THE COORDINATE SET through the shape decoder, then runs the 1024 flow on the refined
coords. Running the HR flow straight off the 64^3 occupancy set yields a complete,
exportable mesh whose silhouette IoU is 0.639 - against 0.842 for the occupancy grid
that seeded it. The gap is a halo of geometry outside the true silhouette, exactly
what the missing coordinate refinement would prune. Do not read the current mesh
quality as the model's; wiring the cascade is the next step.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 14:53:32 +10:00
..
__init__.py Pixal3D weight converter + corrected scope 2026-08-02 11:25:00 +10:00
cond.py All four proj extractors: NAF high-res branch, without natten 2026-08-03 14:39:29 +10:00
convert.py Pixal3D weight converter + corrected scope 2026-08-02 11:25:00 +10:00
decoders.py Sparse VAE decoders: shape_dec and tex_dec 2026-08-02 13:31:53 +10:00
dino.py Proj conditioning: camera back-projection, grid_sample, DINOv3 (12/12 vs upstream) 2026-08-03 13:52:41 +10:00
mesh.py SLAT stage: image -> occupancy -> sparse latents -> mesh, running end to end 2026-08-03 14:53:32 +10:00
naf.py All four proj extractors: NAF high-res branch, without natten 2026-08-03 14:39:29 +10:00
pipeline.py SLAT stage: image -> occupancy -> sparse latents -> mesh, running end to end 2026-08-03 14:53:32 +10:00
proj.py Proj conditioning: camera back-projection, grid_sample, DINOv3 (12/12 vs upstream) 2026-08-03 13:52:41 +10:00
sampler.py Real image -> occupancy grid, with a silhouette check and honest timings 2026-08-03 14:10:30 +10:00
slat_flow.py All four flow models verified at correlation 1.00000000 2026-08-02 12:10:28 +10:00
ss_dec.py SparseStructureDecoder verified at correlation 1.00000000 2026-08-02 13:27:24 +10:00
ss_flow.py SparseStructureFlowModel verified against upstream at correlation 1.00000000 2026-08-02 12:03:12 +10:00