Ähnlichkeitssuche mit dem Satellite Embedding-Dataset

Auf GitHub bearbeiten
Problem melden
Seitenverlauf
Diese Anleitung ist Teil einer Reihe von Anleitungen zum Satellite Embedding-Dataset. Siehe auch Einführung, Unbeaufsichtigte Klassifizierung, Beaufsichtigte Klassifizierung und Regression.

Einbettungen bieten eine einzigartige Möglichkeit, mit Erdbeobachtungsdaten ähnliche Orte und Features zu finden. Durch den Vergleich des Einbettungsvektors eines Referenzstandorts mit den Einbettungsvektoren aller anderen Pixel eines Einbettungsbildes können wir Standorte finden, die ähnliche Eigenschaften wie der Referenzstandort aufweisen. So können wir in der Praxis ganz einfach Objekte oder bestimmte Arten von Websites in unserer Region von Interesse finden.

In dieser Anleitung versuchen wir, alle Getreidesilos in einer Region zu finden. Getreidesilos oder Getreidebehälter sind hohe Strukturen, die häufig für die Massenlagerung von Getreide verwendet werden. Sie sind auf Bauernhöfen oder in Verarbeitungsbetrieben zu finden. Die Kartierung dieser Strukturen wäre mit herkömmlichen Fernerkundungsmethoden schwierig und würde das Trainieren eines benutzerdefinierten Modells zur Objekterkennung erfordern. Da Silos eine einzigartige Form und Struktur haben und in der Regel aus ähnlichen Materialien bestehen, werden sie in den Satelliteneinbettungsbildern mit eindeutigen Einbettungsvektoren dargestellt. So können wir sie mit einer einfachen Ähnlichkeitssuche finden.


Getreidesilos (Bild: Wikipedia)

Suchregion auswählen

In dieser Anleitung werden die Getreidesilos in Franklin County, Kansas, kartiert. Wir wenden einen Filter an und wählen das Polygon für diesen Bezirk aus.

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');


Abbildung: Ausgewählte Region

Referenzstandorte auswählen

Zuerst markieren wir die Position eines oder mehrerer Getreidesilos. Im Code-Editor können Sie die Satelliten-Grundkarte verwenden, mit der sich Objekte leicht finden lassen.

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

Wenn Sie den Ort des gewünschten Objekts gefunden haben, verwenden Sie das Tool „Markierung hinzufügen“ aus den Zeichenwerkzeugen, um einen Punkt zu setzen und ihn als Referenzort zu markieren.


Abbildung: Referenzstandort hinzufügen

Oft reicht ein einziger Standort aus, aber einige weitere Beispiele helfen, falsch positive Ergebnisse zu reduzieren (in diesem Fall Standorte, die als Getreidesilos identifiziert werden, aber keine sind). Wir ändern den Geometrietyp in „FeatureCollection“, damit wir mehrere Referenzpunkte hinzufügen können. Klicken Sie neben der Geometrie auf die Schaltfläche Layereigenschaften bearbeiten. Ändern Sie den Ebenennamen in samples und legen Sie den Importtyp auf FeatureCollection fest. Klicken Sie auf "OK".


Abbildung: Ebene „Stichproben“ konfigurieren

Fügen Sie im Hauptfenster des Code-Editors weitere Punkte an einigen repräsentativen Stellen hinzu.


Abbildung: Weitere Referenzstandorte hinzufügen

Für diese Anleitung haben wir drei Referenzstandorte ausgewählt. Diese werden verwendet, um die Einbettungsvektoren aus Satellite Embedding-Bildern zu extrahieren.

Zeitraum auswählen

Wählen Sie ein Jahr aus, für das die Suche ausgeführt werden soll.

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

Satellite Embedding-Dataset filtern und mosaizieren

Wir laden das Dataset „Satellite Embedding“, filtern nach Bildern für das ausgewählte Jahr und erstellen ein Mosaik.

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

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

Einbettungsvektor aus den Beispielen extrahieren

Wir nehmen an den Referenzorten Stichproben des Mosaiks, um den mit diesen Punkten verknüpften Einbettungsvektor zu erhalten. Außerdem müssen wir den Maßstab auswählen, auf dem wir den Einbettungsvektor extrahieren und vergleichen möchten. Eine sehr praktische Eigenschaft der Einbettungen in Satellite Embedding ist, dass sie linear zusammengesetzt werden können. Das bedeutet, dass sie aggregiert oder pyramidenförmig dargestellt werden können, ohne dass sich die Distanzbeziehungen und die interpretierte Bedeutung ändern. Wenn wir einen räumlichen Durchschnitt über 2 × 2 Pixel berechnen, stellt das Ergebnis das Einbetten eines größeren Pixels mit niedrigerer Auflösung dar. Die native Auflösung für Satellite Embedding beträgt 10 m. Das ist ein guter Maßstab, um kleine Objekte wie Getreidesilos zu identifizieren. Wenn Sie jedoch nach größeren Objekten oder Orten suchen, können Sie einen größeren Wert verwenden (z.B. 20 m, 1.000 m), um Objekte in gröberen Maßstäben abzugleichen.

