A comprehensive collection of quantizers, continuous autoencoders, and tokenizers for medical imaging and general visual data processing
Project description
MedLat
MedLat (medlat) is a PyTorch library for first-stage models (tokenizers, continuous and discrete autoencoders, quantizers) and second-stage generators (autoregressive and diffusion-based), aimed at medical imaging and general visual data. Everything is exposed through a single model registry: instantiate by string ID, list IDs programmatically, and optionally read paper/code links via get_model_info.
2D and 3D: Registered models are built to cover standard 2D computer vision (natural images, 2D slices, projections) and 3D medical volumetric data (e.g. CT/MRI-style volumes). The same registry IDs apply; switch spatial dimensionality with constructor arguments such as dims=2 vs dims=3 (and matching img_size / spatial layout) on the builders you instantiate—so one codebase serves both pipelines.
Project page (SEO, FAQ, llms.txt): open docs/index.html locally, or publish the docs/ folder to GitHub Pages (see docs/sitemap.xml / docs/robots.txt).
What this repo contains
| Layer | Role |
|---|---|
| First stage | Maps images to a compact representation: continuous latents, discrete codes, or token sequences. |
| Generator | Models the distribution in that space (tokens or latents): MaskGIT, MAR, DiT, LDM-style UNet, or ADM. |
| Utilities | Gaussian diffusion construction (medlat.diffusion), training helpers, ViT cores, alignments to foundation models, and GenWrapper for encoder ↔ generator wiring. |
Typical flow: train or load a first-stage model → attach a generator whose input size matches the tokenizer/VAE output (n_embed, embed_dim, seq_len, stride, etc.) → sample or train end-to-end using the example notebooks.
Installation
pip install -e .
Core dependencies (see pyproject.toml): PyTorch, NumPy, Einops, timm, OmegaConf, MONAI. Optional [dev] extras include pytest, black, flake8, mypy.
Some code paths import extra packages (e.g. wavelets in quantizers); install those if you hit import errors for a specific model.
Quick start
from medlat import available_models, get_model, GenWrapper
# Discover registered IDs (hundreds of concrete configs)
print(list(available_models()))
# Metadata only (no instantiation): description, paper_url, code_url when set
from medlat import get_model_info
print(get_model_info("continuous.aekl.f8_d16"))
# First stage: tokenizer or VAE (dims=2 for 2D CV, dims=3 for volumetric 3D medical data)
tokenizer = get_model("token.titok.s_128", img_size=128, dims=2)
# Other examples: continuous.aekl.f8_d16, discrete.vq.f8_d8_e16384, token.vmae.s_p8_d16, ...
# Generator: match tokenizer latent interface (example for discrete + autoregressive)
generator = get_model(
"maskgit.b",
img_size=128,
seq_len=tokenizer.num_latent_tokens,
num_tokens=tokenizer.n_embed,
in_channels=tokenizer.embed_dim,
)
# Glue: encoding/decoding and optional latent scale handling
wrapper = GenWrapper(generator, tokenizer)
GenWrapper selects encode/decode routes based on discrete vs continuous first stage and autoregressive vs non-autoregressive generator; see medlat/modules/wrapper.py for details.
Package layout (medlat/)
| Path | Contents |
|---|---|
medlat/registry.py |
ModelRegistry, register_model, get_model, available_models, get_model_info. |
medlat/first_stage/continuous/ |
KL autoencoders, MAISI, MedVAE, VAVAE, DCAE, soft-VQ / WQ-VAE style builders, plus one ViT AE entry used in HCVQ workflows. |
medlat/first_stage/discrete/ |
Full VQ / RQ / FSQ / LFQ / BSQ / QINCo-family models and MaskGIT-style VQ presets. |
medlat/first_stage/discrete/quantizer/ |
Standalone quantizer modules also registered under discrete.quantizer.*. |
medlat/first_stage/token/ |
TiTok, MAETok, VMAE, DeTok, SoftVQ, ViTA. |
medlat/generators/autoregressive/ |
MaskGIT, MAR. |
medlat/generators/non_autoregressive/ |
DiT, LDM UNet, ADM (UNet + classifiers). |
medlat/diffusion/ |
create_gaussian_diffusion, schedules, resampling (used with diffusion generators). |
medlat/modules/ |
GenWrapper, ViT cores, positional embeddings, alignments, I/O helpers. |
Subpackages often include a short README.md (e.g. generators/.../dit/README.md) with extra context for that family.
Naming conventions (registry IDs)
These patterns appear throughout IDs; exact letters vary by family.
f{N}— Spatial downsampling factor of the bottleneck (e.g.f8≈ 1/8 resolution per spatial axis).d{N}— Latent channel width or embedding dimension (family-specific).e{N}— Codebook size for vector quantization.l{N}/b{N}— Levels or bit width for scalar / binary quantizers (FSQ, LFQ, BSQ).- Scale tags — e.g.
s/b/l/xlfor model depth (TiTok, DeTok, DiT, MaskGIT, MAR).
Use available_models("token."), available_models("continuous."), etc. to list subsets.
Model families (registry)
Below, family means a group of related architectures; each family has many registered configs (different factors, widths, and presets). The table lists representative IDs and where they live in code.
A. Tokenizers & patch sequence models (token.*)
| Family | Idea | Representative IDs |
|---|---|---|
| TiTok | Compact tokenization for generative modeling | token.titok.s_128, token.titok.b_128_p8_e2e, token.titok.l_256_e2e, … |
| MAETok | MAE-style tokenizer variants | token.maetok.s_256, token.maetok.b_512_p8, token.maetok.l_128, … |
| VMAE | ViT/VMAE-style tokenizers, symmetric and asymmetric | token.vmae.s_p8_d16, token.vmae.t_p8_d16, token.vmae.b_p16_d32, … |
| DeTok | Depth/width scale grid (ss, sb, …, xlxl) | token.detok.ss, token.detok.bb, token.detok.xlxl, … |
| SoftVQ | Soft vector quantization tokenizers | token.softvq.s_t32_d32, token.softvq.bl_t64_d32, … |
| ViTA | ViT-based tokenizer preset | token.vita.reconmae |
Registration: medlat/first_stage/token/register.py, vmae/register.py, detok/detok.py, vita/vita.py.
B. Continuous autoencoders (continuous.*)
| Family | Idea | Representative IDs |
|---|---|---|
| AEKL | LDM-style KL autoencoder (conv encoder/decoder) | continuous.aekl.f4_d3 … continuous.aekl.f32_d64 |
| MAISI | MONAI MAISI-style 3D-friendly KL AE | continuous.maisi.f4_d3 |
| MedVAE | KL AE + BiomedCLIP alignment | continuous.medvae.f8_d16, continuous.medvae.f8_d32 |
| VAVAE | KL AE + alignment to DINOv2, MAE, or BiomedCLIP | continuous.vavae.f8_d32_dinov2, continuous.vavae.f16_d32_mae, … |
| DCAE | EfficientViT DC-AE (strong compression, optional HF weights) | continuous.dcae.f32c32, continuous.dcae.f64c128, continuous.dcae.f128c512 |
| Soft VQ / WQ-VAE | Soft or warped quantization in a continuous wrapper | continuous.soft_vq.f8_d16_e16384, continuous.wqvae.f8_d4_e16384, variants with _dinov2 / _biomedclip |
Registration: medlat/first_stage/continuous/register.py.
C. Discrete VAEs & full quantizer stacks (discrete.* except discrete.quantizer.*)
| Family | Idea | Representative IDs |
|---|---|---|
| VQ-VAE / VQGAN-style | Conv VQ with LDM-style encoder/decoder | discrete.vq.f4_d3_e8192, discrete.vq.f8_d8_e16384, discrete.vq.f16_d32_e16384, … |
| MaskGIT VQ | Preset aligned with MaskGIT-style setups | discrete.maskgit.vq.f16_d256_e1024 |
| MS-RQ | Multi-scale residual quantization | discrete.msrq.f16_d32_e4096 |
| LFQ | Lookup-free / implicit codebook quantization | discrete.lfq.f16_d10_b10, many f/d/b sweeps |
| Simple QINCo / QINCo / RQ variants | Residual and improved QINCo-style quantizers | discrete.simple_qinco.*, discrete.qinco.*, discrete.rsimple_qinco.*, discrete.rqvae.* |
| SimVQ | SimVQ-style discrete bottleneck | discrete.simvq.f4_d3_e8192, … |
| FSQ | Finite scalar quantization | discrete.fsq.f8_d4_l16384, discrete.fsq.f16_d256_e8, … |
| BSQ | Binary spherical quantization | discrete.bsq.f16_d10_b10, … |
| HCVQ | Hybrid conv/ViT quantizer presets (residual, soft, grouped, SD-VQ, MS-RQ, VAE) | discrete.hcvq.residual_vq.S_16, discrete.hcvq.sd_vq.S_16, … |
A ViT-based AE entry used alongside HCVQ-style pipelines is registered as discrete.hcvq.vae.S_16 (builder in continuous/register.py).
Registration: medlat/first_stage/discrete/register.py.
D. Standalone quantizers (discrete.quantizer.*)
Use these when composing custom VQ models or for ablations. Registered names include:
vector_quantizer, vector_quantizer2, gumbel_quantizer, simple_qinco, residual_quantizer, grouped_residual_quantizer, msrq_vector_quantizer2, msrq_vector_quantizer3d, lookup_free_quantizer, binary_spherical_quantizer, finite_scalar_quantizer, soft_vector_quantizer, …
Full names are discrete.quantizer.<name>. Implementation: medlat/first_stage/discrete/quantizer/quantize.py.
E. Autoregressive generators
| Family | Idea | IDs |
|---|---|---|
| MaskGIT | Masked token modeling | maskgit.b, maskgit.l, maskgit.h |
| MAR | Autoregressive over tokens | mar.b, mar.l, mar.h |
Registration: medlat/generators/autoregressive/maskgit/register.py, mar/register.py.
F. Non-autoregressive (diffusion) generators
| Family | Idea | IDs |
|---|---|---|
| DiT | Diffusion transformer (patchified latent) | dit.s_1 … dit.s_8, dit.b_*, dit.l_*, dit.xl_* (depth × patch size) |
| LDM | Latent diffusion UNet (stride in ID) | ldm.f1 … ldm.f16 |
| ADM | Dhariwal–Nichol–style UNet diffusion + classifiers | adm.diffusion.{64,128,256,512}{C,U}, adm.classifier.{64,128,256,512}C |
Diffusion sampling utilities live under medlat/diffusion/ (e.g. create_gaussian_diffusion).
Registration: medlat/generators/non_autoregressive/dit/register.py, ldm/register.py, adm/register.py.
Examples (notebooks)
| Notebook | Topic |
|---|---|
example_tokenizer.ipynb |
Train / use first-stage models |
example_generator_maskgit.ipynb |
MaskGIT pipeline |
example_generator_mar.ipynb |
MAR pipeline |
example_generator_nonautoregressive.ipynb |
DiT / LDM / ADM-style generation |
Discovering models in code
from medlat import available_models
# Everything
all_ids = list(available_models())
# By prefix
token_ids = list(available_models("token."))
vq_ids = list(available_models("discrete.vq."))
dit_ids = list(available_models("dit."))
Citation
If you use MedLat in research or a publication, please cite the software. Version and author metadata also appear in pyproject.toml.
BibTeX:
@software{bubeck_medlat_2025,
author = {Bubeck, Niklas},
title = {{MedLat}: {PyTorch} library for first-stage models and latent generators},
url = {https://github.com/niklasbubeck/MedLat},
version = {0.1.0},
year = {2025},
}
Plain text (APA-style):
Bubeck, N. (2025). MedLat (Version 0.1.0) [Computer software]. https://github.com/niklasbubeck/MedLat
License
MIT — see pyproject.toml for the declared license and author metadata.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file medlat-0.1.0.tar.gz.
File metadata
- Download URL: medlat-0.1.0.tar.gz
- Upload date:
- Size: 211.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
501f266b8f54371ab87c4a3533883af8278c2b54fd820ebc2302ebc336fd1f53
|
|
| MD5 |
3d3aae6b601cd9286510e1690f7a8617
|
|
| BLAKE2b-256 |
ac460214e448a8b609b1a53d8891d90d57b515ddc99c15c699684c35ff8ba572
|
File details
Details for the file medlat-0.1.0-py3-none-any.whl.
File metadata
- Download URL: medlat-0.1.0-py3-none-any.whl
- Upload date:
- Size: 238.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdb8f3aed99685e2abaa4b85c22e14a18e38d11a3d579dbe95f8f97cf8b31ad8
|
|
| MD5 |
0b289f0e83f7bd22fd7bac14fa0efada
|
|
| BLAKE2b-256 |
77154d3dfed0045837ec7a072c775fa39958d4c44c2774054847b3fd2b725293
|