CHM-Meta v2: Canopy Height Model (DINOv3)

CHM-Meta v2 is a Dense Prediction Transformer (DPT) model for canopy height estimation from satellite imagery. It replaces v1's DINO ViT-H backbone with Meta's DINOv3 ViT-L/16 satellite backbone, packaged here with the same WEO-SAS model.py / predictor.py interface used by chm-meta (v1).

Base model: facebook/dinov3-vitl16-chmv2-dpt-head — licensed under the DINOv3 License.

Model Overview

  • Architecture: DINOv3 ViT-L/16 backbone + DPT head
  • Input: RGB satellite imagery (3 channels)
  • Output: Canopy height map (meters, 0–96 m range)
  • Variants: ViT-L/16 (single variant; v1's Baseline/Huge split does not apply here)

Usage

Installation

pip install -r requirements.txt

Loading and Inference

from huggingface_hub import snapshot_download
import sys

local_dir = snapshot_download("WEO-SAS/chm-meta-v2")
sys.path.insert(0, local_dir)
from model import Model

model = Model(local_dir=local_dir)

# Array inference: (3, H, W) float32 in [0, 1] → (H, W) metres
chm = model.predict(image)

# GeoTIFF pipeline
model.predict_tif("input.tif", "chm_output.tif")

Override any inference setting at load time:

model = Model(local_dir=local_dir, patch_size=448, stride=224)

Weights

Weights are included in this repository (model.safetensors), converted from Meta's original dinov3_vitl16_chmv2_dpt_head-3703d643.pth checkpoint.

Using from GCP Pipeline / Inference Container

The model can be loaded directly from Hugging Face in your inference container. Pass the repo ID as --model-artifact-uri:

--model-artifact-uri=WEO-SAS/chm-meta-v2
# or
--model-artifact-uri=hf://WEO-SAS/chm-meta-v2

The inference container (with huggingface_hub installed) will download the model and weights at runtime. No need to pre-upload weights to GCS.

Evaluation

Evaluation was run on the same 50-tile Nowa Nowa benchmark (Victoria, Australia) used for v1, using:

  • Satellite imagery: Google Satellite composites (2022–2024), 0.5 m/px, 4-band RGBA (RGB used), 1000×1000 px tiles
  • Reference CHM: Airborne LiDAR-derived canopy height model (2019–2020), 0.5 m/px, same spatial extent

Inference used a 384×384 sliding window (stride 192) over each 1000×1000 tile, with reflect-padding. Metrics were computed over all valid (non-nodata) pixels.

Results

Metric Value
RMSE 11.05 m
MAE 9.05 m
Bias −0.39 m
−0.40
Pearson r 0.173

Note on performance: Compared to v1 (bias −14.65 m), v2's near-zero bias (−0.39 m) shows the DINOv3 backbone corrects the systematic under-prediction seen in v1. R² remains negative, however — the same temporal mismatch (2019–2020 CHM vs. 2022–2024 imagery, including bushfire regrowth) and domain-shift factors noted for v1 still limit per-pixel agreement on this test set even though average error dropped substantially.

Evaluation Script

The evaluation script is included in this repository (evaluate.py) and can be run with uv:

uv run evaluate.py --n-tiles 50 --output eval_results.json

License

This model is derived from Meta's DINOv3 (facebook/dinov3-vitl16-chmv2-dpt-head) and is distributed under the DINOv3 License. See LICENSE.md in this repository for the full terms.

Downloads last month
57
Safetensors
Model size
0.3B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Evaluation results

  • RMSE (m) on WEO Google Satellite CHM Validation (50 tiles, 1M px each)
    self-reported
    11.054
  • MAE (m) on WEO Google Satellite CHM Validation (50 tiles, 1M px each)
    self-reported
    9.052
  • Bias (m) on WEO Google Satellite CHM Validation (50 tiles, 1M px each)
    self-reported
    -0.391
  • on WEO Google Satellite CHM Validation (50 tiles, 1M px each)
    self-reported
    -0.398
  • Pearson r on WEO Google Satellite CHM Validation (50 tiles, 1M px each)
    self-reported
    0.173