Gli incorporamenti satellitari possono essere utilizzati per i flussi di lavoro di classificazione del telerilevamento standard. Gli incorporamenti sono stati progettati specificamente per eccellere nell'apprendimento con pochi esempi, il che significa che è necessario un numero relativamente ridotto di dati etichettati (da decine a centinaia di campioni) per ottenere risultati di classificazione di alta qualità. Poiché gli incorporamenti includono il contesto spettrale, spaziale e temporale, classificatori semplici come k-Nearest Neighbors (kNN) o Random Forest possono utilizzare i vettori di incorporamento per classificare paesaggi complessi in classi target.
In questo tutorial impareremo a utilizzare un approccio di apprendimento supervisionato utilizzando il classificatore k-NN per classificare le mangrovie utilizzando l'incorporamento satellitare.
Seleziona una regione
Iniziamo definendo una regione di interesse. Per questo tutorial, sceglieremo una regione lungo la costa keniota 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à salvato come variabile di geometria nelle importazioni.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Figura: selezione dell'area di interesse per la classificazione delle mangrovie
Raccogliere campioni di addestramento
I flussi di lavoro di classificazione con l'incorporamento satellitare richiedono solo una manciata di campioni etichettati per ottenere risultati relativamente accurati. Per la classificazione della copertura del suolo, è più semplice inserire punti ed etichettarli in Earth Engine per creare i campioni di addestramento. Creeremo una classificazione a tre classi che classificherà ogni pixel dell'incorporamento del satellite in una delle tre classi seguenti:
Classe di copertura del suolo | Descrizione | Valore della classe |
---|---|---|
mangrovie | Tutte le specie di vegetazione costiera tollerante al sale | 1 |
acqua | Tutta l'acqua di superficie: laghi, stagni, fiumi, oceani e così via. | 2 |
altro | Tutte le altre superfici, tra cui terreno edificato, esposto, sabbia, colture, alberi e così via. | 3 |
Per consentirci di etichettare correttamente i punti, creiamo e carichiamo prima un composito Sentinel-2 senza nuvole. Scegliamo una visualizzazione a falsi colori che evidenzia la differenza tra acqua, vegetazione e superfici edificate, consentendoci di selezionare facilmente campioni appropriati.
// Pick a year for classification
var year = 2020;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');
// Create a Sentinel-2 composite for the selected year
// for selecting training samples
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED');
var filteredS2 = s2
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));
// Use the Cloud Score+ collection for cloud masking
var csPlus = ee.ImageCollection('GOOGLE/CLOUD_SCORE_PLUS/V1/S2_HARMONIZED');
var csPlusBands = csPlus.first().bandNames();
var filteredS2WithCs = filteredS2.linkCollection(csPlus, csPlusBands);
function maskLowQA(image) {
var qaBand = 'cs';
var clearThreshold = 0.6;
var mask = image.select(qaBand).gte(clearThreshold);
return image.updateMask(mask);
}
var filteredS2Masked = filteredS2WithCs
.map(maskLowQA)
.select('B.*');
// Create a median composite of cloud-masked images
var composite = filteredS2Masked.median();
// Display the input composite
var swirVis = {min: 300, max: 4000, bands: ['B11', 'B8', 'B4']};
Map.centerObject(geometry);
Map.addLayer(composite.clip(geometry), swirVis, 'S2 Composite (False Color)');
Figura: composito a falsi colori di Sentinel-2
Ora abbiamo un'immagine di riferimento dell'anno target che può essere utilizzata per etichettare i campioni per la classificazione. Innanzitutto, configureremo i livelli per la raccolta dei campioni. Apri la sezione Importazioni di geometria e fai clic su + Nuovo livello.
Figura: creazione di un nuovo livello
Fai clic su Modifica proprietà livello (icona a forma di ingranaggio) accanto al nuovo livello e configuralo come mostrato di seguito. Inserisci il nome del livello come mangroves
e modifica il tipo in FeatureCollection
. Fai clic su + Proprietà e aggiungi una nuova proprietà landcover
con il valore 1
. Cambia il colore in una tonalità di verde e fai clic su OK.
Figura: configurazione delle proprietà del livello per il livello delle mangrovie
Allo stesso modo, aggiungi due nuovi livelli per le altre classi. Utilizza il valore landcover
2
per l'acqua e 3
per altro.
Figura: configurazione delle proprietà del livello per (a sinistra) l'acqua e (a destra) altri livelli
Una volta configurati i livelli, possiamo iniziare a raccogliere i campioni. Aumenta lo zoom di una regione e identifica visivamente i pixel di classi diverse. Seleziona il livello mangroves
e utilizza lo strumento Aggiungi un indicatore per posizionare punti sui pixel appartenenti alle foreste di mangrovie, che tendono ad apparire come un verde di tonalità media nel nostro composito Sentinel-2 in falsi colori (e puoi anche controllare la visualizzazione della mappa di base satellitare come riferimento). Non sono necessari molti punti per la classificazione con il set di dati Satellite Embedding. È più importante selezionare esempi di alta qualità che rappresentino la variabilità all'interno della regione di interesse. Per questo tutorial, un insieme di 10 campioni dovrebbe essere sufficiente.
Figura: raccolta di campioni per la classe Mangrovie
Poi passa al livello water
e raccogli campioni per i pixel di acqua di superficie, che appaiono quasi neri nella nostra composizione Sentinel-2 a causa del forte assorbimento delle bande SWIR per l'acqua aperta. Ripeti la procedura per il livello other
, selezionando esempi che non siano chiaramente né mangrove
né water
.
Figura: raccolta di campioni per l'acqua e altre classi
La raccolta dei campioni di addestramento è ora completata. Possiamo unire le tre FeatureCollection individuali in un'unica raccolta di punti di controllo a terra (GCP).
var gcps = mangroves.merge(water).merge(other);
Addestrare un classificatore
Ora siamo pronti per addestrare un classificatore. Carichiamo il set di dati Satellite Embedding, filtriamo le tessere per l'anno e la regione di interesse scelti, creiamo un mosaico e poi campioniamo i vettori di incorporamento per creare un set di dati di addestramento.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
var embeddingsFiltered = embeddings
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));
var embeddingsImage = embeddingsFiltered.mosaic();
// Overlay the samples on the image to get training data.
var training = embeddingsImage.sampleRegions({
collection: gcps,
properties: ['landcover'],
scale: 10
});
print('Training Feature', training.first());
Le funzionalità di addestramento hanno i vettori di incorporamento come proprietà di input e l'etichetta associata come proprietà di classe. Ora possiamo addestrare un classificatore con queste funzionalità estratte. Possiamo scegliere tra una serie di classificatori disponibili in Earth Engine. Una buona scelta per la classificazione low-shot (classificazione che utilizza un numero molto ridotto di esempi, come il nostro), è k-Nearest Neighbors (kNN). In una classificazione kNN, gli esempi etichettati vengono utilizzati per "partizionare" o raggruppare lo spazio di incorporamento, assegnando un'etichetta a ogni pixel in base all'etichetta o alle etichette dei suoi vicini più vicini nello spazio di incorporamento. Addestriamo un classificatore kNN con i nostri dati di addestramento.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Classifica il mosaico di incorporamento satellitare
Ora possiamo utilizzare il classificatore addestrato per prevedere la classe in tutti i pixel del mosaico di incorporamento satellitare.
var classified = embeddingsImage.classify(classifier);
Esportare l'immagine classificata in un asset (facoltativo)
Se stai cercando di classificare una regione di grandi dimensioni, Earth Engine ha bisogno di più tempo di quello consentito nell'ambiente di calcolo interattivo. È consigliabile esportare i risultati intermedi come asset per sfruttare l'ambiente di calcolo batch, che ha limiti più lunghi per l'esecuzione delle attività e dispone di più risorse. In questo modo si superano anche gli errori computation timed out o user memory exceeded quando si lavora con regioni di grandi dimensioni. Esportiamo l'immagine classificata.
// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var classifiedExportImage = 'mangrove_classification';
var classifiedExportImagePath = exportFolder + classifiedExportImage;
Export.image.toAsset({
image: classified.clip(geometry),
description: 'Classified_Image_Export',
assetId: classifiedExportImagePath,
region: geometry,
scale: 10,
maxPixels: 1e10
});
Avvia le attività di esportazione e attendi il completamento prima di procedere. Una volta completata l'attività di esportazione, importiamo nuovamente l'immagine classificata nel nostro codice.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Visualizzare la classificazione
Indipendentemente dal fatto che tu abbia eseguito la classificazione in modo interattivo o l'abbia esportata in un asset, ora avrai una variabile classificata con i risultati della classificazione.
// Choose a 3-color palette
// Assign a color for each class in the following order
// Mangrove, Water, Other
var palette = ['green', 'blue', 'gray'];
Map.addLayer(
classified.clip(geometry),
{min: 1, max: 3, palette: palette},
'Classified Satellite Embeddings Image');
Figura: immagine di incorporamenti satellitari classificati
Creare una mappa delle mangrovie
Abbiamo creato un'immagine classificata con tre classi. Possiamo estrarre i pixel classificati come Mangrovie (classe 1) per creare una mappa delle mangrovie.
// Extract mangroves class
var mangrovesImage = classified.eq(1).selfMask();
var mangroveVis = {min: 0, max: 1, palette: ['green']};
Map.addLayer(mangrovesImage.clip(geometry),
mangroveVis, 'Mangroves Map (Satellite Embedding Classification)');
Figura: mappa delle mangrovie
Convalidare i risultati
Per valutare i nostri risultati, possiamo confrontarli con un set di dati sottoposto a revisione tra pari di alta qualità: Global Mangrove Watch. Questo set di dati è stato derivato dal radar ad apertura sintetica (SAR) in banda L di JAXA e contiene mappe annuali delle mangrovie dal 1996 al 2020. Questo set di dati è disponibile nel catalogo della community GEE, quindi possiamo caricarlo e visualizzarlo facilmente in Earth Engine.
var gmw = ee.ImageCollection(
'projects/earthengine-legacy/assets/projects/sat-io/open-datasets/GMW/extent/GMW_V3');
var gmwFiltered = gmw
.filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.bounds(geometry));
var gmwImage = gmwFiltered.first();
Map.addLayer(gmwImage.clip(geometry),
mangroveVis, 'Mangroves (Global Mangrove Watch)');
Nota che esiste una corrispondenza esatta tra i risultati di Global Mangrove Watch e l'output della classificazione low-shot del set di dati Satellite Embedding. Se passi alla basemap Satellite, vedrai che la classificazione Satellite Embedding ha acquisito anche i dettagli più fini del paesaggio mancanti nella classificazione globale di monitoraggio delle mangrovie.
Prova lo script completo per questo tutorial nell'editor di codice di Earth Engine.