← Projects

Fireline: forecasting tomorrow's wildfire from satellites

Next-day wildfire spread on WildfireSpreadTS: a small U-Net, where tomorrow's fire comes from, a test of JEPA pretraining, and a leak in the benchmark's vegetation channels.

Test year 2021: AP 0.567 for next-day fire, against 0.407 for the best baseline. JEPA pretraining did not help at this data scale.

Fireline predicts which 375 m pixels of an active wildfire will be burning tomorrow, from the last five days of satellite, weather and terrain data. It also tests whether self-supervised pretraining (a JEPA) helps when labelled fires are scarce.

Dixie Fire, Northern California · 2021, test year

10 km

Aug 18 → Aug 19: 2,499 fire pixels today, 1,909 tomorrow.

  • Fire today
  • Predicted fire tomorrow (darker = more likely)
  • Actual fire tomorrow
  • Predicted and burned
  • Missed
  • False alarm
  • Fire today

Aug 18 → Aug 19 351 km² burning today → 268 km² tomorrow · F1 0.65

The Dixie Fire (2021) in WildfireSpreadTS, a fire from the test year, which was scored once after all choices were made. Each step shows one day: the supervised model sees the previous five days and predicts which 375 m pixels burn the next day. Bars: fire the next day (67 days), green the share predicted. The fire was chosen by a fixed rule (most days with at least 50 fire pixels the next day), not by how well the model did on it; the story buttons follow a stated rule too: start: first day with at least 50 fire pixels tomorrow; largest day: most fire tomorrow; among days with at least 500 pixels tomorrow, best: highest F1, typical: median F1; shown in date order. Area shown: about 88 km wide. Fire detections: VIIRS active fire (WildfireSpreadTS, CC BY 4.0); terrain shading from its elevation band.
Next-day fire · test year 2021 · 3,337 fire-days, scored once
Method AP AP within 1.9 km F1 at 0.5 Validation AP
Persistence tomorrow's fire = today's fire 0.287 0.383 0.535 0.196
Neighbourhood share of today's fire in the surrounding 5 × 5 pixels (1.9 km) 0.407 0.474 0.489 0.276
Supervised U-Net U-Net on the previous 5 days, 1.5 M parameters 0.567 0.640 0.590 0.458
AP (average precision) summarises the precision–recall curve over all fire pixels of the next day; prevalence is 0.29% of valid pixels. Persistence gives a yes/no answer, so its AP rests on a single operating point and F1 is the fairer comparison for it. Validation year 2020 has more fire far from the previous day's (23% vs 12%), so every method scores lower there; compare methods within a year.

Three findings carry the report. The model is good where the fire already is and poor where it jumps: most of its skill is within 750 m of today’s fire, and the largest day of the Dixie Fire in the timeline is mostly missed (Analysis). JEPA pretraining on the same fires did not beat a randomly initialised frozen encoder by more than run-to-run noise (Does JEPA pretraining help?). And the benchmark’s vegetation channels contain information from after the prediction day (A leak in the benchmark).

Task

Given five consecutive days of data for one fire, predict a probability of active fire for every pixel on the next day. The label is the next day’s VIIRS active-fire detection. Fire pixels are rare (0.3% of valid pixels), so results are reported as average precision (AP) over all pixels, and as F1 at a probability of 0.5.

Data

WildfireSpreadTS Gerard et al., WildfireSpreadTS: A dataset of multi-modal time series for wildfire spread prediction (NeurIPS 2023 Datasets and Benchmarks) proceedings.neurips.cc has one image per fire and day for 607 US fires from 2018 to 2021, with 23 channels: active fire, satellite reflectance and vegetation, observed and forecast weather, terrain and land cover.

Fires and daily images per year

  • 2018 176 fires · 3,773 days · train
  • 2019 74 fires · 1,425 days · train
  • 2020 201 fires · 4,292 days · validation
  • 2021 156 fires · 4,117 days · test

607 fires, 13,607 daily images in total; 375 m pixels.

23 input channels per day

