Skip to content

Agribound v1.0.0: Corrected Inputs, Provenance and Explicit Defaults

agribound 1.0.0 is a major release. Most of it is not new functionality but correctness: an audit of 0.1.3 found defects that changed what the engines received and what the pipeline returned, and 1.0.0 fixes them. If you have results from agribound 0.1.x, please read the list of affected results before reusing them.

What was wrong in 0.1.x

A few examples from the CHANGELOG, each confirmed in the 0.1.3 code:

  • FTW's two season windows were the same image. The composite cache ignored the date window, so both FTW inputs were copies of the annual composite.
  • Landsat and HLS inputs were on the wrong scale for FTW and Prithvi, and the HLS SWIR bands of Sentinel-2-derived pixels were red-edge bands.
  • Delineate-Anything could silently switch implementation. Without the upstream repository in one of two hard-coded paths, non-Sentinel-2 runs used a simplified path that swapped red and blue and did not merge tile detections.
  • GeoAI without a checkpoint ran a building detector.
  • Caches and outputs were reused across settings. Intermediates were keyed by source (and sometimes year) only, and any existing output file was returned whatever the configuration.
  • The LULC filter could fail quietly, and polygons without land-cover data were dropped as non-crop.
  • Outputs held polygons below min_field_area_m2, because the area filter ran before smoothing and simplification shrank the outlines.
  • Evaluation matched one prediction to several reference fields, which can inflate precision and recall.

What 1.0.0 does instead

  • Explicit inputs. Sentinel-2, Landsat and HLS composites are surface reflectance × 10000 in the UTM zone of the study area; every source declares its value scale in agribound.registry; FTW gets real early- and late-season composites from its crop calendar.
  • No silent fallbacks. A configuration that cannot run raises an error that says what is missing. GeoAI and DINOv3 need a checkpoint (there are no published field weights for them); Delineate-Anything has explicit backends; the LULC filter raises on failure unless you ask it to warn.
  • Provenance. Every run writes <output>.provenance.json with the full configuration and its hash, package versions, device, step timings, peak memory, engine metadata (including weight revisions and SHA-256), counts after each stage and warnings. An output is reused only when the hash matches.
  • Seeds and cache keys. seed seeds Python, NumPy, torch and Lightning, and every intermediate is named by a key over the study area, year, window and settings.
  • Study-area selection. Composites cover the bounding box without masking; aoi_selection keeps the predictions inside an irregular study area.
  • Evaluation. One-to-one matching by default, area-weighted metrics, over- and under-segmentation, boundary distances and tolerance metrics, per-stratum and per-size-class results, and bootstrap intervals.
  • Delineate-Anything v2 is the default model, with pinned weights.
  • SAM refinement is a pipeline stage for every engine except the embedding engine, with SAM 2, SAM 2.1 and two SAM 3 backends (the SAM 3 backends are untested, and agribound logs a WARNING when one is loaded; see below and SAM 3 is untested), and a documented size gate (in a Kenya Sentinel-2 test, 631 of 634 fields were too small to be refined at 10 m). By default a refined mask may not take area from a neighbouring polygon (sam_overlaps="trim"; "keep" restores the 0.1.x behaviour; see the measured trade-off).
  • Large areas. agribound tiles cuts a region into tiles with halos and runs them as Slurm array jobs (stage on nodes with internet, compute on GPU nodes), with profiles for several NSF ACCESS systems.
  • An optional agent layer that plans one run from a natural-language request with read-only tools; a human approves the exact plan, at most one plan runs, and the session stops. There is no automatic re-tuning. The MCP server refuses its unauthenticated HTTP transport with execution enabled or on a non-loopback host unless you pass --allow-unauthenticated-http.

What the 1.0.0 examples show

