Satellite Embeddings können für Standard-Workflows zur Fernerkundungsklassifizierung verwendet werden. Die Einbettungen wurden speziell für das Low-Shot-Lernen entwickelt. Das bedeutet, dass eine relativ geringe Anzahl von gelabelten Daten (10 bis 100 Beispiele) erforderlich ist, um hochwertige Klassifizierungsergebnisse zu erzielen. Da die Einbettungen spektralen, räumlichen und zeitlichen Kontext enthalten, können einfache Klassifizierer wie k-Nearest Neighbors (kNN) oder Random Forest die Einbettungsvektoren verwenden, um komplexe Landschaften in Zielklassen zu klassifizieren.
In diesem Tutorial erfahren Sie, wie Sie einen Ansatz für überwachtes Lernen mit einem kNN-Klassifikator verwenden, um Mangroven mithilfe der Satelliteneinbettung zu klassifizieren.
Region auswählen
Beginnen wir mit der Definition einer Region of Interest. In diesem Beispiel wählen wir eine Region entlang der kenianischen Küste aus und definieren ein Polygon als Geometrie-Variable. Alternativ können Sie mit den Zeichenwerkzeugen im Code-Editor ein Polygon um den gewünschten Bereich zeichnen. Dieses wird dann als Geometrie-Variable in den Importen gespeichert.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Abbildung: Auswahl des Interessenbereichs für die Mangrovenklassifizierung
Trainingsbeispiele erfassen
Für Klassifizierungs-Workflows mit dem Satellite Embedding sind nur wenige gelabelte Stichproben erforderlich, um relativ genaue Ergebnisse zu erzielen. Für die Klassifizierung der Landbedeckung ist es am einfachsten, Punkte zu setzen und sie in Earth Engine zu labeln, um die Trainingsbeispiele zu erstellen. Wir erstellen eine Klassifizierung mit drei Klassen, bei der jedes Pixel aus dem Satellite Embedding in eine der folgenden drei Klassen eingeteilt wird:
Bodenbedeckungsklasse | Beschreibung | Klassenwert |
---|---|---|
Mangroven | Alle Arten von salztoleranter Küstenvegetation | 1 |
Wasser | Alle Oberflächengewässer – Seen, Teiche, Flüsse, Ozeane usw. | 2 |
Weitere | Alle anderen Oberflächen, einschließlich bebauter Flächen, freiliegender Böden, Sand, Nutzpflanzen, Bäume usw. | 3 |
Damit wir Punkte richtig kennzeichnen können, erstellen wir zuerst ein wolkenfreies Sentinel-2-Composite und laden es. Wir wählen eine Falschfarbenvisualisierung aus, die den Unterschied zwischen Wasser, Vegetation und bebauten Oberflächen hervorhebt, damit wir geeignete Stichproben leicht auswählen können.
// 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)');
Abbildung: Sentinel-2-Falschfarbenkomposit
Wir haben jetzt ein Referenzbild aus dem Zieljahr, das zum Labeln von Stichproben für die Klassifizierung verwendet werden kann. Zuerst konfigurieren wir die Ebenen zum Erfassen von Stichproben. Öffnen Sie den Bereich Geometrieimporte und klicken Sie auf + Neue Ebene.
Abbildung: Neue Ebene erstellen
Klicken Sie neben der neuen Ebene auf „Ebeneneigenschaften bearbeiten“ (Zahnradsymbol) und konfigurieren Sie sie wie unten dargestellt. Geben Sie den Ebenennamen als mangroves
ein und ändern Sie den Typ in FeatureCollection
. Klicken Sie auf + Property und fügen Sie eine neue Property landcover
mit dem Wert 1
hinzu. Ändern Sie die Farbe in einen Grünton und klicken Sie auf „OK“.
Abbildung: Konfigurieren der Layereigenschaften für den Mangroven-Layer
Fügen Sie auf ähnliche Weise zwei neue Ebenen für die anderen Klassen hinzu. Verwenden Sie den landcover
-Wert 2
für Wasser und 3
für andere.
Abbildung: Konfigurieren der Layereigenschaften für (links) Wasser und (rechts) andere Layer
Sobald die Ebenen konfiguriert sind, können wir mit dem Erheben von Stichproben beginnen. Zoomen Sie in eine Region hinein und identifizieren Sie Pixel verschiedener Klassen visuell. Wählen Sie die Ebene mangroves
aus und verwenden Sie das Tool Markierung hinzufügen, um Punkte auf Pixel zu setzen, die zu Mangrovenwäldern gehören. Diese werden in unserem Sentinel-2-Falschfarben-Composite in der Regel als mittelgrün dargestellt. Sie können auch die Satelliten-Grundkarte zur Referenz verwenden. Sie benötigen nicht viele Punkte, wenn Sie mit dem Satellite Embedding-Dataset klassifizieren. Wichtiger ist es, hochwertige Beispiele auszuwählen, die die Variabilität in Ihrer Region von Interesse repräsentieren. Für diese Anleitung reichen 10 Stichproben aus.
Abbildung: Erfassen von Stichproben für die Klasse „Mangroven“
Wechseln Sie als Nächstes zur Ebene water
und sammeln Sie Stichproben für Oberflächenwasser-Pixel, die in unserem Sentinel-2-Composite aufgrund der starken Absorption der SWIR-Bänder für offenes Wasser fast schwarz erscheinen. Wiederholen Sie den Vorgang für die Ebene other
und wählen Sie Beispiele aus, die eindeutig weder mangrove
noch water
sind.
Abbildung: Proben für Wasser und andere Klassen erheben
Die Erfassung der Trainingsbeispiele ist jetzt abgeschlossen. Wir können die drei einzelnen FeatureCollections in einer einzigen Sammlung von Bodenkontrollpunkten zusammenführen.
var gcps = mangroves.merge(water).merge(other);
Klassifikator trainieren
Wir können jetzt einen Klassifikator trainieren. Wir laden das Satellite Embedding-Dataset, filtern nach Kacheln für das ausgewählte Jahr und die ausgewählte Region, erstellen ein Mosaik und ziehen dann Stichproben der Embedding-Vektoren, um ein Trainings-Dataset zu erstellen.
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());
Die Trainings-Features haben die Einbettungsvektoren als Eingabeattribute und das zugehörige Label als Klassenattribut. Wir können jetzt einen Classifier mit diesen extrahierten Merkmalen trainieren. Wir können aus einer Vielzahl von Klassifikatoren in Earth Engine auswählen. Eine gute Wahl für die Low-Shot-Klassifizierung (Klassifizierung mit einer sehr kleinen Anzahl von Beispielen, wie in unserem Beispiel) ist k-Nearest Neighbors (kNN). Bei der kNN-Klassifizierung werden gelabelte Beispiele verwendet, um den Einbettungsraum zu „partitionieren“ oder zu clustern. Jedem Pixel wird ein Label basierend auf dem Label bzw. den Labels seiner nächsten Nachbarn im Einbettungsraum zugewiesen. Wir trainieren jetzt einen kNN-Klassifikator mit unseren Trainingsdaten.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Satelliten-Embedding-Mosaic klassifizieren
Wir können den trainierten Klassifikator nun verwenden, um die Klasse für alle Pixel des Satellite Embedding-Mosaiks vorherzusagen.
var classified = embeddingsImage.classify(classifier);
Klassifiziertes Bild in ein Asset exportieren (optional)
Wenn Sie eine große Region klassifizieren möchten, benötigt Earth Engine mehr Zeit als in der interaktiven Rechenumgebung zulässig ist. Es empfiehlt sich, Zwischenergebnisse als Assets zu exportieren, um die Batch-Computing-Umgebung zu nutzen, die längere Grenzwerte für die Ausführung von Aufgaben und mehr Ressourcen bietet. So lassen sich auch die Fehler computation timed out (Zeitüberschreitung bei der Berechnung) oder user memory exceeded (Arbeitsspeicher des Nutzers überschritten) vermeiden, wenn Sie mit großen Regionen arbeiten. Exportieren wir das klassifizierte Bild.
// 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
});
Starten Sie die Exportaufgaben und warten Sie, bis sie abgeschlossen sind, bevor Sie fortfahren. Sobald der Export abgeschlossen ist, importieren wir das klassifizierte Bild wieder in unseren Code.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Klassifizierung visualisieren
Unabhängig davon, ob Sie die Klassifizierung interaktiv ausgeführt oder in ein Asset exportiert haben, ist jetzt eine klassifizierte Variable mit den Ergebnissen der Klassifizierung verfügbar.
// 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');
Abbildung: Bild mit klassifizierten Satelliteneinbettungen
Mangrovenkarte erstellen
Wir haben ein klassifiziertes Bild mit drei Klassen erstellt. Wir können die als Mangroven (Klasse 1) klassifizierten Pixel extrahieren, um eine Mangrovenkarte zu erstellen.
// 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)');
Abbildung: Karte mit Mangroven
Ergebnisse prüfen
Um unsere Ergebnisse zu bewerten, können wir sie mit einem hochwertigen, von Fachleuten geprüften Datensatz vergleichen: Global Mangrove Watch. Dieser Datensatz wurde aus L-Band-SAR-Daten (Synthetic Aperture Radar) von JAXA abgeleitet und enthält jährliche Mangrovenkarten von 1996 bis 2020. Dieser Datensatz ist im GEE Community Catalog verfügbar. Wir können ihn also ganz einfach in Earth Engine laden und visualisieren.
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)');
Die Ergebnisse der globalen Mangrovenbeobachtung stimmen weitgehend mit der Ausgabe der Low-Shot-Klassifizierung des Satellite Embedding-Datasets überein. Wenn Sie die Grundkarte auf „Satellit“ umstellen, sehen Sie, dass die Klassifizierung der Satelliteneinbettung auch die feineren Details der Landschaft erfasst hat, die in der globalen Mangroven-Klassifizierung fehlen.
Vollständiges Skript für diese Anleitung im Earth Engine-Code-Editor ausprobieren