Fire
VIIRS active fire (the target, also an input)
Satellite
VIIRS reflectance M11, I2, I1
NDVI and EVI2 vegetation composites
Weather (observed)
precipitation, wind speed and direction
min / max temperature, humidity
energy release component, drought index (PDSI)
Weather forecast
precipitation, wind speed, temperature, humidity
Terrain and land
elevation, slope, aspect
land cover (17 classes)
WildfireSpreadTS (Gerard et al., NeurIPS 2023 Datasets and Benchmarks; CC BY 4.0): US fires 2018–2021, one image per fire and day. The split is chronological: train on 2018–2019, choose models on 2020, score 2021 once.

The split is by year, as a forecaster would face it: train on 2018–2019, choose every model and setting on 2020, and score 2021 once at the end. The forecast wind direction channel is dropped (it is wrongly encoded in the dataset), and observed wind is converted to east and north components.

Model

The model has to combine three kinds of information: where the fire is now and how it moved over the last days, the landscape it is moving into, and the weather. It is a U-Net, the standard architecture for per-pixel prediction, with one change: an encoder that reads one day at a time, followed by a step that fuses the five days. The figure follows one real sample through the network, the Dixie Fire on 18 August 2021, predicting 19 August.

AInputsfive days per sample · Aug 14 – Aug 18, predicting Aug 19

  1. day −4 Aug 14
  2. day −3 Aug 15
  3. day −2 Aug 16
  4. day −1 Aug 17
  5. today Aug 18
Active fire
no composite for this day
Vegetation (NDVI)
Energy release component
Max temperature
Wind speed
Elevation (shaded)

Six of 18 daily channels on Aug 18, plus 21 static channels (terrain, downslope direction, 17 land-cover classes). Weather comes at about 4.6 km, so it looks blocky at 375 m; vegetation composites have gaps, like this one.

BEncoderone CNN, the same weights for every day · 621,824 parameters

  1. Residual conv block 32 channels · 1 scale (375 m pixels) · full resolution
  2. Residual conv block, stride 2 64 channels · ½ scale (750 m pixels)
  3. Residual conv block, stride 2 128 channels · ¼ scale (1.5 km pixels)
  4. Residual conv block, stride 2 128 channels · ⅛ scale (3 km pixels) · latent grid

Each block: two 3 × 3 convolutions with group normalisation and GELU, plus a skip connection. Output: four feature maps per day, from fine detail at full resolution to a coarse 1/8 grid.

Full-resolution features, 32 channels

Aug 14
Aug 15
Aug 16
Aug 17
Aug 18

1/8 features, 128 channels

Aug 14
Aug 15
Aug 16
Aug 17
Aug 18

Colours are the first three principal components of each scale's features. The full-resolution maps follow terrain, vegetation and the fire; on the coarse grid the active fire areas stand out, and they move from day to day.

CFusion over daysat each of the four scales

Stack the five days, mix with a 1 × 1 convolution

5 × C channels → C channels, then group normalisation and GELU. The convolution learns how much each day and feature matters at every pixel: what burned today, what burned before, and how the weather changed.

  • 1: 160 → 32
  • ½: 320 → 64
  • ¼: 640 → 128
  • ⅛: 640 → 128
Fused 1/8 features

DDecoderU-Net upsampling with skip connections

  1. Upsample ⅛ → ¼, join fused ¼ featuresresidual conv block, 128 channels
  2. Upsample ¼ → ½, join fused ½ featuresresidual conv block, 64 channels
  3. Upsample ½ → 1, join fused full-resolution featuresresidual conv block, 32 channels
  4. Residual conv block, 1 × 1 convolution, sigmoidprobability of fire tomorrow
Output for Aug 19: predicted (blue), actual (red outline), today's fire (orange)

Fire fronts are a few pixels wide. Feeding today's fire mask straight to the last layer keeps them sharp; the deep path alone blurs them.

Training. 1,508,481 parameters. Loss: binary cross-entropy + soft Dice, over valid pixels (Dice counters the 0.3% fire share). AdamW, learning rate 0.001, weight decay 0.0001; 1 warm-up epoch, then cosine decay; gradient norm clipped at 1; batch 32; 30 epochs on 128 × 128 crops biased towards fire, with random flips and rotations. The epoch with the best validation AP is kept.

Inference. Whole images, padded by reflection to a multiple of 32; the padding is excluded from all scores.

