fire-spread-forecast-v1-small

Outward spread, Tamarack Fire, Sierra Nevada at the California–Nevada border (WildfireSpreadTS fire_25294746), 2021-07-20 → 07-21. Charcoal: burning today. Blue: the model's P(fire in 24 h) on ground not burning today. Orange: where new fire was actually observed the next day.

What it does

Given a wildfire's current active-fire mask plus terrain, weather, fuel state and land cover on a 375 m grid, the model predicts, for every pixel, the probability that it is actively burning in the next 24 hours. Input is a WildfireSpreadTS-format daily GeoTIFF; output is a probability GeoTIFF on the same grid. It is a small UNet (1.94 M parameters) trained from scratch on 258 western-US fire events. No foundation-model weights are included; the model is entirely ours and MIT-licensed.

Code, training pipeline, demo maps and every evaluation script: https://github.com/eitanlebras/fire-spread-forecast

Results

WildfireSpreadTS test split (2021, 30 fires held out by year), 3 seeds, 95% CI. Persistence = "tomorrow's fire is today's fire".

value
AUC-PR 0.552 ± 0.003
Persistence baseline 0.273
Expected calibration error (15 bins) 0.0044
Growth region (pixels not burning today) 0.243 vs persistence 0.003

This checkpoint is seed 0 of that run, re-trained with weight saving on: test AUC-PR 0.543, ECE 0.0051.

