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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support