Seeding the search: AlphaEarth Foundations Satellite Embeddings for detecting agricultural…
Editor’s note: Today’s post is by Jake Wilkins, Founding Engineer, Epoch Blue. This post is part of a series of case studies on AlphaEarth…

Seeding the search: AlphaEarth Foundations Satellite Embeddings for detecting agricultural facilities
Editor’s note: Today’s post is by Jake Wilkins, Founding Engineer, Epoch Blue. This post is part of a series of case studies on AlphaEarth Foundations Satellite Embeddings, part of Google Earth AI.
Epoch is a first-mile intelligence platform decommoditising the global supply chain and enabling agricultural and forestry supply chains to be more resilient, transparent and sustainable. Epoch generates compliance-ready data on deforestation, emissions, biodiversity, and water without any supplier questionnaires, helping corporations gain visibility into the “first mile” of their supply chains–the farms, forests and production facilities where raw materials are grown, harvested and first processed. Epoch’s data is used by NGOs, regulators, producers and is available to more than 24,000 corporates and financial institutions through its integrations with the leading supply chain platforms. Learn more about our team, mission, and values here.
Mapping the first mile of global supply chains has historically meant years of manual digitisation or months of expensive custom model training (when training data has been available). We explored a different approach: starting with just 50 labels, a laptop and the AlphaEarth Foundations (AEF) Satellite Embedding dataset, we detected nearly 70% of Sumatra’s known palm oil mills in a single afternoon.
For this case study, we chose Indonesia, which accounts for around 60% of global palm oil production, as our testing ground. It’s a hotspot for commodity-driven deforestation where intact forest area has declined by 45% since 1990, and palm oil production has increased nearly 20x in the same period. With around 40% of production on the Indonesian island of Sumatra being smallholder, there’s a dense mill network across the island — nearly 900 palm oil mills spread across ~480,000 km² of land.
In our latest report as a contributing member to World Wildlife Fund’s Codex Planetarius, we mapped the probabilistic relationship, known as the supply shed, between this mill network and the commodity-producing areas across Indonesia, producing a granular and systematic assessment of the environmental impact of commodity production (Figure 1). Just 5% of facilities were linked to 73% of post-2020 deforestation and 77.9% of total LUC (Land Use Change) emissions, with a disproportionate impact concentrated among a few corporate actors. Our results identify the macro-trends of sourcing regions across Indonesia, this data enables better policy decisions and allows corporate buyers sourcing from the region to make targeted due diligence checks.

Figure 1: Example of a supply shed delineation within the Epoch platform. It shows a Palm Oil Mill in the Riau region of Sumatra, with its delineated supply shed in grey, EUDR compliant plots in green, non-compliant plots in red and the facility itself with a blue dot.
For palm oil in Indonesia, we’re lucky to have best-in-class databases like the Universal Mill List and the expanded Trase Universal Mill List (Figure 2), developed with years of manual digitisation, administrative record detective work, and in-situ verification. However, we don’t have the luxury of large, peer-reviewed datasets of facility locations for most other commodities across the world. Before scaling to unmapped tropical commodities like cocoa, rubber, and coffee, we wanted to benchmark the approach where ground truth exists. How close could we get to replicating the coverage of the Trase UML in an afternoon, starting from scratch using AEF embeddings and a laptop?

Figure 2: Sumatra, Indonesia with 867 palm oil mill locations from the Trase dataset
Finding the prompt: POME lagoons
To separate out palm oil mills from other industrial areas, we must search for infrastructure unique to this commodity. Palm Oil Mill Effluent (POME) lagoons are typically rectangular, brown-green ponds in series (from cooling to anaerobic to aerobic), making them especially distinctive (Figure 3). To further complicate the search, Sumatra also has an expansive shrimp aquaculture farming industry, which, from a satellite perspective looks remarkably similar to a POME lagoon.

Figure 3: A closer look at the facility from figure 1, an estate-based facility parallel pools can be seen clearly. Imagery: Google Earth, Maxar.
So how can we use the Satellite Embedding dataset to search for these distinctive POME lagoons? AEF embeddings encode observed surface and environmental properties as vectors — directions in embedding space. If POME lagoons have a consistent signature, or ‘look’ to the model, we should be able to find a vector that points towards them. Just as an LLM encodes the “concept” of a cat, AEF embeddings encode the “concept” of a rectangular brown-green pond in an equatorial climate. Continuing the analogy, we can “prompt” AEF by training a linear model to search for a linear “concept” (i.e. a single linear vector value) in embedding space. Let’s walk through how we did this to find new and existing POME lagoons and associated processing facilities.
Seeding the search