Examples 02–11 and 13–21 were re-run with 1.0.0 at their defaults, with two exceptions. Example 13 was given example 20's Sentinel-2 output as input, because its default input, example 12's output, was not produced. Example 10's default input is a placeholder path, so it was given a Sentinel-2 composite from example 19. Examples 01 and 12 were not run end to end (see "What has not been verified" below). The gallery was rebuilt from these runs. Each map is drawn on a composite from the run, named under the map with the model and its version: usually the engine's input; for FTW, window A of its two season inputs (in the Andalusia ensemble, Delineate-Anything's input); for the embedding panels, the Sentinel-2 composite SAM 2 read. Every number below comes from the run logs and metrics files.

One model, four resolutions. Delineate Anything v2, used as released, on Landsat (30 m), Sentinel-2 (10 m), SPOT 6/7 (6 m) and NAIP (1 m) of 2018 in San Juan County, New Mexico, evaluated against the 944 NMOSE polygons, which were not used for training or fine-tuning in these runs: object F1 (IoU ≥ 0.5) is 0.15, 0.34, 0.33 and 0.43, and recall rises from 0.08 to 0.44.

Delineate-Anything v2 from 30 m to 1 m, San Juan County

The same pattern after fine-tuning, in-sample. DINOv3 fine-tuned on the NMOSE polygons of eastern Lea County for each source, then refined with SAM 2, reaches in-sample F1 0.09 on Landsat, 0.39 on Sentinel-2, 0.48 on SPOT and 0.60 on NAIP. At 30 m the study box also yields only 4 training chips, against 2,014 at 1 m, so the amount of training data changes with the pixel size. SAM 2 helps most at 6 m; at 1 m it raises the mean IoU of matched fields from 0.88 to 0.91, while in-sample F1 is 0.60 with and without it.

DINOv3 fine-tuned and SAM 2 from 30 m to 1 m, Lea County

Label-free pipelines, side by side. Near Pergamino (Argentina), Delineate Anything v2 outlines most centre pivots on Sentinel-2 and on SPOT. The TESSERA clusters already follow most pivots before SAM 2, while the Google Satellite Embedding clusters split several. SAM 2 was prompted for 442 of 2,372 Google and 511 of 1,923 TESSERA polygons (the rest were below its size rule); it returns one polygon per input polygon, so it does not join the pieces of the Google splits. There is no reference layer there, so this is a comparison of outlines, not of accuracy.

Embeddings with SAM 2 vs Delineate-Anything v2, Pampas

What the crop filter does. In the same county, on Sentinel-2 2019, with both engines used as released and the same NMOSE polygons (not used for training or fine-tuning in these runs) as reference, the Annual NLCD crop filter raises precision from 0.12 to 0.39 for FTW and from 0.40 to 0.58 for Delineate Anything v2, and lowers recall by less than 0.01: of the 963 polygons it removes from FTW's output, 913 overlap no reference field (162 of 182 for Delineate Anything v2).

FTW and Delineate-Anything v2 with and without the crop filter, San Juan County

Other entries show FTW with its two real season windows (Beauce, Kakamega), Delineate Anything v2 on SPOT-Pan against FTW on Sentinel-2 for smallholder fields in West Bengal, the Prithvi label-free modes next to Delineate Anything v2 on SPOT (Narrabri), and the HPC tiling workflow. The 0.1.x screenshots are archived.

Upgrading

  • Python >= 3.12.
  • Two environments: environment.yml (agribound[all], with FTW) and environment-gfm.yml (agribound[all-gfm], with Prithvi), because ftw-tools and terratorch need incompatible lightning versions.
  • Delineate-Anything's confidence parameter is conf_threshold.
  • Old caches are not read; outputs without a provenance record need overwrite=True.

The migration guide lists every breaking change.

What has not been verified

Some paths were exercised only with stubs or not at all before the release: the Meta SAM 3 and transformers SAM 3 backends end to end (gated weights), real Slurm submissions, the agent against the live Claude API, and Anthropic-compatible local model servers. Delineate-Anything fine-tuning with real Ultralytics training has been run once, on NAIP 2022 over eastern Lea County (10 epochs; mask mAP50 0.69 on 135 validation chips held out by a 5 km block split of the same NMOSE polygons in the same box). The same chips also selected the checkpoint, so this is not an independent accuracy estimate, and it is a single check, not a validation across areas. Examples 01 (New Mexico Landsat time series) and 12 (Lea County multi-engine ensemble) were not run end to end for 1.0.0; only its NAIP runs were: Delineate-Anything v2, GeoAI and DINOv3 fine-tuned on the NMOSE polygons (in-sample scores), plus the released Delineate-Anything v2 weights with example 12's settings (a run the example itself does not include). Its Delineate-Anything small run on NAIP and its NAIP ensemble were not run. The GeoAI NAIP run showed two engine problems, fixed in 1.0.0: a fixed 256 px chip cannot hold a field larger than 256 m at 1 m, and fields crossing inference-window edges came out cut (in-sample F1 0.01, then 0.25 with 1,024 px chips, 0.48 after joining the pieces). GeoAI fine-tuning now sizes its chips from the reference fields (1.25 × the 90th-percentile field bounding-box side, 256–1024 px; engine_params["chip_size"] overrides), and the engine joins instances split at the window edges (engine_params["merge_window_seams"], on by default).

Citation

The accompanying manuscript is now titled Measuring what geospatial AI delivers for policy-grade agricultural field boundaries (in preparation for Remote Sensing of Environment). Please cite the software through its Zenodo DOI, 10.5281/zenodo.19229665, and the models and datasets you use; see Citation & References.