COD-VAE 16 x 4
A
COD-VAE that compresses a 3D shape into
16 latent vectors of 4 dimensions = 64 numbers, and decodes them back
into an occupancy field.
Trained with
cod-vae, a PyTorch/JAX reimplementation of COD-VAE
(Cho et al., ICCV 2025). The weights are a self-contained npz and load with either
backend.
Stage 1 ran the full 100 epochs and stage 2 another 100, following the
reference schedule throughout.
Usage
1import trimesh
2from cod_vae import CODVAE
3
4vae = CODVAE.from_pretrained("TimSchneider42/cod-vae-16x4")
5
6mesh = trimesh.load("bunny.obj", force="mesh")
7latent, transform = vae.encode_mesh(mesh, return_transform=True) # (16, 4)
8reconstruction = vae.decode_mesh(latent, transform=transform) # trimesh.Trimesh
Latents can also be computed from raw surface point clouds and decoded at arbitrary
query points:
1latents = vae.encode(points) # (N, 3) in [-1, 1]^3
2logits = vae.decode(latents, queries) # occupancy logits, positive inside
3volume = vae.decode_volume(latents, resolution=128) # dense logit grid
Install with pip install cod-vae[torch,hub] (or cod-vae[jax,hub]).
Training data
A merged dataset of 110,077 shapes, built with the cod-vae-dataset tool:
1cod-vae-dataset data/merged --vecset path/to/shapenet_vecset_root
2
3cod-vae-dataset data/merged \
4 --hf abc=TimSchneider42/tactile-mnist-abc-dataset-small:0.24435897 --hf-split train \
5 --num-vol 500000 --num-surface 250000
6
7cod-vae-dataset data/merged \
8 --hf mnist3d=TimSchneider42/tactile-mnist-mnist3d --hf-split train \
9 --num-vol 50000 --num-surface 25000
Only the training splits are used; the ABC and MNIST3D pool sizes are scaled to the
geometric complexity of each source. Meshes are preprocessed with the original authors'
sdf_gen recipe.
Training recipe
Both stages follow the reference implementation; see
TRAINING.md for the full guide and the exact commands.
| stage 1 (autoencoder) | stage 2 (latent VAE) |
|---|
| epochs | 100 | 100 |
| batch | 32 per GPU x 2 accumulation x 4 GPUs = 256 | 128 per GPU x 4 GPUs = 512 |
| learning rate | 1e-4, scaled by effective batch / 256 | same, halved at epochs 60/70/80/90 |
| dataset repeat | 8 per epoch | 8 per epoch |
| precision | float32 with TF32 matmuls | same |
Held-out reconstruction quality
| source | held-out shapes | volume IoU | near-surface accuracy |
|---|
| ABC (CAD parts) | 128 | 0.7817 | 0.7703 |
| MNIST3D (embossed digits) | 128 | 0.8838 | 0.8500 |
Measured on the test splits of ABC and MNIST3D, which are disjoint from training.
Volume IoU compares decode(latents, queries) > 0 against ground-truth occupancy on
uniformly sampled query points; near-surface accuracy uses points sampled around the
surface.
Citation
The model architecture and training recipe are from:
1@inproceedings{cho2025cod,
2 author={Cho, In and Yoo, Youngbeom and Jeon, Subin and Kim, Seon Joo},
3 title={Representing 3D Shapes with 64 Latent Vectors for 3D Diffusion Models},
4 booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
5 year={2025}
6}