Chennai LST U-Net

A small FiLM-conditioned U-Net that predicts the spatial pattern of land surface temperature over the Greater Chennai Corporation from urban form and that morning's weather, at 30 m.

2.02 M parameters. Test MAE 1.309 °C, r 0.932, skill +0.248 over pixel climatology, on 27.9 M held-out pixels.

The model predicts a within-scene anomaly — how much hotter or cooler each pixel is than the average of that same scene — not an absolute temperature. That choice is the point of the model: predicting absolute LST is easy and nearly meaningless, because most of the variance is "how hot was that day", which is readable straight off the weather vector. Removing the scene mean forces the network to explain spatial structure, which is the urban heat island signal.

What it is for

Given a city's fixed form and a day's weather, produce the heat pattern: which streets, plots and wards run hotter than their surroundings. It is used to rank neighbourhoods, compare land-cover types at matched distance from the coast, and generate hypotheses about interventions by perturbing the inputs.

It is not a nowcast and not a thermometer. See Limitations.

Inputs and outputs

Spatial input 21 channels, 128×128 px at 30 m
— 17 static GHSL built height / surface / volume; elevation, slope, aspect (sin, cos); distance to coast; 9 ESA WorldCover one-hot classes
— 4 dynamic NDVI, NDBI, NDWI, FVC from the same Landsat acquisition
Meteo vector 11 values: t2m, RH, u10, v10, shortwave radiation, VPD, wind speed (all percentile-scaled), plus sin/cos day-of-year, a year term, and an onshore-flow component
Output 1 channel, within-scene LST anomaly in °C

The onshore component is the sea-breeze signal as a single number: onshore = −0.966·u10 + 0.259·v10, derived from a shore-normal bearing of 285° for Chennai's N15°E coastline. Positive means marine air is being pushed inland.

Architecture

A four-level U-Net. The meteo vector goes through an MLP (11 → 128 → 128 → 512) producing per-channel scale and shift parameters applied at the bottleneck as x = x · (1 + γ) + β — FiLM conditioning. Because the conditioning acts per channel rather than per position, parameter count is independent of patch size.

This matters. The reference implementation (Delgado-Enales et al., Urban Climate 2025, for Bilbao) flattens the bottleneck and concatenates the meteo vector into a dense layer. That single layer is 79% of its parameters and grows with patch area: 4.2 M at 32 px, 67.2 M at 64 px, roughly 1.07 billion at 128 px.

Evaluation

Spatially blocked splits, stratified by distance to coast — train, validation and test occupy disjoint 8 km blocks, so no test pixel neighbours a training pixel.

Best model (FiLM, 128 px patches, 66 scenes):

metric value
MAE 1.3088 °C
RMSE 1.7744
Pearson r 0.932
pixel climatology MAE 1.7409
ridge MAE 2.1826
scene-mean MAE 3.6642
skill vs climatology +0.248
test set 2,112 patch-scenes / 27,938,332 pixels

Controlled architecture comparison — both runs share a byte-identical split (3343/795/735 patches; both report pixel_climatology MAE 1.6000292301177979 and ridge 2.0171847343444824 to every printed digit), so raw MAEs are directly comparable:

this model (FiLM) reference architecture
parameters 2.02 M 5.33 M
test MAE 1.3456 1.4388
skill vs climatology +0.159 +0.101
best epoch 16 3
train/val gap at best epoch 0.047 0.130

FiLM is 6.5% more accurate with 2.6× fewer parameters. Both architectures reach essentially the same training loss (~1.05); the difference is entirely generalisation. The reference architecture's validation loss stops improving at epoch 3 while its training loss keeps falling, which is what the 79%-in-one-dense-layer structure predicts.

Reproducibility. Retrained from scratch, the 33-scene configuration reproduced bit-identically: best validation loss 1.3186 both times, test MAE 1.3767924308776855 both times, matching epoch by epoch from epoch 1.

Training data

