Hyperspectral wildfire analysis for Planet Tanager-1 imagery | burn severity mapping and live fuel moisture estimation for the 2025 LA wildfires.
FireSpec is an open-source Python toolkit built for the Planet Tanager Open Data Competition. It turns Tanager-1's 426-band hyperspectral imagery (380–2500 nm, 30 m GSD) into operational wildfire products: MESMA-based burn severity (CBI/BARC), live fuel moisture content (LFMC), multi-temporal recovery trajectories, and cross-sensor comparisons against EMIT, PRISMA, and Sentinel-2 using the 2025 LA wildfires as the case study.
Figures below are generated by the notebooks in
notebooks/and exported tofigures/. Runmake notebooks && make figures(or execute the notebooks directly) to reproduce them locally.
| Model | Metric | Value |
|---|---|---|
| Burn severity (Random Forest, 5-fold CV) | R² / RMSE | 0.998 / 0.037 CBI units (synthetic ground truth) |
| Live fuel moisture (PLSR, 5-fold CV) | R² / RMSE | 0.904 / 15.3% LFMC |
| MESMA char. (fire-fuel) fraction R² — EMIT (285 bands, 7.4 nm) | R² vs. native Tanager-1 | 0.991 |
| MESMA char. (fire-fuel) fraction R² — PRISMA (239 bands, 12 nm) | R² vs. native Tanager-1 | 0.957 |
| MESMA char. (fire-fuel) fraction R² — Sentinel-2 MSI (10 bands) | R² vs. native Tanager-1 | 0.361 |
Full derivations in notebooks/02-burn-severity.ipynb,
notebooks/03-fuel-moisture.ipynb, and
notebooks/05-sensor-comparison.ipynb.
See notebooks/05-sensor-comparison.ipynb for the full
quantified improvement ratios of Tanager's 426 bands vs. coarser multispectral/hyperspectral
sensors, and docs/technical-memo.md for the full write-up.
git clone https://github.com/gpriceless/tanager_fire.git
cd tanager_fire
pip install -e .Optional extras:
# Development tooling (pytest, ruff, mypy)
pip install -e ".[dev]"
# Jupyter notebook suite (jupyter, nbformat)
pip install -e ".[notebook]"
# Everything
pip install -e ".[dev,notebook]"Requires Python 3.10+ (CI runs on 3.12). MESMA spectral unmixing needs the optional
mesma extra: pip install -e ".[mesma]".
Tanager-1 scenes are accessed via Planet's public STAC catalog — no authentication required:
import tanager
scenes = tanager.list_fire_scenes() # browse the fire collection
tanager.download_scene(scenes[0], "data/raw/fire/")No scene data ships with the repository — data/raw/ is gitignored, so a fresh clone starts
empty. Download the LA wildfire scenes (pre-fire, immediate post-fire, and recovery timepoints)
into data/raw/fire/ using the snippet above; see
notebooks/01-data-discovery.ipynb for a full walkthrough
of STAC catalog traversal and scene selection.
import tanager
scenes = tanager.list_fire_scenes()
ds = tanager.load_ortho_scene("data/raw/fire/20250123_185507_64_4001_ortho_sr_hdf5.h5")
nbr = tanager.nbr(ds)
tanager.plot_map(nbr, product_name="nbr")This loads a post-fire ortho-rectified surface reflectance scene (downloaded via the Data
section above), computes the Normalized Burn Ratio, and renders a georeferenced map. See docs/api-reference.md
for the full public API, or the notebooks below for end-to-end workflows (severity mapping,
LFMC estimation, temporal trajectories, sensor comparison).
| Notebook | Description |
|---|---|
01-data-discovery.ipynb |
STAC catalog traversal and scene inventory — discovering and cataloging the LA wildfire time series |
02-burn-severity.ipynb |
MESMA spectral unmixing and CBI/BARC burn severity estimation, with internal-consistency validation against dNBR (framework supports USGS BARC ground truth when reference data is available) |
03-fuel-moisture.ipynb |
LFMC estimation via spectral water indices (SAI, continuum removal) and PLSR regression |
04-temporal-recovery.ipynb |
Multi-temporal vegetation recovery trajectories across 4 downloaded Tanager scenes forming 2 disjoint fire-complex pairs (Palisades and Hughes), Dec 2024 – Apr 2025 |
05-sensor-comparison.ipynb |
Tanager-1 vs EMIT / PRISMA / Sentinel-2 spectral degradation and information-loss analysis |
Notebooks ship with pre-computed outputs. To reproduce from scratch:
make install # pip install -e ".[dev,notebook]"
make notebooks # jupyter nbconvert --execute notebooks/*.ipynb
make figures # export publication figures to figures/Burn-severity output is validated against NASA JPL AVIRIS-3 L2A reflectance (ORNL DAAC, DOI 10.3334/ORNLDAAC/2357). The raw cubes are ~24 GB and are not stored in this repo. Fetch them with a free NASA Earthdata login:
scripts/download_aviris3.sh # reads data/raw/aviris3/aviris3_jan23_palisades_urls.txt; needs ~/.netrcSo the validation still reproduces without the full download, three derived artifacts are committed:
| Artifact | What it is |
|---|---|
outputs/aviris3_validation/tanager_palisades_fractions.nc |
Tanager MESMA char/ash fractions over Palisades (24 MB) |
outputs/aviris3_validation/cross_validation_results.json |
Per-granule cross-sensor accuracy metrics |
data/reference/dins/palisades_dins.geojson |
CAL FIRE DINS structure-damage reference (public) |
Full public API — function signatures, parameters, and usage examples for all modules
(config, catalog, io, spectral, masks, endmembers, unmixing, severity, lfmc,
validation, visualization) — is documented in docs/api-reference.md.
Built for the Planet Tanager Open Data Competition (deadline August 31, 2026), submitted under the Code & Scripts track.
If you use FireSpec in your work, please cite it (see CITATION.cff):
@software{price_firespec_2026,
author = {Price, Gabriel},
title = {{FireSpec}: Hyperspectral Wildfire Analysis for Planet Tanager-1 Imagery},
year = {2026},
url = {https://github.com/gpriceless/tanager_fire},
license = {MIT}
}Released under the MIT License.





