Land-cover model (OpenEarthMap classes, SatlasPretrain Swin-B)
A semantic-segmentation model that labels every pixel of an RGB image as one of the 8
OpenEarthMap classes. It was trained on real high-resolution
aerial and satellite images. In the ADB super-resolution project we use it to test whether
super-resolved Sentinel-2 images (2.5 m) can stand in for real high-resolution images. It is
used in the SSTA workshop notebook
demo2_use_cases.ipynb.
Model
| Architecture | satlaspretrain_models Model(num_channels=3, backbone=Backbone.SWINB, fpn=True, head=Head.SEGMENT, num_categories=8) |
| Initialisation | SatlasPretrain Aerial_SwinB_SI backbone and FPN (Allen Institute for AI) |
| Training | synthetic images (SyntheWorld), then fine-tuned on OpenEarthMap; the encoder was not frozen |
| Input | red, green, blue surface reflectance (0β1), not rescaled or normalised; height and width multiples of 32 |
| Output | model(x)[0]: logits (B, 8, H, W); take the argmax |
| File | landcover_oem_satlas_swinb_fp16.pth: {"model_state_dict": ...} with fp16 weights (cast to float32 before loading); 180 MB |
| sha256 | d2d7b11f5d0ec892a9305b60f793ebe9362d72875bc6721de4b4472ef5ef0528 |
The fp16 file is the original fp32 checkpoint with the optimiser state removed and the weights stored in half precision. On a 2.5 m test image, 99.94 % of the pixels get the same class as with the original.
Classes (output index β class): 0 bare land, 1 rangeland, 2 developed space, 3 road, 4 tree, 5 water, 6 agriculture, 7 building.
Usage
import torch
from satlaspretrain_models.model import Model
from satlaspretrain_models.utils import Backbone, Head
state = torch.load("landcover_oem_satlas_swinb_fp16.pth", map_location="cpu")["model_state_dict"]
model = Model(num_channels=3, multi_image=False, backbone=Backbone.SWINB, fpn=True,
head=Head.SEGMENT, num_categories=8, weights=None)
model.load_state_dict({k: v.float() for k, v in state.items()})
model.eval()
x = torch.rand(1, 3, 384, 384) * 0.3 # RGB reflectance, 0-1
classes = model(x)[0].argmax(1) # (1, 384, 384)
How well it works on super-resolved Sentinel-2
These are measured on two 2 km areas in the Philippines: Cebu City (images around 20 March 2026) and Nueva Ecija (around 15 March 2026). The scores are pixel F1 against public maps: Open Buildings footprints and OpenStreetMap roads, widened to typical road widths. They are lower than scores against expert labels would be.
| F1 | Sentinel-2 enlarged to 2.5 m | Stage 1 | Stage 2 (full model) |
|---|---|---|---|
| building, Cebu City | 0.21 | 0.42 | 0.53 |
| building, Nueva Ecija | 0.15 | 0.36 | 0.55 |
| road, Cebu City | 0.01 | 0.14 | 0.20 |
| road, Nueva Ecija | 0.01 | 0.23 | 0.40 |
Limitations
- It was trained on real high-resolution images, not on Sentinel-2. On plain 10 m Sentinel-2 it finds few buildings and roads, and it often labels flooded rice fields as water.
- Results depend on the region. OpenEarthMap covers 97 regions in 44 countries.
- Single buildings are not resolved at 2.5 m. Use the maps for questions about areas, such as screening or building density, and check them before acting on them.
Licence
OpenEarthMap labels carry the licence of their source images. Where the source is public domain or its licence is not stated, the labels are under CC BY-NC-SA 4.0 (see the dataset record). Because the model is derived from these labels, the weights are released under CC BY-NC-SA 4.0, for non-commercial use only. Please cite OpenEarthMap (Xia et al., WACV 2023) and SatlasPretrain (Bastani et al., ICCV 2023).