AlphaEarth Foundations di Google è un modello di incorporamento geospaziale addestrato su una serie di set di dati di osservazione della Terra (EO). Il modello è stato eseguito su serie temporali annuali di immagini e gli incorporamenti risultanti sono disponibili come set di dati pronto per l'analisi in Earth Engine. Questo set di dati consente agli utenti di creare un numero qualsiasi di applicazioni di ottimizzazione o altre attività senza eseguire modelli di deep learning costosi dal punto di vista computazionale. Il risultato è un set di dati generico che può essere utilizzato per una serie di diverse attività downstream, ad esempio
- Classificazione
- Regressione
- Rilevamento delle modifiche
- Ricerca per somiglianza
In questo tutorial capiremo come funzionano gli embedding e impareremo ad accedere al set di dati Satellite Embedding e a visualizzarlo.
Informazioni sugli incorporamenti
Gli incorporamenti sono un modo per comprimere grandi quantità di informazioni in un insieme più piccolo di caratteristiche che rappresentano una semantica significativa. Il modello AlphaEarth Foundations acquisisce serie temporali di immagini da sensori tra cui Sentinel-2, Sentinel-1 e Landsat e impara a rappresentare in modo univoco le informazioni reciproche tra fonti e target con soli 64 numeri (scopri di più nell'articolo). Il flusso di dati di input contiene migliaia di bande di immagini provenienti da più sensori e il modello prende questo input ad alta dimensionalità e lo trasforma in una rappresentazione a dimensionalità inferiore.
Un buon modello mentale per capire come funziona AlphaEarth Foundations è una tecnica chiamata analisi delle componenti principali (PCA). La PCA aiuta anche a ridurre la dimensionalità dei dati per le applicazioni di machine learning. Mentre l'analisi delle componenti principali (PCA) è una tecnica statistica e può comprimere decine di bande di input in una manciata di componenti principali, AlphaEarth Foundations è un modello di deep learning che può utilizzare migliaia di dimensioni di input di set di dati di serie temporali multisensoriali e impara a creare una rappresentazione a 64 bande che acquisisce in modo univoco la variabilità spaziale e temporale di quel pixel.
Un campo di incorporamento è l'array continuo o "campo" degli incorporamenti appresi. Le immagini nelle raccolte dei campi di incorporamento rappresentano traiettorie spazio-temporali che coprono un intero anno e hanno 64 bande (una per ogni dimensione di incorporamento).
Figura: vettore di embedding n-dimensionale campionato da un campo di embedding
Accedere al set di dati Satellite Embedding
Il set di dati Incorporamento satellitare è una raccolta di immagini contenente immagini annuali a partire dal 2017 (ad es. 2017, 2018, 2019…). Ogni immagine ha 64 bande in cui ogni pixel è il vettore di incorporamento che rappresenta la serie temporale multisensore per l'anno specificato.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
Seleziona una regione
Iniziamo definendo una regione di interesse. Per questo tutorial, sceglieremo una regione intorno al bacino idrico di Krishna Raja Sagara (KRS) in India e definiremo un poligono come variabile di geometria. In alternativa, puoi utilizzare gli strumenti di disegno nell'editor di codice per disegnare un poligono intorno alla regione di interesse che verrà salvata come variabile geometry
negli import.
// Use the satellite basemap
Map.setOptions('SATELLITE');
var geometry = ee.Geometry.Polygon([[
[76.3978, 12.5521],
[76.3978, 12.3550],
[76.6519, 12.3550],
[76.6519, 12.5521]
]]);
Map.centerObject(geometry, 12);
Figura: selezione della regione di interesse
Prepara il set di dati di incorporamento satellitare
Le immagini di ogni anno sono suddivise in riquadri per un facile accesso. Applichiamo i filtri e troviamo le immagini per l'anno e la regione che abbiamo scelto.
var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
var filteredEmbeddings = embeddings
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));
Le immagini incorporate del satellite sono suddivise in riquadri di dimensioni massime di 163.840 m x 163.840 m ciascuno e vengono visualizzate nella proiezione per le zone UTM del riquadro. Di conseguenza, otteniamo più riquadri di incorporamento satellitare che coprono la regione di interesse. Possiamo utilizzare la funzione mosaic()
per combinare più riquadri in un'unica immagine. Stampiamo l'immagine risultante per vedere le bande.
var embeddingsImage = filteredEmbeddings.mosaic();
print('Satellite Embedding Image', embeddingsImage);
Vedrai che l'immagine ha 64 bande, denominate A00, A01, … , A63. Ogni banda contiene il valore del vettore di incorporamento per l'anno specificato in quella dimensione o asse. A differenza delle bande spettrali o degli indici, le singole bande non hanno un significato indipendente. Ogni banda rappresenta un asse dello spazio di incorporamento. Utilizzeresti tutte le 64 bande come input per le tue applicazioni downstream.
Figura: 64 bande dell'immagine incorporata del satellite
Visualizzare il set di dati Satellite Embedding
Come abbiamo appena visto, la nostra immagine contiene 64 bande. Non esiste un modo semplice per visualizzare tutte le informazioni contenute in tutte le bande, poiché possiamo visualizzare solo una combinazione di tre bande alla volta.
Possiamo scegliere tre bande qualsiasi per visualizzare tre assi dello spazio di incorporamento come immagine RGB.
var visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A09']};
Map.addLayer(embeddingsImage.clip(geometry), visParams, 'Embeddings Image');
Figura: visualizzazione RGB dei tre assi dello spazio di embedding
Un modo alternativo per visualizzare queste informazioni è utilizzarle per raggruppare i pixel con incorporamenti simili e utilizzare questi raggruppamenti per capire in che modo il modello ha appreso la variabilità spaziale e temporale di un paesaggio.
Possiamo utilizzare tecniche di clustering non supervisionato per raggruppare i pixel nello spazio a 64 dimensioni in gruppi o "cluster" di valori simili. A questo scopo, campioniamo prima alcuni valori dei pixel e addestriamo un ee.Clusterer
.
var nSamples = 1000;
var training = embeddingsImage.sample({
region: geometry,
scale: 10,
numPixels: nSamples,
seed: 100
});
print(training.first());
Se stampi i valori del primo campione, vedrai che ha 64 valori di banda che definiscono il vettore di incorporamento per quel pixel. Il vettore di embedding è progettato per avere una lunghezza unitaria (ovvero la lunghezza del vettore dall'origine (0,0,....0) ai valori del vettore sarà 1).
Figura: vettore di embedding estratto
Ora possiamo addestrare un modello non supervisionato per raggruppare i campioni nel numero desiderato di cluster. Ogni cluster rappresenterebbe i pixel di incorporamenti simili.
// Function to train a model for desired number of clusters
var getClusters = function(nClusters) {
var clusterer = ee.Clusterer.wekaKMeans({nClusters: nClusters})
.train(training);
// Cluster the image
var clustered = embeddingsImage.cluster(clusterer);
return clustered;
};
Ora possiamo raggruppare l'immagine di incorporamento più grande per vedere gruppi di pixel con incorporamenti simili. Prima di farlo, è importante capire che il modello ha acquisito la traiettoria temporale completa di ogni pixel per l'anno, il che significa che se due pixel hanno valori spettrali simili in tutte le immagini, ma in momenti diversi, possono essere separati.
Di seguito è riportata una visualizzazione della nostra area di interesse acquisita dalle immagini Sentinel-2 con maschera delle nuvole per l'anno 2024. Ricorda che tutte le immagini (insieme a quelle di Sentinel-2, Landsat 8/9 e molti altri sensori) sono state utilizzate per apprendere gli incorporamenti finali.
Figura: serie temporale annuale di Sentinel-2 per la nostra regione
Visualizziamo le immagini di Satellite Embedding segmentando il paesaggio in tre cluster,
var cluster3 = getClusters(3);
Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3 clusters');
Figura: immagine di incorporamento satellitare con tre cluster
Noterai che i cluster risultanti hanno confini molto netti. Questo perché gli incorporamenti includono intrinsecamente il contesto spaziale: i pixel all'interno dello stesso oggetto dovrebbero avere vettori di incorporamento relativamente simili. Inoltre, uno dei cluster include aree con acqua stagionale intorno al bacino principale. Ciò è dovuto al contesto temporale acquisito nel vettore di incorporamento, che ci consente di rilevare questi pixel con pattern temporali simili.
Vediamo se possiamo perfezionare ulteriormente i cluster raggruppando i pixel in 5 cluster.
var cluster5 = getClusters(5);
Map.addLayer(cluster5.randomVisualizer().clip(geometry), {}, '5 clusters');
Figura: immagine di incorporamento del satellite con 5 cluster
Possiamo continuare e perfezionare le immagini in gruppi più specializzati aumentando il numero di cluster. Ecco l'aspetto dell'immagine con 10 cluster.
var cluster10 = getClusters(10);
Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, '10 clusters');
Figura: immagine di incorporamento satellitare con 10 cluster
Stanno emergendo molti dettagli e possiamo vedere diversi tipi di colture raggruppati in cluster diversi. Poiché l'incorporamento satellitare acquisisce la fenologia delle colture insieme alle variabili climatiche, è ideale per la mappatura dei tipi di colture. Nel tutorial successivo (classificazione non supervisionata), vedremo come creare una mappa del tipo di coltura con dati di incorporamento satellitare con etichette a livello di campo minime o assenti.
Prova lo script completo per questo tutorial nell'editor di codice di Earth Engine.