Ricerca di somiglianze con il set di dati di incorporamento satellitare

Modifica su GitHub
Segnala problema
Cronologia della pagina
Questo tutorial fa parte di una serie di tutorial sul set di dati Satellite Embedding. Vedi anche Introduzione, Classificazione non supervisionata, Classificazione supervisionata e Regressione.

Gli incorporamenti offrono un'opportunità unica per trovare luoghi e caratteristiche simili utilizzando i dati di osservazione della Terra. Confrontando il vettore di incorporamento di una località di riferimento con i vettori di incorporamento di tutti gli altri pixel di un'immagine di incorporamento, possiamo trovare località che presentano proprietà simili a quelle della località di riferimento. In pratica, questo ci consente di trovare facilmente oggetti o tipi particolari di siti nella nostra regione di interesse.

Per questo tutorial, cercheremo di trovare tutti i silos per il grano in una regione. I silos o i contenitori per cereali sono strutture alte comunemente utilizzate per lo stoccaggio alla rinfusa dei cereali. Si trovano in aziende agricole o impianti di lavorazione. La mappatura di queste strutture sarebbe difficile con i metodi di telerilevamento tradizionali e richiederebbe l'addestramento di un modello di rilevamento di oggetti personalizzato. Poiché i silos hanno una forma e una struttura uniche e sono in genere realizzati con materiali simili, saranno rappresentati con vettori di incorporamento unici nelle immagini di incorporamento satellitare, il che ci consentirà di individuarli con una semplice ricerca di similarità.


Silos per cereali (immagine: Wikipedia)

Seleziona la regione di ricerca

Per questo tutorial, mapperemo i silos di grano nella contea di Franklin, in Kansas. Applichiamo un filtro e selezioniamo il poligono per questa contea.

var counties = ee.FeatureCollection('TIGER/2018/Counties');

// Select Franklin County, Kansas
var selected = counties
  .filter(ee.Filter.eq('GEOID', '20059'));
var geometry = selected.geometry();

Map.centerObject(geometry);
Map.addLayer(geometry, {color: 'red'}, 'Search Area');


Figura: regione selezionata

Seleziona una o più località di riferimento

Iniziamo contrassegnando la posizione di uno o più silos per cereali. Nell'editor di codice, puoi utilizzare la mappa di base satellitare, che semplifica l'individuazione degli oggetti.

// Use the satellite basemap
Map.setOptions('SATELLITE');

Una volta trovata la posizione dell'oggetto di interesse, utilizza lo strumento Aggiungi un indicatore dagli strumenti di disegno per inserire un punto e contrassegnarlo come posizione di riferimento.


Figura: aggiunta di una posizione di riferimento

Spesso è sufficiente anche una sola posizione, ma avere qualche esempio in più aiuta a ridurre i falsi positivi (in questo caso, le posizioni identificate come silos per cereali che in realtà non lo sono). Modificheremo il tipo di geometria in FeatureCollection per poter aggiungere più punti di riferimento. Fai clic sul pulsante Modifica proprietà livello accanto alla geometria. Modifica il nome del livello in samples e imposta il tipo di importazione su FeatureCollection. Fai clic su OK.


Figura: configurazione del livello dei campioni

Nella finestra principale dell'editor di codice, aggiungi punti in altre posizioni rappresentative.


Figura: aggiunta di altre località di riferimento

Per questo tutorial, abbiamo selezionato tre località di riferimento. Questi verranno utilizzati per estrarre i vettori di incorporamento dalle immagini di incorporamento satellitare.

Seleziona un periodo di tempo

Scegli un anno per cui eseguire la ricerca.

var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

Filtrare e creare un mosaico del set di dati Incorporamento satellitare

Carichiamo il set di dati Satellite Embedding, filtriamo le immagini per l'anno scelto e creiamo un mosaico.

var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');

var mosaic = embeddings
  .filter(ee.Filter.date(startDate, endDate))
  .mosaic();

Estrai il vettore di incorporamento dagli esempi

Campioniamo il mosaico nelle posizioni di riferimento per ottenere il vettore di incorporamento associato a questi punti. Dobbiamo anche selezionare la scala in cui vogliamo estrarre e confrontare il vettore di incorporamento. Una proprietà molto pratica degli incorporamenti in Satellite Embedding è che sono stati progettati per essere componibili in modo lineare, il che significa che possono essere aggregati o piramidati mantenendo le relazioni di distanza e il significato interpretato. Se prendiamo una media spaziale su 2x2 pixel, il risultato rappresenta l'incorporamento di un pixel più grande a risoluzione inferiore. La risoluzione nativa per l'incorporamento di immagini satellitari è di 10 m e per identificare piccoli oggetti come i silos per il grano, questa è una buona scala da utilizzare. Tuttavia, se vuoi trovare oggetti o siti più grandi, puoi utilizzare un valore maggiore (ad es. 20 m, 1000 m) per trovare corrispondenze con gli oggetti a scale più grossolane.

// Choose the scale
// You may choose a larger value for larger objects
var scale = 10;

// Extract the embedding vector from the samples
var sampleEmbeddings = mosaic.sampleRegions({
  collection: samples,
  scale: scale
});

Calcolare la somiglianza

