Field work · ArborMeta · 2026

Canopy cover from orbit

LiDAR measures structure honestly, but only over flightlines. Satellites cover whole stations but cannot see in 3D. This learns the mapping: canopy-cover labels from LiDAR, self-calibrated per station, then run across the property from satellite alone. Identifiers stripped; numbers from a real production run.

Ground resolution
0.5 m
Cover layers predicted
11 · 1.0–2.0 m
Self-calibration val loss
0.0133 → 0.0096
One station, predicted
975 tiles · 7 m 24 s

The pipeline

Two instruments, one model. Labels from LiDAR; imagery from satellite; they meet in a wavelength-conditioned encoder.

ALS point cloudsairborne LiDARCHM, smoothedcanopy height model11 cover rastersfraction > 1.0…2.0 mJilin-1 PAN+MSS5 bands · 0.5 mDN → radianceλ, bandwidth, angles768 px HDF5 chipsint16 + metadataDOFA Swin-UNetwavelength-conditionedfine-tuneper stationpredict + mosaicGDAL · ZSTD

The two instruments

Labels: airborne LiDAR → smoothed canopy-height model → eleven cover-fraction rasters (vegetation taller than 1.0–2.0 m). Imagery: Jilin-1 PAN + four multispectral bands at 0.5 m. Nothing enters as raw pixels — per-band gain and bias from scene metadata, each band with wavelength, bandwidth, sun and satellite geometry.

A wavelength-aware model

Swin-UNet with DOFA-style dynamic patch embedding: a hypernetwork generates input-layer weights from band wavelengths, so the network is conditioned on what its channels physically are. Angles, location, and capture-to-prediction date delta enter as learned embeddings. Same weights, different constellations, different band counts.

Self-calibration, per station

Before predicting a station, the base model fine-tunes on that station's own LiDAR chips. Every dot is a saved checkpoint from one production run. Hover for the numbers.

0.0090.0100.0110.0120.0130.0142875292529753025epoch →0.013340.00955 · best

The last mile

768-pixel tiles, 128 px overlap, mixed precision, georeferenced outputs. Thousands of tiles merge through GDAL VRT into one ZSTD-compressed station raster. One delivery: 18 rasters, 119.6 GB.

One run, end to end

The production log, trimmed to its skeleton.

The platform around it

The pipeline feeds a geospatial platform: single-handed build used by the team, government stakeholders and visiting researchers. FastAPI + PostGIS (~35 route modules, ~40 tables) under React 18 + TypeScript (14 pages), serving vector tiles and cloud-optimised point clouds and rasters from terabyte-scale archives.

The map
MapLibre workspace over every domain (ALS, TLS, satellite, carbon-project boundaries) as filterable vector-tile layers with AOI drawing, zonal statistics and QGIS export.
The 3D globe
A token-free Three.js globe that streams terrestrial-LiDAR point clouds of individual trees in one WebGL context: eye-dome lighting, classification filters, rescan-vs-parent growth comparison.
Per-tree science
DBH, height, volume, biomass and QSM model uncertainty for every reconstructed stem; colour any plot by any metric.
Pipeline operations
Ingestion timeline, processing queue, throughput and backlog, storage health, data-quality checks, and an admin audit log.
Collaboration
Typed, shareable workspaces, threaded comments, snapshot messaging, and real-time notifications over Postgres LISTEN/NOTIFY → Server-Sent Events.
FieldLink
An air-gap-friendly delivery channel for field crews: X25519 + Ed25519, sign-then-encrypt, replay protection, per-device sealed packages. The transport only ever sees ciphertext.

Why it matters

These rasters sit under Australian carbon-credit policy advice: canopy growth measured between repeat LiDAR captures, extended across whole stations by satellite. Same discipline as the demos here, pointed at country.

The ArborMeta case study →The pretraining report →Harvey Houlahan · ArborMeta · 2026