Agricultural field boundary delineation from satellite imagery
Agribound runs published field-boundary models, geospatial foundation models and embedding-based methods on satellite and aerial imagery through one configuration and one pipeline: composite → optional fine-tuning → delineation → optional SAM refinement → study-area selection → post-processing → LULC crop filter → export. It supports ten sources (Landsat, Sentinel-2, HLS, NAIP and SPOT 6/7 composites built on Google Earth Engine; USGS NAIP Plus without Earth Engine; local GeoTIFFs; Google Satellite Embedding and TESSERA embeddings) and seven engines (Delineate-Anything, Fields of The World, GeoAI Mask R-CNN, DINOv3, Prithvi-EO-2.0, embedding clustering and ensembles).
Every run is seeded, caches its intermediates under content-addressed names, and writes a provenance record (configuration and hash, package versions, device, step timings, model weights, counts, warnings) next to its output. The package also provides object-level evaluation against reference boundaries, tiling of large regions for HPC clusters, a query helper for the published Fields of The World polygons, and an optional agent layer that proposes one run for a human to approve.
Upgrading from 0.1.x? Version 1.0.0 fixes defects that affected results produced with agribound 0.1.x, among them FTW season windows that were copies of the annual composite, Landsat/HLS inputs on the wrong radiometric scale, a silent Delineate-Anything fallback with swapped red/blue channels, and caches that ignored the study area and year. See the affected results and the migration guide.
The agribound 1.0 workflow (select the image for full resolution): a six-stage pipeline from ten imagery and embedding sources (0.3–30 m, 1984–present) to field boundaries, with a deterministic entry point and an optional, human-confirmed agent layer above it.
- Composite. Earth Engine builds a median or greenest-pixel (max-NDVI) composite for a year or a date window and exports it on a UTM grid. NAIP is mosaicked, and only Landsat, Sentinel-2 and HLS are cloud-masked and scaled to reflectance ×10 000. USGS NAIP Plus, TESSERA and local GeoTIFF inputs are read without Earth Engine.
- Fine-tuning (optional). Full (Delineate-Anything, GeoAI, DINOv3, Prithvi) or LoRA (DINOv3, Prithvi) fine-tuning on reference boundaries, validated by default on a spatially blocked split (5 km blocks). GeoAI, DINOv3 and Prithvi's UPerNet mode need a checkpoint, from fine-tuning or supplied by the user.
- Delineation. One of seven engines, coloured by family: task-specific segmentation, geospatial foundation model, label-free embedding clustering and multi-engine ensemble.
- Refine and post-process. Optional SAM refinement (SAM 2, 2.1 or 3; the SAM 3 backends are untested), then study-area selection, merging, minimum-area filtering, smoothing and simplification.
- LULC crop filter. Removes polygons whose crop fraction is below 0.3, computed on Earth Engine or locally on a downloaded crop raster. Annual NLCD, Dynamic World or C3S Land Cover is selected by coverage and year; CDL (CONUS only) is used on request.
- Export. GeoParquet (fiboa-style columns), GeoPackage or GeoJSON, with per-field area, perimeter, compactness and crop fraction, plus a
provenance.jsonrecord.
Around the pipeline:
- Entry point.
delineate()andagribound delineate --configrun the six stages directly. Every run is seeded and uses a content-addressed cache, andprovenance.jsonis written by default. - Agent layer (optional). A language model, reached through the Claude API or an MCP host (or a local Anthropic-compatible server via
base_url), investigates with typed read-only tools and proposes one configuration. It runs only after you confirm that exact plan at the human gate, with an approval bound to the plan's hash and used once. At most one plan runs per session, and the session then stops (see Agent layer). - Scale out and evaluate.
agribound tiles make,runandmergesplit a large study area into tiles that run as Slurm array jobs (see HPC and large areas).evaluate()scores results against reference boundaries with object-level and area-weighted metrics (see Evaluation).
From the agribound 1.0.1 example runs (the San Juan County map shows 1.0.0 outputs, which 1.0.1 reuses unchanged). 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, its window A; for the SAM-refined embedding panels (Pampas, top), the Sentinel-2 composite SAM 2 read. Select an image for the full-resolution file. See the gallery for more regions and engines.
From 30 m to 1 m: Delineate-Anything v2 against a reference registry (San Juan County, New Mexico, USA)
Example 20: Delineate Anything v2, used as released, on Landsat, Sentinel-2, SPOT 6/7 and NAIP of 2018, each evaluated against the 944 NMOSE WUCB polygons (cyan; not used for training or fine-tuning in these runs). Object F1 (IoU ≥ 0.5) is 0.15 at 30 m, 0.34 at 10 m, 0.33 at 6 m and 0.43 at 1 m; recall rises from 0.08 to 0.44.
Example 14: DINOv3 (SAT-493M weights) fine-tuned on the NMOSE polygons for each source and refined with SAM 2. In-sample F1 (the polygons are also the training labels): 0.06 on Landsat, 0.38 on Sentinel-2, 0.45 on SPOT and 0.59 on NAIP; at 30 m the box also holds only 4 training chips, against 2,014 at 1 m.
Example 15, no reference data or training: Google Satellite Embedding and TESSERA v1 clusters of 2024, crop-filtered and refined with SAM 2 on Sentinel-2 (top; parts over 50 ha kept unrefined), against Delineate Anything v2 on the same Sentinel-2 composite and on SPOT 6/7 2023 (bottom); centre pivots near Pergamino. Orange = refined by SAM 2. The embedding panels come from the agribound 1.0.1 run of 2026-09-29; the Delineate-Anything panels are the 1.0.0 outputs, which that run reused. The gallery adds the whole study area and three zoomed windows.
From agribound.registry (agribound list-sources); facts checked against the
Earth Engine catalogue and the providers on 2026-09-26 to 2026-09-28.
| Source | Key | Export resolution | Years | Coverage | Value scale | Earth Engine |
|---|---|---|---|---|---|---|
| Sentinel-2 L2A (harmonized) | sentinel2 |
10 m | 2017-present | global (2017-2018 L2A not global) | reflectance × 10000 | yes |
| Landsat 5/7/8/9 C2 L2 | landsat |
30 m | 1984-present | global | reflectance × 10000 | yes |
| HLS v2.0 (L30 + S30) | hls |
30 m | 2013-present (S30 2015-) | global land | reflectance × 10000 | yes |
| NAIP | naip |
1 m (naip_resolution_m; native 0.6 m in most states since 2018) |
2002-2023 | conterminous US | uint8 | yes |
| USGS NAIP Plus ImageServer | usgs-naip-plus |
0.3-0.6 m (finest selected footprint) | 2012-2023, latest vintage per state only | US states and territories | uint8 | no |
| SPOT 6/7 multispectral | spot |
6 m | 2012-2023 | global, restricted | uncalibrated DN | yes |
| SPOT 6/7 panchromatic | spot-pan |
1.5 m | 2012-2023 | global, restricted | uncalibrated DN | yes |
| Local GeoTIFF | local |
the file's | any | user-provided | unknown | no |
| Google Satellite Embedding (AlphaEarth) | google-embedding |
10 m, 64-D | 2017-2025 | global land | embedding | default backend; source_coop backend needs none |
| TESSERA | tessera-embedding |
10 m, 128-D | v1 2017-2025 (near-global 2024), v1.1 2015-2025, v2 beta | depends on version | embedding | no |
Composites cover the study area's bounding box in the UTM zone of its centroid
(export_crs) without polygon masking. The LULC crop filter reads Earth Engine
for every source. Details: Satellite sources.
| Engine | Key | Approach | Label-free | Fine-tunable | Default weights / model | GPU |
|---|---|---|---|---|---|---|
| Delineate-Anything | delineate-anything |
YOLO11-seg instance segmentation | yes | yes | large_v2 (Delineate Anything v2) from MykolaL/DelineateAnything, pinned revision, SHA-256 checked |
recommended |
| Fields of The World | ftw |
semantic segmentation with ftw-tools checkpoints, polygonised | yes | no | the ftw-tools registry default, FTW_PRUE_EFNET_B5 in ftw-tools 2.0.0b5 (two crop-calendar season windows) |
recommended |
| GeoAI | geoai |
Mask R-CNN instance segmentation (geoai-py) | no: no published field weights; needs fine-tuning or checkpoint_path |
yes | COCO Mask R-CNN as the fine-tuning start | recommended (CPU on Apple MPS) |
| DINOv3 | dinov3 |
DINOv3 ViT + DPT head (geoai-py) | no: needs fine-tuning or checkpoint_path |
yes (full by default, LoRA optional) | SAT-493M ViT-L/16 backbone | recommended |
| Prithvi-EO-2.0 | prithvi |
Prithvi-EO-2.0 ViT (terratorch): embed clustering, pca baseline, or fine-tuned segment |
only embed/pca |
yes | Prithvi-EO-2.0-300M-TL |
recommended |
| Embedding | embedding |
K-means clustering of pre-computed embeddings | yes | no | - | no (CPU) |
| Ensemble | ensemble |
intersection, union or pixel vote of several engines/models | depends on members | no | members delineate-anything + ftw |
depends |
Engine/source support is checked when the configuration is created; there are
no silent fallbacks to another model, band set or engine. GeoAI fine-tuning
sizes its chips from the reference fields by default, and GeoAI joins the
instances that a field was split into at the edges of its inference windows
(see Fine-tuning).
Optional SAM refinement (sam_refine=True) runs after any engine except
embedding (which refines its own polygons, given
engine_params["sam_rgb_bands"]), with backends sam2 (default), sam2.1,
sam3 (Meta; CUDA + triton, Linux) and sam3-hf (transformers); both SAM 3
backends are currently untested (they have not been run end to end, because
the facebook/sam3 weights are gated; agribound logs a WARNING when one is
loaded). Fields whose padded bounding box is under
sam_min_crop_px (64 px) are not refined. Details:
Engines,
SAM refinement.
Python >= 3.12. terratorch (Prithvi) requires lightning>=2.6 and
ftw-tools 2.0.0b5 (FTW) requires lightning<2.6, so the full stack needs two
environments:
| Environment | File | Extra | Includes | Excludes |
|---|---|---|---|---|
| core | environment.yml |
agribound[all] |
GEE, Delineate-Anything, FTW, GeoAI, DINOv3, SAM 2, TESSERA, agent | Prithvi, SAM 3 |
| GFM | environment-gfm.yml |
agribound[all-gfm] |
GEE, Delineate-Anything, GeoAI, DINOv3, Prithvi, SAM 2, TESSERA, agent | FTW, SAM 3 |
git clone https://github.com/montimaj/agribound.git && cd agribound
conda env create -f environment.yml # or environment-gfm.yml; both install -e .
conda activate agribound # (agribound-gfm)or with pip, in a fresh Python 3.12 environment:
pip install "agribound[all]" # core
pip install "agribound[all-gfm]" # separate environment, for Prithvi
pip install "agribound[gee,delineate-anything]" # or only what you need| Extra | For |
|---|---|
gee |
Earth Engine sources, the default Google-embedding backend, the LULC filter |
delineate-anything |
Delineate-Anything (numba is used only by its reference backend) |
ftw |
FTW (ftw-tools>=2.0.0b5,<3, a pre-release on PyPI) |
geoai, dinov3 |
GeoAI, DINOv3 (geoai-py>=0.43.1) |
prithvi |
Prithvi (terratorch[peft]; conflicts with ftw) |
samgeo |
SAM 2 / 2.1 refinement |
sam3 |
SAM 3 Meta backend (CUDA; triton-windows on Windows); untested (see SAM refinement) |
tessera, embedding |
TESSERA (geotessera>=0.10.2,<0.11); both embedding sources |
agent |
the agent layer and MCP server (anthropic, mcp) |
docs, dev |
documentation; tests and linting |
The GDAL Python bindings (osgeo, conda-forge gdal) are needed only by the
Delineate-Anything reference backend. See
Installation.
import agribound
gdf = agribound.delineate(
study_area="my_region.geojson", # or "bbox:minx,miny,maxx,maxy", WKT, GEE asset
source="sentinel2",
year=2024,
engine="delineate-anything",
gee_project="my-gee-project",
output_path="fields.gpkg",
)
print(len(gdf), gdf.attrs["run_id"]) # fields.gpkg + fields.gpkg.provenance.jsonagribound delineate \
--study-area my_region.geojson \
--source sentinel2 \
--year 2024 \
--engine delineate-anything \
--gee-project my-gee-project \
--output fields.gpkgEvery option is a field of AgriboundConfig; YAML files use the same names,
and unknown keys are rejected.
# config.yml
study_area: my_region.geojson
source: sentinel2
year: 2024
engine: delineate-anything
gee_project: my-gee-project
composite_method: median # median | greenest (max_ndvi is an alias)
cloud_cover_max: 20
export_crs: utm # UTM zone of the study-area centroid
aoi_selection: representative_point
min_field_area_m2: 2500 # m²
simplify_tolerance: 2.0 # metres
lulc_filter: true
lulc_crop_threshold: 0.3
lulc_on_error: raise # raise | warn
engine_params:
da_model: large_v2
conf_threshold: 0.15 # the old name 'confidence' now raises
output_path: fields.gpkg
seed: 42agribound delineate --config config.yml # YAML supplies every value
agribound delineate --config config.yml --year 2023 -o fields_2023.gpkg # explicit flags override it
agribound delineate --config config.yml --dry-run # print the resolved YAMLReference: Configuration, CLI.
- Seed:
seed(default 42) seeds Python, NumPy, torch and Lightning; the fine-tuning split and every sample are derived from it. - Cache keys: intermediates are named by a key over the study-area
geometry, source, year, date range and compositing settings, so runs with
different settings never reuse each other's files, even in one
cache_dir. - Provenance:
<output>.provenance.jsonholds the configuration and its hash, versions, platform, device, step timings, peak memory, engine metadata (for example weight revisions and SHA-256), stage counts and warnings. - Output reuse: an existing output is returned only if its provenance
record reports success with the same configuration hash, study-area
fingerprint and results versions; otherwise
delineate()raisesFileExistsError(overwrite=Truere-runs). A record of agribound 1.0.0 or earlier has no study-area fingerprint; when nothing else differs, its output is still reused.
See Reproducibility.
from agribound.evaluate import evaluate
metrics = evaluate(
pred_gdf,
ref_gdf,
iou_threshold=0.5,
boundary_tolerance_m=10,
strata="county",
size_bins="auto",
bootstrap=1000,
)One-to-one IoU matching (default; matching="many_to_one" uses the 0.1.x
matching rule, although geometry repair and other 1.0.0 changes can still
change the numbers slightly) gives precision, recall and F1; also mean IoU, area-weighted precision/recall,
over- and under-segmentation (Persello & Bruzzone, 2010), Hausdorff and mean
boundary distances, boundary precision/recall/F1 and coverage within a
tolerance, per-stratum and per-size-class metrics, and percentile bootstrap
intervals. agribound evaluate -p pred.gpkg -r ref.gpkg does the same from
the command line. Definitions:
Evaluation.
agribound tiles cuts a region into tiles with halos and runs each tile as an
independent, idempotent job; the composite stage can run on nodes with
internet access and the delineation stage on offline GPU nodes; tiles merge
keeps each polygon in the tile that owns its representative point.
examples/hpc/ has Slurm scripts, profiles for NSF
ACCESS systems and Earth Engine throttling rules;
examples/regions/ defines 16 regions. The region
files name no Earth Engine project: pass your own with --gee-project (or
GEE_PROJECT, gcloud, or a service-account key); the scripts check it with
agribound tiles gee-project before they run or submit anything. See
HPC.
pip install "agribound[agent]" adds a planning assistant with a deliberately
low level of autonomy: a language model investigates with read-only tools
and proposes one configuration; a human confirms the exact plan (typed
yes, bound to the plan's SHA-256 hash, single use); at most one approved
plan runs; and the session stops after the run or a denial. There is no
automatic re-run or re-tuning. Every turn and tool call is written to a JSON
transcript.
import agribound
result = agribound.agent(
"Delineate fields in this AOI for 2024 with a label-free approach",
study_area="fields.geojson",
gee_project="my-gee-project",
dry_run=True, # propose only; run the plan YAML with `agribound delineate --config`
)
print(result.report)agribound agent "Delineate fields in this AOI for 2024" --study-area fields.geojson --dry-run
agribound mcp serve # the same tools for MCP hosts (Claude Desktop, Claude Code, ...)
agribound mcp serve --allow-execute # also execute_plan, confirmed by an MCP elicitation
claude mcp add agribound -- /path/to/env/bin/agribound mcp serve # Claude CodeThe default model is claude-opus-5 (--model or AGRIBOUND_AGENT_MODEL
changes it); --base-url points the backend at an Anthropic-compatible
local endpoint such as Ollama or vLLM (not tested with agribound). The
streamable-http MCP transport has no authentication, so it is refused with
--allow-execute or a non-loopback --host unless
--allow-unauthenticated-http is given. See
Agent layer.
query_ftw retrieves the already-published Fields of The World polygons for
an area of interest (it does not run inference; the polygons are model
predictions, not ground truth). The default layout (by-admin-conf) holds
2024 and 2025 with a confidence column, which is null for all of New Mexico
and 99.7 % of New South Wales in the published files, so min_confidence
cannot select reliable polygons there.
import agribound as ab
ftw = ab.query_ftw(
study_area="bbox:-106.80,34.60,-106.75,34.65",
year=2024,
clip=True,
output_path="ftw_2024.parquet",
)agribound query-ftw --study-area "bbox:-106.80,34.60,-106.75,34.65" --year 2024 -o ftw_2024.parquetWith clip=True (the default), polygons that cross the AOI boundary are
clipped, their metrics:area and metrics:perimeter are recomputed from the
clipped geometry, and the column agribound:clipped marks them; clip=False
returns the whole published polygons with their published metrics. With an
output path, the query parameters, backend and counts are also written to
<output>.provenance.json.
See FTW polygon query.
agribound/
├── agribound/ # Main package
│ ├── __init__.py # Public API (delineate, build_composite, evaluate, list_*, query_ftw, agent)
│ ├── _version.py # Version string
│ ├── _cache.py # Content-addressed cache keys
│ ├── _repro.py # Seeding, seeded generators, version capture, run IDs
│ ├── auth.py # Earth Engine authentication
│ ├── cli.py # Click CLI (delineate, composite, prefetch, evaluate, ...)
│ ├── config.py # AgriboundConfig dataclass and validation
│ ├── evaluate.py # Object-level evaluation
│ ├── ftw_arrow.py # PyArrow reader of the published FTW polygons
│ ├── ftw_query.py # query_ftw()
│ ├── pipeline.py # delineate() and build_composite()
│ ├── provenance.py # Provenance records and configuration hash
│ ├── registry.py # Source and engine registries
│ ├── visualize.py # Interactive maps (leafmap/folium)
│ ├── agent/ # Optional agent layer: tools, plans, gate, session, MCP server, backends
│ ├── clients/ # USGS NAIP Plus ImageServer client
│ ├── composites/ # Composite builders (base, gee, usgs, local + embeddings, dynamic_world)
│ ├── engines/ # Engines, SAM refinement (samgeo_engine), finetune/ package
│ ├── hpc/ # Tiling, regions, `agribound tiles`
│ ├── io/ # Raster, vector and CRS helpers
│ └── postprocess/ # Polygonize, merge, filter, simplify/smooth, regularize, LULC filter
├── assets/ # Figures linked by URL from the README and docs (see assets/README.md):
│ ├── gallery_1.0/ # rendered from the 1.0.0 and 1.0.1 example runs (tools/make_gallery*.py); WebP previews in preview/
│ ├── gallery_0.1x/ # archived 0.1.x screenshots
│ └── agribound_workflow_1.0.* # workflow diagram (tools/make_workflow_diagram.py)
├── docs/ # MkDocs documentation (user guide, API reference, gallery, blog)
├── examples/ # Example scripts 01-22, notebooks/ (generated from the scripts), hpc/, regions/
├── paper/ # Manuscript materials (not included in the PyPI distribution)
├── tests/ # Pytest suite (unit/, integration/)
├── tools/ # Maintainer scripts: make_gallery.py, make_gallery_pampas_0.1x.py, make_workflow_diagram.py, sync_notebooks.py
├── CHANGELOG.md
├── CITATION.cff # Citation metadata
├── CONTRIBUTING.md # Developer guide
├── DISCLAIMER.md # Software disclaimer
├── LICENSE # Apache 2.0
├── MANIFEST.in # Source distribution inclusions/exclusions
├── environment.yml # Core conda environment
├── environment-gfm.yml # GFM (Prithvi) conda environment
├── mkdocs.yml # MkDocs site configuration
├── pyproject.toml # Build configuration, dependencies, extras
└── README.md
Example scripts and notebooks are in examples/; see the
examples README.
| Script | Notebook | Description |
|---|---|---|
| 01_new_mexico_landsat_timeseries.py | notebook | Landsat time series over New Mexico with a Delineate-Anything model fine-tuned on NMOSE polygons |
| 02_india_ganges_sentinel2.py | notebook | Four label-free approaches (FTW, Google and TESSERA embeddings, SPOT pan with Delineate-Anything) in Nadia, West Bengal |
| 03_australia_murray_darling_hls.py | notebook | Prithvi embed and pca modes on HLS in the Murray-Darling Basin, compared with Delineate-Anything v2 on SPOT |
| 04_france_beauce_sentinel2.py | notebook | FTW with crop-calendar season windows in the Beauce |
| 05_pampas_embeddings.py | notebook | CPU-only embedding clustering (Google, TESSERA) in the Pampas |
| 06_kenya_smallholder_ftw.py | notebook | FTW on smallholder fields in Kakamega with four minimum-area thresholds |
| 07_usa_naip_high_res.py | notebook | Delineate-Anything on 1 m NAIP in the Central Valley |
| 08_china_north_plain_spot.py | notebook | Delineate-Anything on SPOT 6/7 in the North China Plain (restricted source) |
| 09_ensemble_comparison.py | notebook | Intersection, union and vote ensembles of Delineate-Anything and FTW (Andalusia) |
| 10_local_tif_quickstart.py | notebook | Local GeoTIFF without Earth Engine |
| 11_mississippi_alluvial_plain_spot.py | notebook | SPOT 6/7 series 2021-2023 with year-to-year agreement (restricted source) |
| 12_new_mexico_ensemble_timeseries.py | notebook | Per-source multi-model ensembles with SAM 2, eastern Lea County, 2022 |
| 13_sam2_refine_dinov3.py | notebook | Stand-alone SAM refinement of existing DINOv3 boundaries |
| 14_dinov3_sam2_ensemble.py | notebook | Fine-tuned DINOv3 with and without SAM 2 on five sources |
| 15_pampas_semi_supervised.py | notebook | Label-free chain: embeddings → LULC filter → SAM 2, compared with Delineate-Anything v2 on Sentinel-2 and SPOT |
| 16_usa_usgs_naip_plus.py | notebook | USGS NAIP Plus without Earth Engine (contributed by Jeremy Rapp) |
| 17_query_published_ftw_polygons.py | notebook | Offline query_ftw demo with a local tile store (contributed by Jeremy Rapp) |
| 18_agent_orchestration.py | notebook | Agent tools and a dry-run plan with the human confirmation gate |
| 19_hpc_tiling.py | notebook | Tiling, two-phase runs and merging with agribound.hpc |
| 20_stratified_evaluation.py | notebook | Stratified, size-class and boundary evaluation against NMOSE with bootstrap intervals; overall object and boundary metrics on Landsat, Sentinel-2, SPOT and NAIP of 2018 and with and without the crop filter |
| 21_published_ftw_audit.py | notebook | Published FTW polygons evaluated against NMOSE |
| 22_global_south_spot_pan.py | notebook | Delineate-Anything v2 on SPOT 6/7 panchromatic (1.5 m, restricted) in six farming landscapes of the Global South |
Earth Engine is needed for the Landsat, Sentinel-2, HLS, NAIP and SPOT
composites, for Google embeddings with the default backend, for GEE-asset
study areas, and for the LULC crop filter (on by default, for every
source). local, usgs-naip-plus and tessera-embedding runs need no Earth
Engine only with lulc_filter=False.
earthengine authenticate # once
agribound auth --project YOUR_GEE_PROJECT # checkCredentials are tried in this order: gee_service_account_key
(--gee-service-account-key), AGRIBOUND_GEE_SERVICE_ACCOUNT_KEY, stored
earthengine authenticate credentials, Application Default Credentials
(GOOGLE_APPLICATION_CREDENTIALS). Batch jobs (Slurm, no TTY) never fall back
to an interactive browser prompt; they raise with instructions. See
GEE setup.
The SPOT 6/7 collection in Google Earth Engine (AIRBUS/SPOT6_7) is
restricted and not publicly available; access is limited to select Earth
Engine users. In agribound this source is for internal use at the Desert
Research Institute (DRI). External users who need SPOT-based field boundaries
can contact the package author to request processing.
Observed with torch 2.10 on Apple MPS during the 1.0.0 checks:
Delineate-Anything (FP16), FTW, DINOv3 and Prithvi embed mode ran on MPS.
GeoAI's Mask R-CNN always runs on CPU (on MPS it reported Metal command-buffer
errors and its detections differed from CPU). Prithvi + UPerNet runs on MPS
only for compatible sizes (for example 192 px chips and tiles) and otherwise
falls back to CPU with a WARNING. SAM masks differ between MPS and CPU. The
Meta SAM 3 backend needs CUDA; use sam_backend="sam3-hf" on macOS (both SAM 3
backends are untested). Scripts
that run FTW need an if __name__ == "__main__": guard (spawned data-loader
workers).
If you use agribound in your research, please cite:
Majumdar, S., Rapp, J., Huntington, J. L., ReVelle, P., Nozari, S., Smith, R. G., Hasan, M. F., Bromley, M., Atkin, J., Jensen, E. R., Ketchum, D., & Roy, S. (2026). Agribound: Unified agricultural field boundary delineation from satellite imagery using geospatial foundation models, pre-trained segmentation, and embeddings [Software]. Zenodo. https://doi.org/10.5281/zenodo.19229665
Majumdar, S., Rapp, J., Huntington, J. L., ReVelle, P., Nozari, S., Smith, R. G., Hasan, M. F., Bromley, M., Atkin, J., Jensen, E. R., Ketchum, D., & Roy, S. (2026). Measuring what geospatial AI delivers for policy-grade agricultural field boundaries. In prep. for Remote Sensing of Environment.
Please also cite the underlying engines, models and data as appropriate:
- Delineate-Anything: Lavreniuk, M., Kussul, N., Shelestov, A., Yailymov, B., Salii, Y., Kuzin, V., & Szantoi, Z. (2025). Delineate Anything: Resolution-agnostic field boundary delineation on satellite imagery. European Conference on Artificial Intelligence (ECAI 2025). arXiv:2504.02534. https://doi.org/10.48550/arXiv.2504.02534
- Delineate-Anything v2 (default model): Lavreniuk, M., Kussul, N., Shelestov, A., Salii, Y., Kuzin, V., Wang, C. J. L.-X., & Szantoi, Z. (2026). Delineate Anything v2: A global foundation model for field delineation. European Conference on Computer Vision Workshops (ECCVW 2026), GAIA workshop. arXiv:2607.19069. https://doi.org/10.48550/arXiv.2607.19069
- Fields of The World (FTW): Kerner, H., Chaudhari, S., Ghosh, A., Robinson, C., Ahmad, A., Choi, E., Jacobs, N., Holmes, C., Mohr, M., Dodhia, R., Lavista Ferres, J. M., & Marcus, J. (2025). Fields of The World: A machine learning benchmark dataset for global agricultural field boundary segmentation. Proceedings of the AAAI Conference on Artificial Intelligence, 39(27), 28151–28159. https://doi.org/10.1609/aaai.v39i27.35034
- FTW PRUE models (default FTW model): Muhawenayo, G., Robinson, C., Khanal, S., Fang, Z., Corley, I., Wollam, A., Gao, T., Strnad, L., Avery, R., Estes, L., Tárano, A. M., Jacobs, N., & Kerner, H. (2026). PRUE: A practical recipe for field boundary segmentation at scale. arXiv:2603.27101. https://doi.org/10.48550/arXiv.2603.27101
- Published FTW polygons: Robinson, C., et al. (2026). The first global agricultural field boundary map at 10m resolution. arXiv:2605.11055 (preprint). https://doi.org/10.48550/arXiv.2605.11055
- GeoAI: Wu, Q. (2026). GeoAI: A Python package for integrating artificial intelligence with geospatial data analysis and visualization. Journal of Open Source Software, 11(118), 9605. https://doi.org/10.21105/joss.09605
- DINOv3: Siméoni, O., Vo, H. V., Seitzer, M., Baldassarre, F., Oquab, M., Jose, C., Khalidov, V., Szafraniec, M., Yi, S., Ramamonjisoa, M., Massa, F., Haziza, D., Wehrstedt, L., Wang, J., Darcet, T., Moutakanni, T., Sentana, L., Roberts, C., Vedaldi, A., ... Bojanowski, P. (2025). DINOv3. arXiv:2508.10104. https://doi.org/10.48550/arXiv.2508.10104
- Prithvi-EO-2.0: Szwarcman, D., Roy, S., Fraccaro, P., et al. (2026). Prithvi-EO-2.0: A versatile multitemporal foundation model for Earth observation applications. IEEE Transactions on Geoscience and Remote Sensing, 64, 1–20. https://doi.org/10.1109/TGRS.2025.3642610
- TerraTorch: Gomes, C., Blumenstiel, B., de Sousa Almeida, J. L., et al. (2025). TerraTorch: The geospatial foundation models toolkit. IGARSS 2025, 6364–6368. https://doi.org/10.1109/IGARSS55030.2025.11243570
- TESSERA: Feng, Z., Atzberger, C., Jaffer, S., Knezevic, J., Sormunen, S., Young, R., Lisaius, M. C., Immitzer, M., Jackson, T., Ball, J., Coomes, D. A., Madhavapeddy, A., Blake, A., & Keshav, S. (2026). TESSERA: Temporal embeddings of surface spectra for Earth representation and analysis. Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 34818–34831. arXiv:2506.20380
- Google Satellite Embeddings (AlphaEarth): Brown, C. F., Kazmierski, M. R., Pasquarella, V. J., Rucklidge, W. J., Samsikova, M., Zhang, C., Shelhamer, E., Lahera, E., Wiles, O., Ilyushchenko, S., Gorelick, N., Zhang, L. L., Alj, S., Schechter, E., Askay, S., Guinan, O., Moore, R., Boukouvalas, A., & Kohli, P. (2025). AlphaEarth Foundations: An embedding field model for accurate and efficient global mapping from sparse label data. arXiv:2507.22291. https://doi.org/10.48550/arXiv.2507.22291
- SAM 2: Ravi, N., Gabeur, V., Hu, Y.-T., Hu, R., Ryali, C., Ma, T., Khedr, H., Rädle, R., Rolland, C., Gustafson, L., Mintun, E., Pan, J., Alwala, K. V., Carion, N., Wu, C.-Y., Girshick, R., Dollár, P., & Feichtenhofer, C. (2025). SAM 2: Segment anything in images and videos. ICLR 2025. arXiv:2408.00714
- SAM 3: Carion, N., Gustafson, L., Hu, Y.-T., et al. (2026). SAM 3: Segment anything with concepts. ICLR 2026. arXiv:2511.16719
- SamGeo: Wu, Q., & Osco, L. P. (2023). samgeo: A Python package for segmenting geospatial data with the Segment Anything Model (SAM). Journal of Open Source Software, 8(89), 5663. https://doi.org/10.21105/joss.05663
- SAM for Remote Sensing: Osco, L. P., Wu, Q., de Lemos, E. L., Gonçalves, W. N., Ramos, A. P. M., Li, J., & Marcato Junior, J. (2023). The Segment Anything Model (SAM) for remote sensing applications: From zero to one shot. International Journal of Applied Earth Observation and Geoinformation, 124, 103540. https://doi.org/10.1016/j.jag.2023.103540
- geemap: Wu, Q. (2020). geemap: A Python package for interactive mapping with Google Earth Engine. Journal of Open Source Software, 5(51), 2305. https://doi.org/10.21105/joss.02305
- Google Earth Engine: Gorelick, N., Hancher, M., Dixon, M., Ilyushchenko, S., Thau, D., & Moore, R. (2017). Google Earth Engine: Planetary-scale geospatial analysis for everyone. Remote Sensing of Environment, 202, 18–27. https://doi.org/10.1016/j.rse.2017.06.031
- Awesome GEE Community Catalog: Roy, S., Majumdar, S., & Swetnam, T. (2025). samapriya/awesome-gee-community-datasets: Community Catalog (3.9.0). Zenodo. https://doi.org/10.5281/zenodo.17641528
More references (HLS, Dynamic World, NLCD, C3S, Cloud Score+, evaluation methods, ACCESS) are listed in the documentation.
This project is licensed under the Apache License 2.0. The
Delineate-Anything model code and weights, and Ultralytics, are AGPL-3.0.
The DINOv3 weights used by the dinov3 engine are under the
DINOv3 License
(custom, not OSI-approved), whose clause 1.b.ii requires publications to
acknowledge the use of the DINO Materials; the SAM 3 licence has a similar
clause. Check the licences of the models and datasets you use.
Agribound builds on the work of many open-source projects and research teams:
- The Ultralytics team for the YOLO ecosystem
- Mykola Lavreniuk and co-authors for Delineate-Anything
- Meta AI Research for the Segment Anything models and DINOv3
- The Fields of The World consortium and Hannah Kerner's group at Arizona State University
- Qiusheng Wu for the GeoAI and samgeo Python packages
- NASA and IBM Research for the Prithvi geospatial foundation model and TerraTorch
- Google DeepMind for AlphaEarth satellite embeddings
- Feng et al. for the TESSERA foundation model embeddings
- The Google Earth Engine team for planetary-scale geospatial computing
- The fiboa community for the field boundary schema standard
- The TorchGeo team for geospatial deep learning data loaders and utilities
- The Desert Research Institute (DRI) for supporting this research
This work was supported by multiple funding sources. The New Mexico Office of the State Engineer (NMOSE) provided reference field boundary data and supported the development of agricultural water use mapping in New Mexico. The Google Satellite Embeddings Dataset Small Grants Program enabled the integration of pre-computed satellite embeddings for unsupervised field boundary delineation. Access to the SPOT 6 and 7 archive on Google Earth Engine was provided through the Google Trusted Tester opportunity. Additional support was provided by the U.S. Army Corps of Engineers and The U.S. Department of Treasury/State of Nevada. This work was also supported by the NASA Water Resources Applications Program, the United States Geological Survey (USGS) and NASA Landsat Science Team, the USGS Water Resources Research Institute, the Desert Research Institute Maki Endowment, and the Windward Fund.
Portions of this software were developed with the assistance of AI coding tools, including Anthropic's Claude. AI was used to accelerate code scaffolding, documentation drafting, and test generation. All AI-generated code was reviewed, tested, and validated by the human authors. The scientific methodology, architectural decisions, algorithm selection, and domain-specific implementations reflect the expertise and judgment of the authors.



