cod-vae-16x8-small / README.md
TimSchneider42's picture
Upload COD-VAE weights
3b635ee verified
|
Raw
History Blame Contribute Delete
5.15 kB
---
license: mit
library_name: cod-vae
pipeline_tag: feature-extraction
tags:
- 3d
- shape-reconstruction
- autoencoder
- vae
- occupancy
---
# COD-VAE 16 x 8 (small)
A compact [COD-VAE](https://arxiv.org/abs/2503.08737) that compresses a 3D shape
into **16 latent vectors of 8 dimensions = 128 numbers**, and decodes them back into
an occupancy field. Same latent shape as
[cod-vae-16x8](https://huggingface.co/TimSchneider42/cod-vae-16x8), but a ~4x smaller
network trained for fast decoding: ~35M parameters instead of 188M, with a 14.2M-parameter
decode path instead of 90M.
> **Note:** although the latent shape matches
> [cod-vae-16x8](https://huggingface.co/TimSchneider42/cod-vae-16x8), the two models
> define **different latent spaces** — latents from one cannot be decoded with the
> other.
Trained with [`cod-vae`](https://github.com/TimSchneider42/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.
## Architecture vs cod-vae-16x8
| | cod-vae-16x8 | this model |
|---|---|---|
| embed dim / heads | 512 / 8 | 256 / 4 |
| encoder | 4 blocks x 3 layers | 3 blocks x 3 layers |
| latent decoder layers | 12 | 6 |
| refinement decoder layers | 12 | 8 |
| total parameters | 188M | ~35M |
| decode-path parameters | 90M | 14.2M |
## Decode speed (H100, float32 + TF32)
| | cod-vae-16x8 | this model |
|---|---|---|
| batch-1 latency (latents -> triplanes) | 4.11 ms | 2.69 ms |
| batch-32 throughput | 2,720 shapes/s | 5,358 shapes/s |
| forward+backward, batch 32 x 2048 queries | 53.0 ms | 25.4 ms |
The dense 128^3 query pass (~3.7 ms) is unchanged; it depends only on the triplane
query head, not on model width or depth.
## Usage
```python
import trimesh
from cod_vae import CODVAE
vae = CODVAE.from_pretrained("TimSchneider42/cod-vae-16x8-small")
mesh = trimesh.load("bunny.obj", force="mesh")
latent, transform = vae.encode_mesh(mesh, return_transform=True) # (16, 8)
reconstruction = vae.decode_mesh(latent, transform=transform) # trimesh.Trimesh
```
Latents can also be computed from raw surface point clouds and decoded at arbitrary
query points:
```python
latents = vae.encode(points) # (N, 3) in [-1, 1]^3
logits = vae.decode(latents, queries) # occupancy logits, positive inside
volume = 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:
```bash
cod-vae-dataset data/merged --vecset path/to/shapenet_vecset_root
cod-vae-dataset data/merged \
--hf abc=TimSchneider42/tactile-mnist-abc-dataset-small:0.24435897 --hf-split train \
--num-vol 500000 --num-surface 250000
cod-vae-dataset data/merged \
--hf mnist3d=TimSchneider42/tactile-mnist-mnist3d --hf-split train \
--num-vol 50000 --num-surface 25000
```
| source | shapes | query pools per shape |
|---|---|---|
| ShapeNet (3DShape2VecSet, 55 synsets) | 48,597 | 500k volume + 500k near-surface |
| [tactile-mnist-abc-dataset-small](https://huggingface.co/datasets/TimSchneider42/tactile-mnist-abc-dataset-small) | 50,000 | 500k + 500k |
| [tactile-mnist-mnist3d](https://huggingface.co/datasets/TimSchneider42/tactile-mnist-mnist3d) | 11,480 | 50k + 50k |
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](https://github.com/1zb/sdf_gen) recipe.
## Training recipe
Both stages follow the reference schedule (100 + 100 epochs); only the batch layout
differs from cod-vae-16x8 because the smaller model needs fewer GPUs:
| | stage 1 (autoencoder) | stage 2 (latent VAE) |
|---|---|---|
| epochs | 100 | 100 |
| batch | 64 per GPU x 4 GPUs = 256 | 256 per GPU x 2 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.8489 | 0.8085 |
| MNIST3D (embossed digits) | 128 | 0.9105 | 0.8698 |
For reference, the full-size cod-vae-16x8 reaches 0.8733 / 0.8347 on ABC and
0.9231 / 0.8829 on MNIST3D — the size and speed here cost about 0.01–0.03 IoU.
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:
```bibtex
@inproceedings{cho2025cod,
author={Cho, In and Yoo, Youngbeom and Jeon, Subin and Kim, Seon Joo},
title={Representing 3D Shapes with 64 Latent Vectors for 3D Diffusion Models},
booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
year={2025}
}
```