AlphaEarth Foundations od Google to model osadzania geoprzestrzennego wytrenowany na różnych zbiorach danych obserwacji Ziemi (EO). Model został uruchomiony na rocznych szeregach czasowych obrazów, a uzyskane osadzanie jest dostępne jako zbiór danych gotowy do analizy w Earth Engine. Ten zbiór danych umożliwia użytkownikom tworzenie dowolnej liczby aplikacji do dostrajania lub innych zadań bez uruchamiania kosztownych obliczeniowo modeli głębokiego uczenia. W rezultacie otrzymujemy ogólny zbiór danych, który można wykorzystać do wielu różnych zadań, takich jak:
- Klasyfikacja
- Regresja
- Wykrywanie zmian
- Wyszukiwanie podobieństw
W tym samouczku dowiesz się, jak działają wektory dystrybucyjne, oraz nauczysz się uzyskiwać dostęp do zbioru danych wektorów dystrybucyjnych zdjęć satelitarnych i go wizualizować.
Informacje o wektorach dystrybucyjnych
Wektory dystrybucyjne to sposób na kompresowanie dużych ilości informacji do mniejszego zestawu cech, które reprezentują znaczącą semantykę. Model AlphaEarth Foundations wykorzystuje szeregi czasowe obrazów z czujników, takich jak Sentinel-2, Sentinel-1 i Landsat, i uczy się, jak w unikalny sposób przedstawiać informacje wzajemne między źródłami a celami za pomocą zaledwie 64 liczb (więcej informacji znajdziesz w tym artykule). Strumień danych wejściowych zawiera tysiące pasm obrazów z wielu czujników, a model przyjmuje te dane o dużej liczbie wymiarów i przekształca je w reprezentację o mniejszej liczbie wymiarów.
Dobrym modelem mentalnym, który pomoże Ci zrozumieć, jak działa AlphaEarth Foundations, jest technika zwana analizą głównych składowych (PCA). PCA pomaga też zmniejszyć wymiarowość danych w przypadku aplikacji do uczenia maszynowego. PCA to technika statystyczna, która może skompresować dziesiątki pasm wejściowych do kilku głównych komponentów. AlphaEarth Foundations to model deep learning, który może przyjmować tysiące wymiarów wejściowych wielosensorowych zbiorów danych szeregów czasowych i uczyć się tworzenia 64-pasmowej reprezentacji, która w unikalny sposób rejestruje zmienność przestrzenną i czasową danego piksela.
Pole wektora dystrybucyjnego to ciągła tablica lub „pole” wyuczonych wektorów dystrybucyjnych. Obrazy w kolekcjach pól wektorów dystrybucyjnych reprezentują trajektorie czasowo-przestrzenne obejmujące cały rok i mają 64 pasma (po jednym na każdy wymiar wektora dystrybucyjnego).

Ilustracja: n-wymiarowy wektor dystrybucyjny pobrany z pola wektorów dystrybucyjnych
Dostęp do zbioru danych Satellite Embedding
Zbiór danych osadzania satelitarnego to zbiór obrazów zawierający roczne zdjęcia z lat 2017–2023 (np. 2017, 2018, 2019…). Każdy obraz ma 64 pasma, w których każdy piksel jest wektorem osadzania reprezentującym wielosensorowe dane szeregów czasowych z danego roku.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
Wybierz region
Zacznijmy od zdefiniowania obszaru zainteresowań. W tym samouczku wybierzemy region wokół zbiornika Krishna Raja Sagara (KRS) w Indiach i zdefiniujemy wielokąt jako zmienną geometryczną. Możesz też użyć narzędzi do rysowania w edytorze kodu, aby narysować wielokąt wokół interesującego Cię regionu. Zostanie on zapisany jako zmienna geometry w sekcji Imports.
// 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);

Ilustracja: wybieranie obszaru zainteresowania
Przygotowywanie zbioru danych osadzania satelitarnego
Zdjęcia z każdego roku są podzielone na kafelki, co ułatwia dostęp do nich. Stosujemy filtry i wyszukujemy obrazy z wybranego roku i regionu.
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));
Obrazy osadzone z satelity są dzielone na kafelki o wymiarach do 163 840 m × 163 840 m każdy i wyświetlane w projekcji dla stref UTM danego kafelka. W rezultacie otrzymujemy wiele kafelków z osadzonymi obrazami satelitarnymi obejmujących interesujący nas region. Możemy użyć funkcji mosaic(), aby połączyć kilka kafelków w jeden obraz. Wydrukujmy obraz, aby zobaczyć pasma.
var embeddingsImage = filteredEmbeddings.mosaic();
print('Satellite Embedding Image', embeddingsImage);
Zobaczysz, że obraz ma 64 pasma o nazwach A00, A01, … , A63. Każdy zakres zawiera wartość wektora osadzania dla danego roku w tym wymiarze lub na tej osi. W przeciwieństwie do pasm widmowych lub indeksów poszczególne pasma nie mają niezależnego znaczenia – każde pasmo reprezentuje jedną oś przestrzeni osadzania. Wszystkie 64 pasma będą używane jako dane wejściowe w aplikacjach podrzędnych.