Figure 4: Overview of the iterative detection workflow
We want to search for POME lagoons over a very wide area, and we don’t need pixel-level accuracy since detections are going to be manually verified before being added to our database, so we can reduce our processing demands by working with the embeddings at a coarser resolution. Our iterative workflow (Figure 4) begins by using XEE (an Xarray extension for Earth Engine) and the high volume API endpoint to extract AEF embeddings at a reduced scale of 80m and output the file to a single zarr file. AEF embeddings are unit-normalised and linearly separable, so reducing the scale in practical terms means taking the average of the 10m resolution embeddings within an 8x8 pixel grid, effectively reducing the dataset size by 64x. Earth Engine already stores raster data in pyramids, making this a very quick operation.
For our search year, 2024, and the land area of Sumatra, we get an array of approximately 75 million vector embeddings (roughly 30GB). Using the open source geovibes tool, which provides an interactive labelling, search and classification workflow for geospatial embeddings, we convert our array into a duckDB table and we index them with FAISS, an index made especially for efficient similarity search across dense vector clusters.
To create a set of training samples, we start by labelling a handful of known facility locations. In some data sparse areas we’ve started with just three known facilities, and used geovibes to find more examples of similar vectors to expand the number of samples. In this case, we label 50 random facility lagoons; with the geovibes notebook UI this takes just a few minutes. We next use the built-in stratified sampler, pulling 3500 random “negative” samples from Earth Engine using the community-hosted ESRI landcover map, sampling across landcover classes ensures the negative set includes not just the dominant forest and cropland but also water, built-up areas and other classes that could be confused with facility infrastructure. Our negative samples are taken at least 500m away from our positive samples to avoid negative sampling of a known positive area. This operation is quick, taking less than a minute.
geovibes sample_negatives \
--positives labeled_pome_lagoons.geojson \
--db sumatra_metadata.db \
--output sampled_negatives.geojson \
--config sampling_config.yaml
A linear baseline
With our samples in hand, we need a classifier. AEF embeddings are produced by a large neural network, so the complex visual feature extraction is already done, and the representations are linearly separable, so a simple linear model can exploit them without training a deep network of our own. We forked the geovibes toolset to add linear model support, which gives us a baseline result in seconds. As a bonus, a linear model outputs a single direction vector and intercept that we can copy directly into Earth Engine and apply as a dot product at the native 10m resolution. This acts as a visual sanity check to see whether our search direction is pointing at the right features.
geovibes pipeline \
--positives labeled_pome_lagoons.geojson \
sampled_negatives.geojson \
--db sumatra_metadata.db \
--classifier linear-svm \
--tile-size 80 --threshold 0.5
Combined 116 positives + 3,500 negatives
Training time: 1.05s F1=0.936
Scoring 75,312,294 embeddings...
Found 105,311 detections above threshold 0.5
Data Loading: 1s
Training: 1s
Inference: 160s
Output Generation: 12s
Total: 174s
Running on a consumer laptop, the training, inference and output of 75 million vectors took just 174 seconds! For context, a deep learning model tackling the same task would require at least an order of magnitude more training data, compute and engineering effort. With embeddings, we can run a country-scale inference job in minutes, which means each iteration is cheap enough to treat as a draft rather than our final answer.
And this first pass is very much a draft! Though we had over 100,000 positive detections, most of them are false. This is expected, since our stratified negatives narrowed the search space to water, facilities and cropland, but we haven’t yet distinguished POME lagoons from their look-alikes: rivers, aquaculture and palm plantations. The fix is more examples distinguishing these edge cases from real POME lagoons. Using geovibes, we loaded our detections, filtered for the most obviously wrong, and labelled roughly 100 false positives as negatives. Then we reran the pipeline:
geovibes pipeline \
--positives labeled_pome_lagoons.geojson \
sampled_negatives.geojson \
augmented_false_positives.geojson \
--db sumatra_metadata.db \
--classifier linear-svm \
--tile-size 80 --threshold 0.5
Combined 124 positives + 3,606 negatives
Training time: 1.01s F1=0.846
Scoring 75,312,294 embeddings...
Found 10,215 detections above threshold 0.5
Now we’re getting somewhere: in two iterations and 10 minutes of labelling, we’ve cut down from 70 million vectors to just 10,000 candidates, many of which are clustered together. As a sanity check, let’s see how many pools are within 500m of the palm processing facilities we’re looking for:
validate_detections \
--detections classification_detections.geojson \
--truth sumatra-palm-oil-mills.geojson \
--buffer 500m
Total detections: 8,836
True positives: 3,362 (within 500m)
False positives: 5,474
Recall: 0.712 (617/867 mills detected)
Just under half of our detections are very near facilities, and we capture around 70% of the facilities with this run, however, there’s still a very high false positive rate. Let’s explore the linear vector within Earth Engine and see why. As Figure 5 illustrates, (explore more in this script), we see spots of high-similarity on the pools themselves, interestingly we also see bright spots for open border areas between trees and roads, as well as quite strong correlation with aquaculture (Figure 6). Now, we took the average of an 8x8 set of pixels to get the embeddings used for our search, which is why we might find strong correlation with the edges of pools and roads as we’re not predicting on the pixel level to get our results.

Figure 5: The visualised dot product between our direction vector and the 10-meter AEF embeddings over the same facility in Figure 1, with pools highlighted in particular. Imagery: Google Earth, Maxar

