Skip to main content

olmoearth_inferenceX measures differences between Earth-observation inferences without labels, and shows on expert-labelled testbeds which of those differences predict error. It was built around OlmoEarth and has since been run on a served global product no one here had a hand in training.

One scene through the audit: Sentinel-2 bands, the frozen OlmoEarth encoder and the task head, the prediction, confidence and boundary layers, the review set at a 5% budget drawn on the scene, and the reasons per flagged window

Try it in two minutes

pip install olmoearth-inferencex
oe-inferencex demo

No data to find, no labels, nothing but numpy. The command audits a real map: one tile of Dynamic World, a global 10 m land-cover product this project had no hand in, with the probabilities it publishes about itself and an expert's annotation of the same ground to grade the result. The tile was chosen by a rule fixed in advance, the median tile by error capture among the 18 fully annotated ones of its 409 public test tiles, so it is a typical tile and not the best one.

Three panels of a real land-cover map in southern Peru. Left: the map with the 5% of windows to check first outlined in black, along the boundaries between classes. Middle: the same windows over the map's real errors in red; 67% of the flagged windows are wrong. Right: a random 5% of windows over the same errors; about 19% of them are wrong

Left: what an audit gives, the map with the 5% of windows to check first outlined in black; no labels were used. Middle: the same windows over the places where the map is really wrong according to the expert, in red. Right: a random 5% over the same errors. The map is wrong on 19% of its windows; of the windows the tool flags, 67% are wrong, so a reviewer who goes where it points finds an error more than three times as often as one who picks at random, and those 5% hold 17% of all the map's errors. The run also says what the tool does not do: errors the model is sure about stay hidden, and it never says how wrong a map is. oe-inferencex demo --made-up does the same on a small synthetic water map.

Then your own map, a GeoTIFF (with pip install "olmoearth-inferencex[geo]") or a .npy array of probabilities or logits:

oe-inferencex assess your_map.tif --out audit

What the project found, in six plain sentences: Findings, in short.

The strongest evidence

On tasks this project did not choose, the model's own margin ranks its errors better than any control that sees no model — on 24 of 24.

The tasks are the 25 of the OlmoEarth paper embedding suite by Ai2, with the splits fixed in the files. On all 24 that a top-1 minus top-2 margin is defined for, and on all 14 distinct sources behind them, the margin beats the best no-model control: 6,435,473 graded units, an accuracy range from 0.333 to 0.979, 17 of 17 classification tasks and 7 of 7 segmentation tasks, sign test p = 6e-08. Six of the tasks come from GEO-Bench 1, a third-party benchmark, and the margin wins on all six. On the same tasks it also beats the competitors the literature proposes: a five-seed ensemble on 22 of 24, nearest-neighbour typicality on 24 of 24 and a Mahalanobis distance on 24 of 24 (exp73). Nor is it a property of OlmoEarth: under the fifteen other encoders the suite is published for, eight families outside OlmoEarth (AnySat, Clay, Panopticon, Galileo, CROMA, TerraMind, Satlas, Copernicus-FM) and the OlmoEarth size series, the margin beats the control on 322 of 332 scored tasks, every encoder at 90% or better (exp74). Within the model's own confidence family the forms are close; on multi-class tasks one minus the top probability is marginally better than top-1 minus top-2 (exp76).

This is the answer to the obvious objection — that a result like this rests on testbeds the author picked. It does not. Tasks we did not choose (exp70).

What this is not: a leaderboard result. That suite measures accuracy, and no public benchmark measures label-free error ranking.

What it does

On these testbeds the model's own logit margin is the difference that predicts error; disagreement across crops, backbones or encoders does not rank errors; the sensor difference says where shared errors come from; the frozen-versus-fine-tuned difference measures how much training moved the model. Given a prediction map:

  1. Which windows to review first — review sets at a chosen budget, in confidence order or boundary first.
  2. Why each flagged window is suspect — label-free cues carrying measured evidence from expert-labelled testbeds.
  3. Score any candidate audit rule the same way, against the model's own confidence and a no-model control, on two references at once.
  4. Audit a deployed product, whoever trained it — including a served global land-cover product audited from nothing but the probabilities it publishes about itself.
  5. Measure the difference between two inferences of one scene: across crops, backbones, sensors, encoders, fine-tuning, and acquisition dates — how much they disagree, what the disagreeing windows share, and with labels, which side is right.
  6. Fuse label-free readings with labels where they exist, reported held-out and bound to the model family it was fitted on, because such rules do not transfer across families.
  7. Grade against a reference that is a sample, not a map — design-weighted estimators report the population quantity. Ignoring the design overstated one lead by a quarter of its size.