The decomposition is the part worth reporting. Pooled over the 30 held-out fires and 599 fire-days, we split new fire into interior gaps (unburned pockets enclosed by yesterday's perimeter) and true advance (fire reaching ground beyond the outer boundary). Relative to each task's own chance rate, the model is 1.9× chance on interior fill (AUC-PR 0.451, chance 0.240) and 54× chance on advance (AUC-PR 0.065, chance 0.0012); on the strict advance definition (holes of the raw detection mask filled) it is 123× chance (AUC-PR 0.218, chance 0.0018). 19% of all advancing fire, across every fire and day, landed in the model's > 0.4 zone; 83% of interior fill did. The figure above is a held-out day of outward spread on the Tamarack Fire (fire_25294746, day 12: 160 advance pixels, 68% inside the > 0.4 zone, advance AUC-PR 0.541; interior gaps 162 pixels, AUC-PR 0.755). It was chosen after the fact from 599 days, so read it as an illustration next to the pooled numbers, not as evidence by itself. The other top advance frames are in the GitHub repo under demo/frames_advance_test/.

OlmoEarth ablation (weights not published). We also post-trained a variant that adds a 16-channel projection of OlmoEarth v1.2-Small Sentinel-2 embeddings (four pre-fire monthly composites) and fine-tunes the encoder's last two transformer blocks at lr 1e-5 with the head at 1e-3, 3 seeds:

baseline (this model) + OlmoEarth post-trained
AUC-PR 0.552 ± 0.003 0.547 ± 0.006
ECE 0.0044 0.0062
Growth region 0.243 0.238

Post-training gave no measurable improvement: the intervals overlap and calibration is slightly worse. All three eval curves plateaued by epoch 15 while training loss kept falling, so it was overfitting rather than undertrained; at 5,576 training tiles, 3.55 M additional trainable encoder parameters cost more than the pretrained fuel representation gained. The budgets differ (baseline early-stopped at epoch 56, the OlmoEarth arm ran 20). We report it because negative results on foundation-model transfer are underreported. Those weights are a derivative of OlmoEarth under Ai2's Artifact License and are not distributed; only this baseline is published.

Inputs

40 channels on the WildfireSpreadTS 375 m event grid, in this order (23 raw bands → authors' preprocessing → 40):

# channel source
1-3 VIIRS bands M11, I2, I1 (surface reflectance) VIIRS VNP09GA
4-5 NDVI, EVI2 VIIRS VNP09GA
6-12 total precipitation, wind speed, wind direction (sin), min temperature, max temperature, energy release component, specific humidity GRIDMET
13-15 slope, aspect (sin), elevation SRTM-derived terrain
16 Palmer drought severity index GRIDMET
17-33 land cover, one-hot over 17 classes (evergreen needleleaf … barren, water) MODIS MCD12Q1
34-38 forecast: total precipitation, wind speed, wind direction (sin), temperature, specific humidity GFS
39 active-fire detection hour today VIIRS VNP14
40 binary active-fire mask today derived from 39

Preprocessing (all in inference.py): detection time hhmm → hours; sin on the three degree features; standardize the 23 raw bands with the means and stds in config.json (the WildfireSpreadTS authors' 2018+2019 statistics); NaN → 0; land-cover integer → one-hot; zero-pad to a multiple of 32. Predictions over water (land-cover class 17) are set to 0. The normalization statistics are mandatory: inference.py refuses to run if config.json lacks them, because the weights produce confidently wrong output without them.

Usage

pip install torch numpy rasterio safetensors huggingface_hub
huggingface-cli download eitanlebras/fire-spread-forecast-v1-small --local-dir fire-spread-forecast-v1-small
cd fire-spread-forecast-v1-small
python inference.py --fire-dir /path/to/WildfireSpreadTS/2021/fire_25547988 --out preds/fire_25547988

(git clone also works if git lfs install has been run first; without git-lfs the clone contains a 132-byte pointer instead of model.safetensors, and inference.py will fail to load it.)

import torch, numpy as np
from inference import load_model, predict_fire
model, cfg = load_model(".", "cuda" if torch.cuda.is_available() else "cpu")
probs, dates, profile = predict_fire(model, cfg, "/path/to/WildfireSpreadTS/2021/fire_25547988", "cpu")
# probs[i] is P(active fire on dates[i+1]) per pixel, made from the observation on dates[i]

Input directory: daily GeoTIFFs named YYYY-MM-DD.tif with the 23 WildfireSpreadTS bands. Output: one float32 GeoTIFF per forecast day in the event's CRS, probs.npy of shape (T-1, H, W), and dates.json. Runs on CPU (about 4 s for an 18-day fire).

Intended use and out of scope

  • Decision support for planning and prioritisation. Not for evacuation decisions.
  • 375 m pixels, 24-hour horizon. The wind-driven runs that kill people happen faster and at finer scale than this model sees. Do not read a low probability as safety.
  • Trained on 258 western-US fire events, 2018-2021. Not validated anywhere else, in other fuel types, or in other years.
  • Labels are confounded by suppression. WildfireSpreadTS perimeters record where crews stopped the fire, not where it would have gone. The model cannot separate fire behaviour from containment, and neither can its scores.
  • Spotting is not predicted. Across all 599 held-out fire-days, the model placed no probability above 0.4 near any detached ignition ahead of the front. Those are stochastic at this resolution.
  • Input must be the exact WildfireSpreadTS band stack. It will silently mis-predict on any other channel order or units.

Training

WildfireSpreadTS (Gerard et al., NeurIPS 2023 Datasets & Benchmarks), the authors' year-based fold 0: train 2018-2019 (199 fires), eval 2020 (30), test 2021 (30). 128×128 tiles, kept when the input or the target contains fire, same rule for every split: 5,576 / 1,049 / 1,605 tiles. UNet, width 32, depth 3, GroupNorm, dropout 0.1, 1.94 M parameters. Batch 32, AdamW (lr 5e-4 after linear batch scaling, weight decay 1e-4, 100 warm-up steps, cosine), positive-weighted BCE (pos_weight 3), dihedral augmentation, early stopping on eval AUC-PR (patience 10 checks, eval every 2 epochs). Padded pixels are excluded from loss and metrics. One RTX 4090, about 7 minutes per seed.

Citation

WildfireSpreadTS:

@inproceedings{gerard2023wildfirespreadts,
  title={WildfireSpreadTS: A dataset of multi-modal time series for wildfire spread prediction},
  author={Gerard, Sebastian and Zhao, Yu and Sullivan, Josephine},
  booktitle={Thirty-seventh Conference on Neural Information Processing Systems Datasets and Benchmarks Track},
  year={2023},
  url={https://openreview.net/forum?id=RgdGkPRQ03}
}

This model:

@misc{lebras2026firespreadforecast,
  title={fire-spread-forecast-v1-small: next-day wildfire spread as per-pixel probability},
  author={Lebras, Eitan},
  year={2026},
  howpublished={\url{https://huggingface.co/eitanlebras/fire-spread-forecast-v1-small}}
}
Downloads last month
-
Safetensors
Model size
1.94M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support