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 osadzania są 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 satelitów 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, w tym 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 artykule). Strumień danych wejściowych zawiera tysiące pasm obrazów z wielu czujników, a model przetwarza te dane o dużej liczbie wymiarów na 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 learningu, który może przyjmować tysiące wymiarów wejściowych wieloczujnikowych 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 zainteresowania. 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 interesującego Cię regionu
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 i wyświetlane w projekcji dla stref UTM danego kafelka. W rezultacie otrzymujemy wiele kafelków z osadzonymi danymi 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żyć technik klastrowania bez nadzoru, aby pogrupować 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 grupować większe obrazy z osadzonymi danymi, aby zobaczyć grupy pikseli o podobnych osadzonych danych. 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 chmury zostały zamaskowane. 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. Dzieje się tak ze względu na kontekst czasowy, 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: osadzony obraz satelitarny 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 następnym 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 tego samouczka w edytorze kodu Earth Engine