Both halves run from the command line without writing Python: oe-inferencex assess and oe-inferencex compare (Usage).

The two-period, two-sensor square on one GEOID-Flood chip: four dated inputs, four inferences on identical windows, the same-date and same-sensor differences on the scene, and the label bridge boxed apart

Four dated inputs of one GEOID-Flood chip (Lake Shkodër at Gruemirë, Albania), each read on identical windows. Same-period pairs differ on 22 windows before the event and 44 after; same-sensor pairs on 97 (optical) and 67 (radar). What a difference is needs labels, so that panel is boxed apart. Full numbers in Comparisons.

What the evidence spans

The ranking result rests on five kinds of reference whose errors fail in different ways, which is the part of this work hardest to argue with:

The answer key came from Testbeds
people reading the same imagery Sen1Floods11 hand labels, Copernicus EMS through GEOID-Flood, WorldFloods v2
another model's output DFC2020, whose test labels are an iterated random forest, not hand-drawn
experts annotating a served product Dynamic World's 409 expert tiles, audited from its own published probabilities
surveyors standing in the field LUCAS Copernicus 2022, the only reference here that never saw a pixel
farmers' own declarations EuroCrops, which also labels both sides of a two-date comparison

Two warnings for practitioners

Report your readout's generalisation gap beside any ranking comparison. A small readout that has memorised its practice data reverses which confidence signal ranks best. On LUCAS the margin went from last of four model signals to the front, on the same data, purely from choosing the probe's regularisation on held-out ground.

A two-date difference needs the right floor. How often the map moves where the ground did not is 6% to 37% on crops — one to two orders of magnitude above the rate at which merely reseeding the readout moves it. Comparing a date difference against the reseed rate flatters it.

Quickstart

  1. Findings — what holds, the numbers, how a claim gets in, and the limits.
  2. Usage — assess a prediction, explain its review set, the production case, how to score a new rule.
  3. Recipe — what to do and not do when auditing a map.
  4. Technical report: the whole record in ten pages, what was done, what held, and what did not.

Also: TECHNIQUES (everything tried, one line each, with the verdict) · Protocol (how results are scored) · Explanation, Signals, Comparisons (per-cue, per-signal, per-experiment evidence) · Agent integration · Related work (where each idea comes from) · Roadmap.

Full documentation: https://olmoearth-inferencex.readthedocs.io/

Setup

Python 3.11+ and numpy; nothing else for the package. To use it:

pip install olmoearth-inferencex            # add [geo] to read and write GeoTIFFs
oe-inferencex demo                          # a first run on a made-up map
oe-inferencex assess --help

The development version installs from the repository: pip install "olmoearth-inferencex @ git+https://github.com/2imi9/olmoearth_inferenceX".

examples/quickstart.py runs the whole surface on a synthetic map with no data to download; the public API is what oe_inferencex.__all__ exports, and CHANGELOG.md says what a release contains. Rasters need the geo extra (rasterio); .npy input does not.

To work on the repository, with the tests against the recorded numbers:

git clone https://github.com/2imi9/olmoearth_inferenceX.git
cd olmoearth_inferenceX
uv sync
uv run pytest

For the full experiment environment:

uv sync --extra encoder --extra geo
uv run python scripts/audit_one_scene.py   # one scene end to end

Licence

Apache License 2.0; see LICENSE. To cite the software or its recorded results, see CITATION.cff.

Contact

For questions and suggestions, please open an issue on GitHub.

Release files for olmoearth-inferencex 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for olmoearth-inferencex 1.1.1
File Size Uploaded
olmoearth_inferencex-1.1.1.tar.gz 321.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for olmoearth-inferencex 1.1.1
File Interpreter ABI Platform
olmoearth_inferencex-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 644.3 kB

Release files / olmoearth_inferencex-1.1.1.tar.gz

Download URL olmoearth_inferencex-1.1.1.tar.gz
Size 321.5 kB
Tags Source
SHA-256 checksum
How to use checksums
8810782cba49d348e88de30890c76310ca307dc5db1207c48e648c6f7b15d35d
BLAKE2b-256 checksum
How to use checksums
0ba4c276d5feb71b3f10514817dc08e309f00bea0363fc81bf1fcf0e2e32f3bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / olmoearth_inferencex-1.1.1-py3-none-any.whl

Download URL olmoearth_inferencex-1.1.1-py3-none-any.whl
Size 322.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
60f7f9cad6cc16efbfcabd325aaf65db5085a600c6cc4d6add18944d63e2c873
BLAKE2b-256 checksum
How to use checksums
f00244a69a90d2f0a8a63f30eefc827bfc36da12f9238bba5dd52758a715aafc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

This release

1.1.1 This release

2 release files

1.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page