Views
No views yet

| Modality | Bands | Input Resolution | Latent Channels |
|---|---|---|---|
| DEM | DEM | 64×64 | 8 |
| LULC | LULC | 192×192 | 8 |
| S1RTC | VV, VH | 192×192 | 8 |
| S2L1C | B02, B03, B04, B08 | 192×192 | 8 |
| S2L1C | B05, B06, B07, B8A, B11, B12 | 96×96 | 8 |
| S2L1C | B01, B09, B10 | 32×32 | 8 |
| S2L1C | Cloud mask | 192×192 | 8 |
| S2L2A | B02, B03, B04, B08 | 192×192 | 8 |
| S2L2A | B05, B06, B07, B8A, B11, B12 | 96×96 | 8 |
| S2L2A | B01, B09 | 32×32 | 8 |

1git clone https://huggingface.co/mespinosami/copgen-vaes ./models/vae
2rm -rf ./models/vae/.git ./models/vae/.gitattributesmodel-<step>-ema.pt alongside its config file. The EMA weights have already been extracted into the correct format for inference. To use a VAE directly:1from libs.vae import load_vae
2
3vae = load_vae(
4 config_path="configs/vae/final/S2L2A/copgen_ae_kl_192x192_S2L2A_B4_3_2_8_latent_8.yaml",
5 checkpoint_path="models/vae/S2L2A_192x192_B4_3_2_8_latent_8/model-50-ema.pt"
6)
7
8latents = vae.encode(image_tensor) # (B, 8, H/f, W/f)
9recon = vae.decode(latents)accelerate launcher and supports single- and multi-GPU setups.1# Example: train the S2L2A RGB+NIR VAE
2accelerate launch --num_processes 1 train_vae.py \
3 --cfg configs/vae/final/S2L2A/copgen_ae_kl_192x192_S2L2A_B4_3_2_8_latent_8.yaml \
4 --data_dir ./data/majorTOM/edinburgh/Core-S2L2Apython3 scripts/extract_ema_convert_model.py models/vae/<modality>/<config>/model-*.pt1@article{copgen2026,
2 title = {COP-GEN: Latent Diffusion Transformer for Copernicus Earth
3 Observation Data},
4 author = {Espinosa, Miguel and Gmelich Meijling, Eva and Marsocci,
5 Valerio and Crowley, Elliot J. and Czerkawski, Mikolaj},
6 year = {2026},
7 journal = {arXiv preprint arXiv:2603.03239},
8 url = {https://arxiv.org/abs/2603.03239},
9}