FlowSat β FMoW-RGB 512 px
Flow-matching diffusion transformer that generates satellite imagery from text and acquisition metadata: longitude, latitude, ground sample distance, cloud cover and date. Trained on FMoW-RGB at 512 px.
Code, documentation and the evaluation that produced the numbers below: https://github.com/dsp81/flowsat-satellite-image
Using it
pip install "flowsat @ git+https://github.com/dsp81/flowsat-satellite-image"
python generate.py --ckpt Djisgod/flowsat-fmow-512 \
--prompt "An airport surrounded by dry farmland, long grey runway crossing the centre." \
--lon 4.40 --lat 51.92 --gsd 0.5 --month 7
--ckpt takes this repo id directly; the weights download once into the usual
Hugging Face cache.
Results
FMoW-RGB test split, 10,000 samples, 20 Euler steps, text guidance 2.5, seed 42:
| FID β | CLIP β | SSIM β | LPIPS β | |
|---|---|---|---|---|
| As submitted | 31.10 | 0.3016 | 0.1600 | 0.6853 |
| These weights | 28.74 | 0.3019 | 0.1564 | 0.6574 |
Read the second row. These weights with the released evaluation code give FID 28.74, not the 31.10 printed in the paper. Three independent runs on the same checkpoint, captions and protocol agree to within 0.02 FID, so the gap is not the evaluation code; what differed in the submitted run has not been identified. The second row is what this repo id reproduces.
SSIM and LPIPS are paired against each caption's own source image, so they measure conditioning fidelity, not image quality β two real FMoW acquisitions of the same place score SSIM 0.214 / LPIPS 0.425 through the same pipeline.
FID is only comparable under a matched protocol. Reproduce these exactly, and read what has to match before comparing anything against them:
python -m flowsat.evaluation.evaluate_fmow \
--checkpoint Djisgod/flowsat-fmow-512 \
--fmow_test_root /path/to/fmow-full/test \
--caption_root /path/to/fmow_captions_test \
--output_dir evaluations/flowsat
β Reproducing the evaluation
Architecture
Sana-0.6B backbone (28 layers, linear attention, AdaLN-single) with a DC-AE 32Γ latent (16Γ16Γ32 at 512 px) and a frozen Gemma-2-2B text encoder. Metadata enters through a geometry-aware encoder β spherical lift for coordinates, cyclical encoding for dates β projected into the shared AdaLN modulation by a zero-initialised graft, so the model is byte-identical to its text-to-image initialisation at step 0 and metadata influence is learned rather than imposed.
Checkpoint
| file | model_0.pt (2.28 GiB, fp32) |
| sha256 | b9b64439a4d70eab62a82668fb21b6cabbdcbe18062e95bfb142203d50ffb972 |
| training step | 125000 |
| parameters | 612,119,200 across 583 tensors |
Load it with flowsat.checkpoint.resolve_checkpoint, which both generate.py
and the evaluation script use, or directly with torch.load(..., weights_only=True).
Citation
@inproceedings{parihar2026flowsat,
title = {FlowSat: Flow-Matching Diffusion Transformers with Metadata
Conditioning for Satellite Image Generation},
author = {Parihar, Digvijay Singh and Mondal, Rishabh and Batra, Nipun},
booktitle = {British Machine Vision Conference (BMVC)},
year = {2026}
}
Built on Sana, DC-AE and Gemma-2; the location encoding follows SatCLIP. Trained on FMoW, whose own licence governs the data.