Il calcolo del prodotto scalare tra due vettori di embedding ci consente di calcolare la loro similarità. Il prodotto scalare riduce la magnitudo di due vettori e l'angolo tra loro a un singolo numero. Nel nostro caso, i vettori di incorporamento hanno lunghezza unitaria, quindi il risultato è solo l'angolo tra i vettori.

Possiamo semplicemente moltiplicare due vettori di incorporamento di lunghezza unitaria a 64 dimensioni e sommare i prodotti per ottenere il coseno dell'angolo tra i vettori (ovvero il "prodotto scalare"). Calcoliamo un'immagine per ogni posizione di riferimento e prendiamo la media del risultato per ottenere un'immagine con valori dei pixel del prodotto scalare.

// We compute the dot product between two embedding vectors
var bandNames = mosaic.bandNames();

var sampleDistances = ee.ImageCollection(sampleEmbeddings.map(function (f) {
  var arrayImage = ee.Image(f.toArray(bandNames)).arrayFlatten([bandNames]);
  var dotProduct = arrayImage.multiply(mosaic)
    .reduce('sum')
    .rename('similarity');
  return dotProduct;
}));

// Calculate mean distance from all reference locations
var meanDistance = sampleDistances.mean();

I pixel con un prodotto scalare vicino a 1 hanno vettori di incorporamento relativamente simili (angolo tra loro vicino a 0), mentre i prodotti scalari più vicini a -1 indicano una maggiore divergenza tra i vettori (ortogonali alla direzione opposta). Possiamo visualizzare i risultati aggiungendo l'immagine della distanza media alla mappa.

var palette = [
  '000004', '2C105C', '711F81', 'B63679',
  'EE605E', 'FDAE78', 'FCFDBF', 'FFFFFF'
];
var similarityVis = {palette: palette, min: 0, max: 1};

Map.addLayer(meanDistance.clip(geometry), similarityVis,
  'Similarity (bright = close)', false);


Figura: somiglianza dei pixel intorno a un punto di riferimento, con le aree più luminose più simili

Estrai le corrispondenze delle località

Per il passaggio successivo, dobbiamo definire una soglia ed estrarre le posizioni contenenti l'oggetto target. Tutti i pixel con silos per il grano avranno vettori di incorporamento molto simili al vettore di incorporamento di riferimento e l'angolo tra loro sarà vicino a 1. Definiamo una soglia per trovare tutti questi pixel all'interno della regione. Trovare la soglia giusta dipende dall'oggetto che stai cercando e dalla scala. Puoi sperimentare con valori diversi e vedere quale funziona meglio per la tua applicazione.

// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);

Il risultato è un'immagine binaria con pixel con valori di similarità inferiori alla soglia. Ora convertiamo l'immagine risultante in poligoni.

// Mask 0 values using selfMask()
// to get polygons only for the matched pixels
var polygons = similarPixels.selfMask().reduceToVectors({
  scale: scale,
  eightConnected: false,
  maxPixels: 1e10,
  geometry: geometry
});

Ogni poligono rappresenta un sito che corrisponde alle località di riferimento. Possiamo utilizzare il centroide per rappresentare la località corrispondente.

// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
  return f.centroid({maxError:1});
});

Esportare le corrispondenze in un asset (facoltativo)

La vettorizzazione è un'operazione che richiede un uso intensivo di memoria e calcoli in Earth Engine. Per evitare Timeout del calcolo o Errore riquadro durante la visualizzazione dei risultati, è consigliabile esportarli come asset. Una volta esportato, l'asset può essere importato nello script e visualizzato. Questo metodo garantisce inoltre di poter scalare la ricerca su aree di grandi dimensioni senza problemi.

// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var matchesExportFc = 'predicted_grain_silo_matches';
var matchesExportFcPath = exportFolder + matchesExportFc;

Export.table.toAsset({
  collection: predictedMatches,
  description: 'Predicted_Matches_Export',
  assetId: matchesExportFcPath
});

Avvia le attività di esportazione e attendi il completamento prima di procedere. Una volta terminata l'attività di esportazione, importiamo nuovamente le corrispondenze nel nostro codice.

// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);

Visualizzare le partite

Che tu abbia estratto le corrispondenze in modo interattivo o le abbia esportate in una raccolta di elementi, ora avrai una variabile predictedMatches con le corrispondenze previste con le località di riferimento all'interno dell'area di ricerca. Visualizziamoli.

Map.addLayer(predictedMatches, {color: 'cyan'} , 'Predicted Matches');

Convalidare i risultati

Per valutare i risultati, puoi ingrandire ogni corrispondenza prevista per vedere se in quella posizione è presente un silo per il grano. Vedrai che ci sono molte corrispondenze che hanno identificato correttamente i silos per cereali.


Figura: siti con silos per il grano identificati correttamente

I risultati presentano anche alcuni falsi positivi. Come puoi notare, le corrispondenze hanno molte caratteristiche simili alla nostra posizione di riferimento e quindi vettori di incorporamento simili.


Figura: corrispondenze di falsi positivi

Per migliorare i risultati, puoi modificare le posizioni di riferimento e la soglia selezionata.

Prova lo script completo per questo tutorial nell'editor di codice di Earth Engine.