// 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
});

Ähnlichkeit berechnen

Wenn wir das Skalarprodukt zwischen zwei Einbettungsvektoren berechnen, können wir ihre Ähnlichkeit ermitteln. Das Skalarprodukt reduziert die Länge von zwei Vektoren und den Winkel zwischen ihnen auf eine einzelne Zahl. Da Einbettungsvektoren in unserem Fall eine Einheitslänge haben, entspricht das Ergebnis nur dem Winkel zwischen den Vektoren.

Wir können einfach zwei 64D-Einbettungsvektoren mit Einheitslänge multiplizieren und die Produkte summieren, um den Kosinus des Winkels zwischen den Vektoren (auch als „Punktprodukt“ bezeichnet) zu erhalten. Wir berechnen ein Bild pro Referenzort und bilden den Mittelwert des Ergebnisses, um ein Bild mit Pixelwerten des Skalarprodukts zu erhalten.

// 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();

Pixel mit einem Punktprodukt nahe 1 haben relativ ähnliche Einbettungsvektoren (Winkel zwischen ihnen nahe 0), während Punktprodukte nahe -1 auf eine größere Abweichung zwischen Vektoren hinweisen (orthogonal zur entgegengesetzten Richtung). Wir können die Ergebnisse visualisieren, indem wir das Bild mit der durchschnittlichen Entfernung auf der Karte einblenden.

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);


Abbildung: Ähnlichkeit von Pixeln um einen Referenzpunkt – hellere Bereiche sind ähnlicher

Passende Orte extrahieren

Im nächsten Schritt müssen wir einen Schwellenwert definieren und Standorte mit unserem Zielobjekt extrahieren. Alle Pixel mit Getreidesilos haben Einbettungsvektoren, die dem Referenzeinbettungsvektor sehr ähnlich sind. Der Winkel zwischen ihnen liegt nahe bei 1. Wir definieren einen Schwellenwert, um alle entsprechenden Pixel in der Region zu finden. Die richtige Schwelle hängt vom Objekt ab, nach dem Sie suchen, und vom Maßstab. Sie können mit verschiedenen Werten experimentieren, um herauszufinden, welcher für Ihre Anwendung am besten geeignet ist.

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

Das Ergebnis ist ein binäres Bild mit Pixeln, deren Ähnlichkeitswerte unter dem Schwellenwert liegen. Das resultierende Bild wird nun in Polygone umgewandelt.

// 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
});

Jedes Polygon stellt einen Standort dar, der mit den Referenzstandorten übereinstimmt. Wir können den Schwerpunkt verwenden, um den abgeglichenen Standort darzustellen.

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

Abgleiche in ein Asset exportieren (optional)

Die Vektorisierung ist ein speicher- und rechenintensiver Vorgang in Earth Engine. Um Zeitüberschreitung bei der Berechnung oder Kachelfehler bei der Visualisierung der Ergebnisse zu vermeiden, empfiehlt es sich, die Ergebnisse als Asset zu exportieren. Nach dem Export kann das Asset in das Script importiert und visualisiert werden. Mit dieser Methode können Sie die Suche auch problemlos auf große Gebiete ausweiten.

// 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
});

Starten Sie die Exportaufgaben und warten Sie, bis sie abgeschlossen sind, bevor Sie fortfahren. Sobald der Export abgeschlossen ist, importieren wir die Übereinstimmungen wieder in unseren Code.

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

Übereinstimmungen visualisieren

Unabhängig davon, ob Sie die Übereinstimmungen interaktiv extrahiert oder in eine Feature-Sammlung exportiert haben, haben Sie jetzt eine predictedMatches-Variable mit den vorhergesagten Übereinstimmungen mit den Referenzstandorten im Suchbereich. Sehen wir uns das einmal genauer an.

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

Ergebnisse prüfen

Um die Ergebnisse zu bewerten, können Sie in jede vorhergesagte Übereinstimmung hineinzoomen, um zu sehen, ob sich an diesem Ort ein Getreidesilo befindet. Sie werden feststellen, dass viele Übereinstimmungen Getreidesilos korrekt identifiziert haben.


Abbildung: Korrekt identifizierte Standorte mit Getreidesilos

Die Ergebnisse enthalten auch einige fälschlicherweise markierte Einträge. Die Übereinstimmungen haben viele ähnliche Merkmale wie unser Referenzstandort und daher ähnliche Einbettungsvektoren.


Abbildung: Falsch positive Übereinstimmungen

Um die Ergebnisse zu verbessern, können Sie die Referenzstandorte und den ausgewählten Grenzwert anpassen.

Vollständiges Skript für diese Anleitung im Earth Engine-Code-Editor ausprobieren