Figure 6: Aquaculture in the south and north showing up brightly, while agricultural fields are relatively dark in the northeast and south\west. Inset image showing that high similarity spots are limited to just aquaculture pools and not the river. Imagery: Google Earth, Maxar
Now that we have a reasonable set of detections, there are a number of steps we could take to improve the model. We’d expect that continued labelling and relabelling will continue to improve results but at a slower rate. We could also explore other model types and configurations, including non-linear models to see if they output better results. However, an alternative next step should really be further refining the current model results via post-processing.
Post-processing
As we’re treating our POME lagoon search as an object detection problem, we can add a simple spatial clustering method as an initial post-processing step to reduce the overall count of objects we need to review. Using the Density-Based Spatial Clustering of Applications with Noise (DBSCAN) clustering method, which groups data points based on density while allowing for single point clusters, we’re able to reduce our overall object count from 8836 patches to 2600 patch-clusters (Figure 7). With a quick test script, we see that we lose a few overall detections (because we haven’t actually removed any noise, we’ve just shifted it to a centroid), while removing the overall number of points/areas of interest we need to actually check.

Figure 7: Nearby detected patches (80m) are clustered into single centroid points using DBSCAN, reducing the number of locations to review while retaining isolated detections.
To sanity-check how well our clustered detections align with known facilities, we run a simple proximity validation against the Trase Universal Mill List. This buffers each detection by 500m and counts how many fall near a documented mill — it’s a rough heuristic rather than a definitive validation. POME lagoons may be further away from the facility than our 500m buffer allows for. The inverse is also true: aquaculture ponds near a facility can inflate our true positive count. Both cases demonstrate why manual review is still essential.
validate_detections \
--detections classification_clustered_centroids.geojson \
--truth sumatra-palm-oil-mills.geojson \
--buffer 500m
Total detections: 2,604
True positives: 595 (within 500m)
False Positives: 2,009
Recall: 0.679 (589/867 mills detected)
That said, we can be pretty amazed by this. We’ve managed to detect nearly 70% of Sumatra’s palm oil mills with just 2 training runs of a LinearSVM and some simple post-processing. When we include the hand-labelling and manual checks of each point, this all amounted to a single afternoon of work!
If you’re intending to include these kinds of detections in a fully automated pipeline, as we’ve done for other commodities (including our latest report on cocoa), you’ll want to take this a step further. Some possible options are morphological checks with the Forest Data Partnership layers for a given commodity, zonal statistics for the presence of water, builtup, and bare areas using land cover maps like Dynamic World, alongside checks to ensure detections are not within rivers or large settlements. Finally, including a built-structure dataset to verify for large building presence is a sure check to ensure some kind of facility has been detected.
What we learned
Starting from just 50 labelled POME lagoons and an afternoon of work, we successfully detected and validated ~70% of Sumatra’s documented palm oil mills. This case study demonstrates what’s now possible with AlphaEarth Foundations Satellite Embeddings: a single analyst with a laptop can seed a country-scale search, reducing millions of candidate locations to a few thousand to review in just two training iterations.
The key insight here is that embeddings have shifted the bottleneck: The hard part is no longer securing compute or collecting huge training datasets, but deciding what to search for and how to post-process and verify results. With pre-computed AlphaEarth Foundations embeddings, we can choose the level of detail — from pixel to tile — and iterate quickly, making it practical to explore new problems that weren’t practical for small and resource-strapped teams.
For commodities without a Universal Mill List, this is a level up. We can now bootstrap country-scale searches with just a handful of labels, building datasets in regions which previously had no baseline. However, verification and validation has never been more important. As we use fewer resources on producing data, we must prioritise more resources to ground sampling, and validation; mindful that it’s our responsibility to faithfully share results and be realistic about new capabilities.
Learn more
- Epoch is a London and Brussels based startup building the most comprehensive first-mile visibility platform for agricultural and forestry supply chains, our whitepapers can be found here
- Geovibes is an open source package produced by Christopher Ren and Earth Genome, his blog on the tool is an excellent resource to learn more
- The AlphaEarth Foundations Concept Menagerie is a list of embedding concepts maintained by Samuel Barrett
- XEE is an Xarray extension for Google Earth Engine
- The AlphaEarth Foundations Satellite Embedding dataset is available in Earth Engine, and Google Cloud Storage, and the research paper is available here
메타데이터
- post_id
- 43cf78e1cc5f
- slug
- seeding-the-search-alphaearth-foundations-satellite-embeddings-for-detecting-agricultural-43cf78e1cc5f
- url
- https://medium.com/google-earth/seeding-the-search-alphaearth-foundations-satellite-embeddings-for-detecting-agricultural-43cf78e1cc5f
- canonical_url
- https://medium.com/google-earth/seeding-the-search-alphaearth-foundations-satellite-embeddings-for-detecting-agricultural-43cf78e1cc5f
- author_url
- https://medium.com/@googleearth
- status
- ok
- fetched_at
- 2026-07-31 14:52:56