FTP-PRUE+ (EfficientNet-B7) β€” Fields of the Planet

3m PlanetScope field-boundary segmentation model from Fields of the Planet (FTP), a PlanetScope companion to Fields of the World v2 (FTW). Larger-backbone variant of the paper's headline model (ftp-b3).

U-Net decoder over an EfficientNet-B7 encoder, trained on paired early- and peak-season PlanetScope surface-reflectance imagery (8 input channels: 2 seasonal windows x 4 bands) to predict a 3-class field mask (background / field / boundary) at 3m ground sample distance.

  • Repo: taylor-geospatial/ftw-planet
  • Paper: Fields of the Planet: Field Boundary Mapping Beyond 10m
  • Architecture: smp.Unet(encoder_name="efficientnet-b7"), in_channels=8, classes=3
  • Training resolution: 512x512 crops, 3m/px
  • Loss: log-cosh Dice, class weights [0.05, 0.2, 0.75], ignore_index=3
  • Recipe: PRUE+ (geometry/noise augmentations, watershed post-processing, D4 TTA at eval)

Files

File Format Notes
config.json + model.safetensors segmentation_models_pytorch Hub format recommended for most users β€” safetensors (no pickle), self-describing architecture, needs only pip install segmentation-models-pytorch
ftp-b7.ckpt PyTorch Lightning checkpoint state_dict + hyper_parameters only β€” optimizer/scheduler state stripped
ftp-b7.onnx ONNX (opset 17) single-file, dynamic batch/H/W, needs onnxruntime (plain PyTorch cannot execute .onnx)
ftp-b7.pt2 torch.export ExportedProgram standalone, dynamic batch / static 512x512, loads with torch.export.load β€” no ftw_planet install needed

Usage

segmentation_models_pytorch (recommended)

import segmentation_models_pytorch as smp

model = smp.from_pretrained("taylor-geospatial/ftp-b7").eval()
logits = model(image)  # image: (B, 8, H, W) float32, 2 seasonal windows x 4 bands

Lightning checkpoint (raw smp.Unet)

The checkpoint's state_dict is just an smp.Unet under a model. prefix β€” unless you need the Lightning training wrapper, smp.from_pretrained above is simpler.

import torch
import segmentation_models_pytorch as smp

ckpt = torch.load("ftp-b7.ckpt", map_location="cpu")
hp = ckpt["hyper_parameters"]
model = smp.Unet(encoder_name=hp["backbone"], encoder_weights=None, in_channels=hp["in_channels"], classes=hp["num_classes"])
model.load_state_dict({k.removeprefix("model."): v for k, v in ckpt["state_dict"].items()})
model.eval()

logits = model(image)  # image: (B, 8, H, W) float, 2 seasonal windows x 4 bands

ONNX

import onnxruntime as ort

sess = ort.InferenceSession("ftp-b7.onnx", providers=["CPUExecutionProvider"])
logits = sess.run(None, {"image": image_np})[0]  # image_np: (B, 8, H, W) float32

torch.export (standalone, no ftw_planet needed)

import torch

exported = torch.export.load("ftp-b7.pt2")
model = exported.module()
logits = model(image)  # image: (B, 8, 512, 512) float32, any batch size

Output is 3-class logits (background / field / boundary); argmax + the repo's watershed post-processing (scripts/eval/postprocess_eval.py) recovers instance polygons.

Results

Macro-averaged over the 10 dense held-out FTW-v2 countries, true-polygon scoring at native 3m GSD (see paper Table 1): PQ 35.4, SQ 74.4, RQ 46.1, F1 27.0, matched-boundary error 7.4m (mean) / 22.8m (p95), pixel IoU 74.2, PQ by GT size β€” small 15.6 / medium 40.6 / large 50.9.

The B3 variant scores marginally higher PQ (35.5 vs 35.4) at ~5x fewer parameters; B7 trades that for better pixel IoU (74.2 vs 68.8) and medium-field PQ (40.6 vs 39.2).

Citation

@misc{ftw-planet,
  author = {Corley, Isaac and Robinson, Caleb and Marcus, Jennifer and Kerner, Hannah},
  title  = {Fields of the Planet: Field Boundary Mapping Beyond 10m},
  year   = {2026},
  url    = {https://github.com/taylor-geospatial/ftw-planet}
}

License

Weights: CC-BY-NC-4.0. Trained on PlanetScope imagery (c) Planet Labs PBC, exported under the NICFI / research program, and FTW v2 polygons (CC-BY-4.0). Refer to those source terms for any redistribution of the underlying data.

Downloads last month
14
Safetensors
Model size
67.4M params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support