66 Landsat 8/9 Collection 2 Level-2 scenes, 2016-03-06 to 2026-06-06, March–June only (Chennai's pre-monsoon peak), cloud cover < 40%, over 80.048–80.350 E, 12.830–13.240 N. Surface temperature is the USGS single-channel retrieval (TIRS band 10 + ASTER GED emissivity + NCEP profiles) — not a split-window product; say so in any methods section.

Cloud, cloud shadow, cirrus, dilated cloud, snow and fill are masked from QA_PIXEL bits 0–5. Masking only the cloud bit leaves thin cirrus in the scene, which depresses retrieved surface temperature by several degrees and would be absorbed into the anomaly field as a fabricated cool spot.

Training used masked L1 loss, AdamW, ReduceLROnPlateau, early stopping with patience 12, batch size 16, on one RTX 5060 Laptop GPU.

Limitations

Read these before using any number from this model.

  • Surface, not air. LST is the temperature of roofs, roads and bare ground. Air temperature differences between places are roughly 2–4× smaller. An LST delta is never a delivered cooling benefit.
  • One overpass, ~10:30 local. Nothing here describes the afternoon peak or the night, and night is when heat does the most harm to health.
  • March–June, clear skies only. Cloud blocks thermal imaging, so the record is biased to clear pre-monsoon mornings.
  • Static inputs are frozen in time. GHSL is epoch 2018, ESA WorldCover is 2021, while the thermal record runs to 2026 — up to an 8-year gap, biased against the newest scenes in the fastest-growing wards.
  • The test set is 3 spatial blocks. The pixel count is large because every scene contributes; spatial independence rests on three blocks, inland-weighted.
  • The meteo conditioning is calibrated only for the dominant regime. Against observed coastal gradients: strong sea breeze (28 scenes) predicts +1.18 against +1.29 observed; land breeze (10 scenes) predicts +2.14 against +0.44 — an overstatement of roughly 5×. Do not use this model to extrapolate to rare weather regimes.
  • Counterfactuals are hypotheses. No cool-roofed Chennai exists in the training data, so perturbing the land-cover channels generates a hypothesis, not a prediction.
  • Chennai only. Coast geometry, the onshore bearing and the normalisation constants are specific to this city.

Usage

import torch, numpy as np
from model import build_model

ck = torch.load("best.pt", map_location="cpu", weights_only=False)
model = build_model(ck["arch"], ck["in_channels"], ck["meteo_dim"],
                    {"base_filters": 32}, ck["patch_px"])
model.load_state_dict(ck["model"]); model.eval()

x   = torch.randn(1, 21, 128, 128)   # 17 static + 4 dynamic, pre-normalised
met = torch.randn(1, 11)             # see meteo_scaling.json for the scaling
with torch.no_grad():
    anomaly_c = model(x, met)        # (1, 1, 128, 128), degrees C

inputs.npz in this repo carries the pre-normalised static and mean dynamic channels for the whole Chennai frame, and meteo_scaling.json the 2nd/98th percentiles used to scale raw weather values. The Space in this repo is a worked example.

Attribution

Required by the source licences. Reproduce these wherever the model or its outputs are used.

  • Landsat 8/9 Collection 2 Level-2 — USGS/NASA, public domain, courtesy of the U.S. Geological Survey. Accessed via the Microsoft Planetary Computer.
  • GHSL built height / surface / volume, R2023A — European Commission Joint Research Centre, CC BY 4.0.
  • ESA WorldCover 2021 v200 — © ESA WorldCover project / Contains modified Copernicus Sentinel data, CC BY 4.0.
  • Copernicus DEM GLO-30 — © DLR e.V. 2010–2014 / © Airbus Defence and Space GmbH, provided under the Copernicus DEM licence.
  • ERA5 via Open-Meteo — CC BY 4.0.

OpenStreetMap is not used in this model. It is used only for the place, street and ward geometry in the companion web map; those derived tables are ODbL and are published separately, not here.

Method adapted from Delgado-Enales, I. et al., Urban Climate (2025); reference implementation at github.com/InigoD/UHI-UNET.

Citation

@software{chennai_lst_unet,
  title  = {Chennai LST U-Net: FiLM-conditioned prediction of urban surface
            temperature anomaly},
  year   = {2026},
  note   = {2.02M parameters; 66 Landsat scenes, 2016--2026;
            test MAE 1.309 C, skill +0.248 over pixel climatology}
}
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

Space using rorinfo/chennai-lst-unet 1