Two design choices matter for the rest of the report. Because the encoder sees a single day, a self-supervised encoder of a single day can later be swapped in and frozen without changing anything else (the JEPA experiment). And because today’s fire mask reaches the output layer directly, the model can always fall back to “the fire stays where it is”, which is a strong prior: about half of tomorrow’s fire is burning today.

Results

How the Forecasts Are Scored

The model outputs a probability for every pixel. Turning that into a yes/no map needs a threshold, and every threshold trades two kinds of error: flag too much and most flagged pixels do not burn (low precision); flag too little and most of the fire is missed (low recall). Move the threshold below on one real day and watch the trade-off.

Hits
–
flagged, and burned
False alarms
–
flagged, no fire
Misses
–
burned, not flagged
Precision
–
hits ÷ flagged: when it says fire, how often is it right?
Recall
–
hits ÷ burned: how much of tomorrow's fire does it find?
F1
–
balance of the two at this threshold
Recall Precision 0 1 0 1

This day's AP

–

AP (average precision) is the shaded area: precision averaged over every recall level, i.e. over all thresholds at once. 1.0 means every burning pixel is ranked above every other; random scores get the fire share, here –.

Dixie Fire, Aug 18 → Aug 19 (the timeline's typical day), in the area shown. Pooled over all 3,337 test fire-days the same quantities give the numbers below. AP needs no threshold, so it compares models fairly; F1 at 0.5 shows how a fixed yes/no map would do.

Average precision summarises the whole precision–recall curve in one number, so it does not depend on a chosen threshold. It is the right headline for a rare class: a model that says “no fire” everywhere is 99.7% accurate here, but its AP is the fire share, 0.003. All AP values in this report pool every valid pixel of every evaluated fire-day, so large fire days weigh more than small ones. F1 at a threshold of 0.5 is reported alongside, as the score of a fixed yes/no map.

Model Against Baselines

Two baselines use only today’s fire. Persistence predicts that tomorrow’s fire is today’s. The neighbourhood score is the share of fire among each pixel’s 5 × 5 neighbours (1.9 km), so pixels next to the fire rank above distant ones.

Test year 2021 · all pixels of 3,337 fire-days

  • AP ranking quality over all thresholds

    0.290.410.57

  • F1 at 0.5 balance of precision and recall

    0.530.490.59

  • Precision at 0.5 flagged pixels that burned

    0.530.560.60

  • Recall at 0.5 burning pixels that were flagged

    0.530.430.58

  • Persistence
  • Neighbourhood
  • Supervised U-Net
The model ranks pixels much better than either baseline (AP). As a yes/no map at 0.5 it is ahead on precision and recall at once; it flags 0.97 times the area that burns, so it neither over- nor under-predicts overall. Persistence's precision and recall are nearly equal because, summed over all days, today's and tomorrow's fire are about the same size. The neighbourhood score at 0.5 flags only pixels with at least half of their 5 × 5 surroundings burning, which explains its low recall.

On the test year the model reaches AP 0.567 against 0.407 and 0.287. Its gain over persistence in F1 is smaller (0.59 against 0.53), because persistence is already a decent yes/no map: most of tomorrow’s fire is today’s. What the model adds is ranking: it puts the pixels most likely to burn first, including pixels next to the fire that persistence cannot flag.

Scores are higher on 2021 than on the 2020 validation year for every method, the baselines included (persistence 0.287 against 0.196). 2021 has less fire far from the previous day’s, so it is an easier year. Methods are compared within one year throughout.

Analysis: Where Tomorrow’s Fire Comes From

A single AP hides where the model succeeds and where it fails. This section splits tomorrow’s fire by where it appears relative to today’s.

How Far Fire Moves Overnight

Tomorrow's fire by distance from today's · test year 2021
Distance from today's fire Share of tomorrow's fire AP
On fire today 0.53 0.57 0.77
≤ 750 m 0.14 0.26 0.41
0.75–1.9 km 0.03 0.03 0.16
1.9–3.75 km 0.01 0.01 0.07
3.75–7.5 km 0.00 0.00 0.02
> 7.5 km 0.00 0.00 0.00
No fire today in the image 0.00 0.00 0.05
  • Persistence
  • Neighbourhood
  • Supervised U-Net
Distance is to the nearest pixel burning today (square distance, 1 px = 375 m). AP is computed over each ring's pixels separately. Persistence and the neighbourhood score cannot reach fire more than 1.9 km away by construction; the model can, but rarely does. Validation (2020) shows the same pattern with more far fire: 23% of tomorrow's fire lies beyond 1.9 km, against 12% in 2021.

80% of tomorrow’s fire is either already burning or within 750 m of today’s fire, and that is where the model’s skill is: AP 0.77 on pixels burning today and 0.41 on the first 750 m. Each ring further out roughly halves the AP. Beyond 1.9 km it is below 0.1, and for fire in images with no fire today it is 0.05. The baselines cannot reach beyond 1.9 km at all, so the model’s gain is real at every distance, but small where it matters most for warning.

Good Days and Bad Days

The same split, per day: for each test fire-day, how well the model did against how much of the next day’s fire appeared far from today’s.

Test 2021 · 2,126 fire-days with at least 10 fire pixels tomorrow · median F1 0.53

0.64 0.52 0.35 0.08 0% 25% 50% 75% 100% 0 0.5 1 Share of tomorrow's fire more than 1.9 km from today's F1
Each dot is one fire-day (size: fire tomorrow); orange bars give F1 pooled over the days in each band (1339 days, 320 days, 188 days, 279 days). On days where the fire stays close, the model scores like its overall result; when most of tomorrow's fire appears far away, F1 falls towards zero.

Most fire-days are “close” days, and on those the model is consistent (pooled F1 0.64). On the 279 days where most of the next day’s fire is far away, F1 drops to 0.08: those are days the model does not see coming.

A Few Days Hold Most of the Far Fire

Share of all far fire, from the fire-days with the most far fire

1 10 100 1000 0% 50% 100% Number of fire-days (log scale) 36 days 105 days
  • 2020 (validation): half of all far fire in 36 of 3,287 fire-days (1.1%)
  • 2021 (test): half of all far fire in 105 of 3,337 fire-days (3.1%)

Far fire is not spread evenly. In 2020, half of it came from 36 fire-days, 1.1% of all fire-days; in 2021 it took 105 days (3.1%). These are the days that matter for warnings, such as a run or a large spot fire, and they are exactly the days a model trained on all days learns least about.

What the Inputs Can Explain

For each far fire pixel, the inputs were checked for a plausible cause, in order: was there fire nearby on the previous days (a re-flare or a missed detection), was today’s view blocked, and is the pixel downwind of today’s fire?

2020 (validation) · 23% of tomorrow's fire is far

The 10 fire-days with the most far fire hold 27% of it.

2021 (test) · 12% of tomorrow's fire is far

The 10 fire-days with the most far fire hold 17% of it.

  • Burned nearby in the last few days a re-flare, or today's detection was missed
  • No clear satellite view today clouds or gaps at the pixel
  • Downwind of today's fire within 60° of the day's mean wind direction
  • None of these new ignition, or a cause the inputs do not show
Far = more than 1.9 km (5 px) from today's nearest fire pixel, or in an image with no fire today. Each far pixel is assigned the first matching explanation in the order listed. "Downwind" is weak evidence: a 120° cone would catch about a third of pixels at random directions, and 35–41% is not much more.

Most far fire has no visible cause in the inputs. Wind direction is weak evidence: a 120° downwind cone catches about a third of random directions, and 35–41% is only slightly more. The weather inputs are daily means at about 4.6 km, so the afternoon wind shift, gust front or lightning strike that starts a run is not in the data.

A Gap in the Record

The largest day of the Dixie Fire in the timeline shows how data gaps add to the problem.

Aug 3 → Aug 4 today 919 · tomorrow 0 fire pixels 0 hits · 0 missed · 916 false alarms

Aug 4 → Aug 5 today 0 · tomorrow 4,550 fire pixels 446 hits · 4,104 missed · 221 false alarms

Aug 5 → Aug 6 today 4,550 · tomorrow 3,804 fire pixels 2,462 hits · 1,342 missed · 1,263 false alarms

  • Fire today
  • Predicted and burned
  • Missed
  • False alarm
No fire pixels are recorded for this fire on 4 August, although it burned on the days either side. On 3 → 4 August the model's continuation of the fire is scored as false alarms; on 4 → 5 August it starts with no fire "today" and finds a tenth of the next day's fire, using only the earlier days.

There are no fire detections for this fire on 4 August, between 919 fire pixels on the 3rd and 4,550 on the 5th: a gap in the observations, not a pause in the fire. Gaps like this cost twice. The model’s sensible prediction for the 4th is scored as 916 false alarms, and on the 5th it has no “today” fire to extend. It still finds 10% of that day’s fire from the earlier days.

Does JEPA Pretraining Help?

The Idea

Supervised training uses a thin signal. The label is tomorrow’s fire mask, 0.3% of pixels are positive, and the training years provide about 5,200 labelled fire-days. Everything else in the scene, how vegetation dries, how heat builds, how the weather changes, is learned only as far as it helps predict that mask.

A joint-embedding predictive architecture (JEPA) Assran et al., Self-Supervised Learning from Images with a Joint-Embedding Predictive Architecture (I-JEPA, CVPR 2023) arxiv.org learns by predicting the representation of one part of the data from another, rather than its pixels. For video, the same idea learns motion and dynamics without labels Bardes et al., Revisiting Feature Prediction for Learning Visual Representations from Video (V-JEPA, 2024) arxiv.org . Fire spread is a forecasting problem, so the natural JEPA task is to predict tomorrow’s representation from the last five days.

Supervised U-Net learns from

Tomorrow's fire mask

  • One label per pixel per day: fire or not, and only 0.3% of pixels are fire.
  • Only labelled fire-days: 5,198 daily images from 250 fires to train on.
  • Gradient signal sits at the fire edge; everything else in the scene is learned only as far as it helps that edge.

JEPA learns from

Tomorrow's whole scene, as a representation

  • A target at every pixel, every day: how fire, vegetation, weather and heat change overnight.
  • No labels needed: in principle any sequence of satellite days, with or without fire, can be used.
  • Prediction in representation space: the model can ignore what cannot be predicted (clouds, sensor noise, detection gaps) instead of spending capacity on reconstructing pixels.

The bet: an encoder trained to forecast the scene's next state learns the dynamics that drive spread, and a small head on top needs few labelled fires to turn that into a fire forecast.

Setup

1Pretraining: predict tomorrow's representationno fire labels as targets

Context: days t−4 … t

Encoder (the spread model's per-day encoder, same architecture) → five 1/8 latent grids, 128 channels each (3 km cells)

↓

Predictor (convolutional, at 1/8) input: the five latent grids + tomorrow's weather forecast (issued before tomorrow) output: predicted latent grid for day t + 1

Target: day t + 1

Target encoder = moving average of the encoder's weights no gradients; a slowly moving copy keeps the target stable

↓

Target latent grid for day t + 1 layer-normalised
Loss = squared error between predicted and target latent, per 3 km cell, weighted towards cells near fire (today or tomorrow) + variance and covariance terms that stop all latents collapsing to one value.
  • JEPA-next: target = tomorrow's latent
  • JEPA-weighted: same, loss weighted on cells where the fire changes
  • JEPA-change: predicts the change from today's latent; the loss is divided by the error of predicting no change, so a representation that barely changes does not make the task easy

↓ freeze the encoder

2Probe: the same spread model, encoder frozenfire labels used here only

The pretrained encoder replaces the spread model's encoder and is frozen; fusion and decoder (886,657 parameters) are trained exactly as in the supervised model and selected on validation. Control: the same probe on a frozen random encoder, which shows what the decoder achieves with features that encode nothing learned.

All variants pretrain for 30 epochs on the training years (2018–2019), the same fires the supervised model sees, and are probed on 2020. JEPA-next, JEPA-change and the random-encoder control were also scored on the test year; JEPA-weighted, which behaved like JEPA-next, was not.

The experiment was pre-registered: before any JEPA result, three gates were fixed that decide whether the approach is viable. The representation must not collapse (effective rank above a quarter of its 128 dimensions). The predictor must beat the trivial forecast “tomorrow’s representation equals today’s” by at least 10% on cells near the fire. And a frozen encoder must reach validation AP within 0.03 of the supervised model (0.43 or more).

Experiments and Results

Gate: does the predictor beat "tomorrow = today" near the fire?

  • JEPA-next Predict tomorrow's latent map; loss: squared error, weighted near fire

    1.01 × copy error · fails

  • JEPA-weighted Predict tomorrow's latent map; loss: squared error, weighted where the fire changes

    1.01 × copy error · fails

  • JEPA-change Predict the change from today's latent; loss: squared error divided by that of predicting no change

    0.67 × copy error · passes

Next-day AP with the encoder frozen · test 2021 (validation 2020)

  • Supervised U-Net (trained end to end) 0.567 (0.458)
  • JEPA-change, frozen encoder 0.514 (0.403)
  • Random frozen encoder 0.497 (0.388)
  • JEPA-next, frozen encoder 0.451 (0.359)
Upper: prediction error divided by the error of copying today's latent, on latent cells near the fire, after pretraining; the tick marks the pre-registered gate (≤ 0.9), the faint line 1.0. Lower: every frozen encoder feeds the same fusion and decoder, trained the same way (886,657 trainable parameters); JEPA-weighted matched JEPA-next on validation (0.362) and was not carried to the test year. The viability bar for a frozen encoder was within 0.03 of supervised on validation (≥ 0.43); single-run AP varies by about 0.03.

Validation AP during probe training (2020), encoder frozen except for the supervised model

0.20 0.25 0.30 0.35 0.40 0.45 0.50 0 10 20 30 Epoch viability bar 0.43 Supervised JEPA-change Random encoder JEPA-next
Dots mark each run's best epoch, the checkpoint used on the test year. JEPA-change stays within 0.03 of the random encoder at every epoch, mostly slightly above it; JEPA-next falls below it after the first few epochs.

None of the variants collapsed (effective rank 125–127 of 128). JEPA-next and JEPA-weighted failed the second gate: their predictor was no better than copying today’s representation (1.01 times the copy error). JEPA-change, which predicts the change, passed it with 0.67 times the copy error, but its frozen encoder reached AP 0.403 on validation, below the 0.43 bar, and 0.514 on the test year. That is 0.015 and 0.017 above the random encoder: the same direction in both years, but within the noise of a single run. The verdict, by the rule fixed in advance, is not viable.

Why It Failed

Test AP, adding one part at a time

  1. Persistence tomorrow = today

    0.287
  2. Neighbourhood today's fire, blurred over 1.9 km

    0.407 +0.120
  3. Random frozen encoder untrained encoder; fusion and decoder trained

    0.497 +0.089
  4. Supervised U-Net encoder trained too

    0.567 +0.071
The tick on the last bar is JEPA-change's frozen encoder (0.514). A random, untrained encoder already gets 88% of the full model's AP: most of the skill comes from today's fire and the trained fusion and decoder. A better encoder can only add to the last 0.071.

Three things worked against it, and the ladder above shows the most important one.

The encoder had little room to help. A frozen, untrained encoder with a trained fusion and decoder already reaches 0.497, 88% of the full model. Most of the skill comes from today’s fire, which reaches the decoder directly, and from what the decoder learns. Training the encoder end to end adds 0.07 AP; JEPA-change recovered about a quarter of that.

Copying was almost the right answer. In JEPA-next the representation barely changed from one day to the next: the error of copying today’s representation was 0.013, about 1% of the target’s variance. Terrain, land cover and most of the weather are the same tomorrow, so an encoder can satisfy “predict tomorrow” by encoding what does not change. Weighting the loss towards fire cells (JEPA-weighted) did not change this. Predicting the change (JEPA-change) forced the predictor to model what moves, but what moves from day to day is mostly the fire itself, which the decoder already sees.

The pretraining saw no more data than the supervised model. JEPA results in vision come from pretraining on far more unlabelled data than labelled data. Here both used the same 2018–2019 fires, about 5,200 days, so the test was whether the objective helps on the same data, not whether more data does. And the information that would explain far fire (sub-daily wind, lightning) is not in the inputs, so no objective could learn it.

Where It Could Work

The negative result is specific to this setting, and it points to where JEPA has a better chance:

  • Far more unlabelled data. Daily satellite and weather data exist for every day of every year over fire-prone land, with or without fire. That is orders of magnitude more than the labelled fire-days, and it is the regime in which self-supervised pretraining usually pays off.
  • Few labels. The probe here had all the labelled fires. Pretraining is most useful when labels are scarce, for example a new region or sensor; training the probe on a tenth of the fires would test that directly.
  • Richer dynamics. With sub-daily inputs (geostationary fire detections every few minutes, hourly wind), “predict the next state” contains far more than the static landscape, and copying stops being a good answer.
  • A shared representation. A forecasting encoder could serve several tasks at once: spread, burn severity, smoke. That is where a frozen, general encoder would earn its keep over a model trained for one task.

A Leak in the Benchmark

What the NDVI channel on day t contains

t − 15t (prediction day)t + 15
  • 16-day composite window (here starting 4 days before t)
  • days after t inside the window

Mean NDVI change when the composite updates

  • Burns 1–15 days after the update 825,532 pixel-updates -0.058
  • Burns more than 15 days after 342,110 pixel-updates -0.011
  • Never burns, within 1 km of the fire 2,123,718 pixel-updates -0.008
  • Never burns, farther away 103,437,883 pixel-updates -0.002
Every composite update in all 607 fires, 2018–2021. A pixel that burns within the new window shows a drop before it burns; one that burns later does not. Its drop is larger than for unburned neighbours with AUC 0.62 (each year 0.62, 0.61, 0.61, 0.62). EVI2 shows the same (AUC 0.57). Each composite is stamped with its window's start date (checked against NASA's catalogue).

The NDVI and EVI2 channels are 16-day vegetation composites, updated every 8 days. The value on day t comes from the latest composite whose window started within the previous 15 days, so the window always reaches 8 to 15 days past t: part of each composite is observed after the prediction day. If a pixel burns inside that window, its vegetation index already drops at the composite update, before it burns.

Per fire: NDVI drop of pixels about to burn, beyond that of their unburned neighbours

0 50 100 150 −0.15 −0.10 −0.05 0 +0.05 Median NDVI change at the update: pixels that burn within the window minus unburned neighbours
287 fires: pixels about to burn drop more
165 no difference
41 drop less
Each bar covers 0.01 of NDVI; 493 fires with at least 20 pixels in each group, 2018–2021, values beyond the axis are counted in the end bars. Many fires show no difference because both medians fall in the same 0.005 bin. Where there is a difference, it is in the direction of the leak in 287 of 328 fires.

The effect is modest but consistent: AUC 0.61–0.63 in every year, and the same direction in 287 of 493 fires. Results here use the channels as published, for comparability with other work on the benchmark; the leak is a property of the data, not of this model. A deployed model would need vegetation composites that end before the prediction day.

What Didn’t Help

If far fire is often downwind, giving the model explicit wind and distance features should help it look in the right direction. This was pre-registered with a target of +20% AP at 0.75–3.75 km from today’s fire.

AP with and without wind and distance features
Distance from today's fire Validation 2020 Test 2021
0.75–1.9 km 0.197 → 0.206 +5% 0.164 → 0.176 +7%
1.9–3.75 km 0.085 → 0.096 +13% 0.072 → 0.081 +13%
All pixels 0.458 → 0.458 +0% 0.567 → 0.560 -1%
Supervised model → the same model with five extra channels per input day: distance to that day's fire, its fire mask shifted 0.75, 1.5 and 3 km downwind, and how far the wind blows uphill. The criterion, fixed before the run, was at least +20% AP in both rings with overall AP no more than 0.01 lower; it was not met in either year. The extra channels made training converge faster but did not change where it ends.

Validation AP during training (2020)

0.30 0.35 0.40 0.45 0.50 0 10 20 30 Epoch Supervised + wind features
With the extra channels the model learns faster in the first epochs (0.39 against 0.35 after two), then both reach about 0.45.

The model already derives most of this from the fire mask and wind channels; the features only make it learn faster. What is missing is information, not presentation: daily mean wind at 4.6 km cannot show the gust that throws embers a kilometre ahead.

Limitations and Next Steps

Most of the limits on this model are limits of the data, and each has a concrete fix.

  1. One fire map per day

    VIIRS satellites pass over a few times a day and WildfireSpreadTS keeps one fire map per day. Smoke, clouds and gaps hide fire; runs that start and end between passes are invisible.

    Seen here: The Dixie Fire has no detections on 4 August, between two of its largest days. 6% of far fire in 2021 appears at pixels with no clear view on the last input day.

    Next: Geostationary fire detections (GOES-16/17, every 5–15 minutes at about 2 km) to fill gaps and give timing within the day.

  2. Weather as daily means at about 4.6 km

    Wind and humidity come from a daily gridded product. The afternoon wind shift or gust front that drives a run is averaged away, and the whole fire often sits in a few weather cells.

    Seen here: Downwind explains 35%–41% of far fire, barely above the third expected by chance; explicit wind features did not help.

    Next: Hourly, 3 km wind and humidity from a weather model analysis (for example HRRR), including gusts.

  3. No ignition sources

    New fires and spot fires start from lightning, embers and people. None of these is an input.

    Seen here: 39% of far fire in 2021 (52% in 2020) has no nearby recent fire, no observation gap and is not downwind.

    Next: Lightning strikes (ground networks or the GOES lightning mapper); roads and settlements as human-ignition proxies.

  4. Vegetation from the future, or missing

    NDVI and EVI2 are 16-day composites whose window extends past the prediction day; some days have no composite at all.

    Seen here: AUC 0.62 for the pre-burn drop; the Dixie Fire has no composite for 13–20 August.

    Next: Vegetation indices from reflectance up to the prediction day only (daily surface reflectance or a trailing composite).

  5. Labels are detections, not burned area

    A 375 m pixel is labelled fire when VIIRS sees a hotspot in it. Low-intensity or smouldering fire is missed and the same ground can flare again, so the label is noisy.

    Seen here: Fire that vanishes for a day and returns counts as new fire: 20% of far fire in 2021 (7% in 2020) is next to fire seen in the previous days.

    Next: Combine detections with daily perimeters or burn-scar maps to train on area that actually burned.

  6. Few fires, one run per arm

    607 fires in four years; every comparison here is one training run.

    Seen here: Differences below about 0.03 AP are not resolved, including JEPA-change against the random encoder.

    Next: More fire seasons, several seeds per arm, and unlabelled satellite years for pretraining.

Next Steps for Far Fire

The model is already good near the fire; the open problem is fire that appears far from it. The plan runs from cheap to large: first change what the model trains on, with the data it already has; then add the inputs that far fire depends on; then build a larger dataset, which also gives a clean new test season.

Next steps for far fire, from cheapest to largest

  1. 1

    Train on what matters

    current data · one training run each
    • Oversample far-fire days, upweight far pixels

      Half of all far fire sits in 1–3% of fire-days, and training crops centre on today's fire, so the loss barely sees it.

    • Predict at 3 km, not 375 m

      A warning needs “new fire likely in this cell”, not the exact pixel of a spot fire. Score it with a matching coarse metric.

    • Use the recent fire better

      Fire returning near earlier fire (20% of far fire in 2021, 7% in 2020) is already in the five input days, and the model still misses it.

  2. 2

    Add the missing inputs

    public data · a pipeline per source
    • Fire intensity (FRP) and every satellite pass NASA FIRMS VIIRS archive

      Intense fires throw embers further; day and night passes show where the fire moved, not one map a day.

    • Hourly wind, gusts and humidity at 3 km HRRR analysis

      Far fire downwind of today's (35% of far fire in 2021, 41% in 2020) is driven by the afternoon wind, which daily means hide.

    • Fire detections every 5–15 minutes GOES fire product

      Fills detection gaps like the Dixie Fire's 4 August (6% of far fire in 2021, 1% in 2020) and gives timing within the day.

    • Lightning, roads and settlements GOES lightning mapper, OpenStreetMap

      Fire with no visible cause (39% of far fire in 2021, 52% in 2020) likely includes many new ignitions, from lightning and people.

  3. 3

    More fires

    the largest gain, the largest build
    • More years: 2012 onwards

      VIIRS fire detections start in 2012. Rebuilding the dataset from the same public sources would more than triple the fire seasons, and far-fire days with them.

    • A new held-out test: 2022 onwards

      2021 has been scored once. Every change above is chosen on 2020, and a fresh season is needed to test it cleanly.

    • Unlabelled years for pretraining

      Daily inputs exist with or without fire. This is the setting in which JEPA pretraining could pay off, and it tests the idea properly.

Shares are the far-fire groups from the analysis above. Each step is judged on the 2020 validation year; the final comparison needs a season that no choice was made on.

Alongside these, every comparison here is a single training run, so several seeds per arm would resolve differences below 0.03 AP, including JEPA-change against the random encoder.