Ilustracja: 64 pasma obrazu osadzonego w satelicie
Wizualizacja zbioru danych Satellite Embedding
Jak widzieliśmy, nasz obraz zawiera 64 pasma. Nie ma łatwego sposobu na wizualizację wszystkich informacji zawartych we wszystkich pasmach, ponieważ możemy wyświetlać tylko kombinację 3 pasm naraz.
Możemy wybrać dowolne 3 pasma, aby wizualizować 3 osie przestrzeni osadzania jako obraz RGB.
var visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A09']};
Map.addLayer(embeddingsImage.clip(geometry), visParams, 'Embeddings Image');

Ilustracja: wizualizacja RGB 3 osi przestrzeni wektorów dystrybucyjnych
Innym sposobem wizualizacji tych informacji jest grupowanie pikseli o podobnych wektorach dystrybucyjnych i wykorzystywanie tych grup do zrozumienia, jak model nauczył się przestrzennej i czasowej zmienności krajobrazu.
Możemy używać technik klastrowania bez nadzoru, aby grupować piksele w 64-wymiarowej przestrzeni w grupy lub „klastry” podobnych wartości. W tym celu najpierw pobieramy próbkę wartości pikseli i trenujemy ee.Clusterer.
var nSamples = 1000;
var training = embeddingsImage.sample({
region: geometry,
scale: 10,
numPixels: nSamples,
seed: 100
});
print(training.first());
Jeśli wydrukujesz wartości pierwszej próbki, zobaczysz, że ma ona 64 wartości pasm określających wektor osadzania dla tego piksela. Wektor reprezentacji właściwościowej ma długość jednostkową (tzn. długość wektora od początku układu współrzędnych (0,0,....0) do wartości wektora wynosi 1).

Ilustracja: wyodrębniony wektor dystrybucyjny
Możemy teraz wytrenować model bez nadzoru, aby pogrupować próbki w odpowiednią liczbę klastrów. Każdy klaster będzie reprezentować piksele o podobnych osadzeniach.
// 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;
};
Możemy teraz podzielić większy obraz osadzony na klastry, aby zobaczyć grupy pikseli o podobnych osadzeniach. Zanim to zrobimy, musimy zrozumieć, że model rejestruje pełną trajektorię czasową każdego piksela w ciągu roku. Oznacza to, że jeśli 2 piksele mają podobne wartości spektralne na wszystkich obrazach, ale w różnych momentach, można je rozdzielić.
Poniżej znajduje się wizualizacja naszego obszaru zainteresowania na podstawie zdjęć z satelity Sentinel-2 z 2024 roku, na których zastosowano maskowanie chmur. Pamiętaj, że wszystkie obrazy (wraz z obrazami z satelitów Sentinel-2, Landsat 8/9 i wielu innych sensorów) zostały wykorzystane do wygenerowania ostatecznych wektorów.

Ilustracja: roczne szeregi czasowe Sentinel-2 dla naszego regionu
Wyświetlmy obrazy osadzone satelitarne, dzieląc krajobraz na 3 klastry.
var cluster3 = getClusters(3);
Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3 clusters');

Ilustracja: osadzanie satelitarne z 3 grupami
Zauważysz, że powstałe klastry mają bardzo wyraźne granice. Dzieje się tak, ponieważ wektory dystrybucyjne z natury zawierają kontekst przestrzenny – piksele w ramach tego samego obiektu powinny mieć stosunkowo podobne wektory dystrybucyjne. Jeden z klastrów obejmuje też obszary z sezonową wodą wokół głównego zbiornika. Wynika to z kontekstu czasowego, który jest rejestrowany w wektorze osadzania, co pozwala nam wykrywać takie piksele o podobnych wzorcach czasowych.
Sprawdźmy, czy możemy jeszcze bardziej doprecyzować klastry, grupując piksele w 5 klastrów.
var cluster5 = getClusters(5);
Map.addLayer(cluster5.randomVisualizer().clip(geometry), {}, '5 clusters');

Ilustracja: osadzanie satelitarne z 5 grupami
Możemy kontynuować i dopracowywać obrazy, dzieląc je na bardziej wyspecjalizowane grupy, zwiększając liczbę klastrów. Tak wygląda obraz z 10 klastrami.
var cluster10 = getClusters(10);
Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, '10 clusters');

Ilustracja: osadzony obraz satelitarny z 10 grupami
Pojawia się wiele szczegółów i widzimy, że różne rodzaje upraw są grupowane w różne klastry. Osadzanie danych satelitarnych rejestruje fenologię upraw wraz ze zmiennymi klimatycznymi, dlatego dobrze nadaje się do mapowania typów upraw. W kolejnym samouczku (klasyfikacja bez nadzoru) pokażemy, jak utworzyć mapę typów upraw na podstawie danych o osadzaniu satelitarnym przy użyciu niewielkiej liczby etykiet na poziomie pola lub bez nich.
Wypróbuj pełny skrypt z tego samouczka w edytorze kodu Earth Engine