SPGen: Spherical Projection as Consistent and Flexible Representation for Single Image 3D Shape Generation
Paper • 2509.12721 • Published
How to use jdzhang0929/SPGen-VAE with Diffusers:
pip install -U diffusers transformers accelerate
import torch
from diffusers import DiffusionPipeline
# switch to "mps" for apple devices
pipe = DiffusionPipeline.from_pretrained("jdzhang0929/SPGen-VAE", dtype=torch.bfloat16, device_map="cuda")
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image = pipe(prompt).images[0]import torch
from diffusers import DiffusionPipeline
# switch to "mps" for apple devices
pipe = DiffusionPipeline.from_pretrained("jdzhang0929/SPGen-VAE", dtype=torch.bfloat16, device_map="cuda")
prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
image = pipe(prompt).images[0]This repository contains two components of SPGen: Spherical Projection as Consistent and Flexible Representation for Single Image 3D Shape Generation (SIGGRAPH Asia 2025).
| Folder | Description |
|---|---|
vae/ |
AutoEncoder for single-channel Spherical Projection (SP) depth maps (diffusers.AutoencoderKL, 1 input / output channel, 4 latent channels). |
normal_estimator/ |
Point-cloud normal estimator (3D UNet adapted from Shape As Points) used to orient the points lifted from the SP maps before Poisson reconstruction. |
git clone https://github.com/Evergreen0929/Spherical-Projection-Shape-Generation
cd Spherical-Projection-Shape-Generation
huggingface-cli download jdzhang0929/SPGen-VAE --local-dir weights/SPGen-VAE
from diffusers import AutoencoderKL
from spgen.models.normal_estimator import NormalEstimator
from spgen.utils import set_circular_padding
vae = AutoencoderKL.from_pretrained("weights/SPGen-VAE", subfolder="vae")
set_circular_padding(vae) # SP maps wrap around along the azimuth, the AutoEncoder uses circular padding
normal_estimator = NormalEstimator.from_pretrained("weights/SPGen-VAE/normal_estimator")
With inference.py of the code repository, pass --vae_path weights/SPGen-VAE/vae --normal_estimator_path weights/SPGen-VAE/normal_estimator.
256 x 512, normalized to [-1, 1]; every layer of an object is encoded independently into a 4 x 32 x 64 latent.(B, N, 3) points of a shape normalized to [-0.5, 0.5] (25,600 points in the paper); the output is a unit normal per point. It runs in fp32 and requires torch_scatter.L = L1 + 0.1 L_edge + 5e-4 L_spec + 1e-8 KL.representations/uids/train.txt and 299 additional Sketchfab models. The held-out evaluation objects (representations/uids/test.txt) and the GSO evaluation objects were not used for training.Training scripts: train_vae.py and train_normal_estimator.py in the code repository.
MIT. The normal estimator architecture is adapted from Shape As Points (MIT) and pytorch-3dunet (MIT).
@inproceedings{zhang2025spgen,
title={SPGen: Spherical Projection as Consistent and Flexible Representation for Single Image 3D Shape Generation},
author={Zhang, Jingdong and Chen, Weikai and Liu, Yuan and Wang, Jionghao and Yu, Zhengming and Shen, Zhuowen and Yang, Bo and Wang, Wenping and Li, Xin},
booktitle={SIGGRAPH Asia 2025 Conference Papers},
year={2025},
publisher={ACM},
doi={10.1145/3757377.3763959}
}