Osadzanie danych satelitarnych można wykorzystywać w standardowych przepływach pracy związanych z klasyfikacją teledetekcyjną. Osadzanie zostało zaprojektowane specjalnie z myślą o uczeniu z niewielką liczbą przykładów, co oznacza, że do uzyskania wysokiej jakości wyników klasyfikacji wymagana jest stosunkowo niewielka liczba oznaczonych danych (od kilkudziesięciu do kilkuset próbek). Wektory dystrybucyjne zawierają kontekst spektralny, przestrzenny i czasowy, więc proste klasyfikatory, takie jak k-najbliższych sąsiadów (kNN) lub las losowy, mogą używać wektorów dystrybucyjnych do klasyfikowania złożonych krajobrazów w klasach docelowych.
Z tego samouczka dowiesz się, jak używać podejścia uczenia nadzorowanego z klasyfikatorem kNN do klasyfikowania lasów namorzynowych za pomocą osadzania satelitarnego.
Wybierz region
Zacznijmy od zdefiniowania obszaru zainteresowania. W tym samouczku wybierzemy region wzdłuż wybrzeża Kenii 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 geometryczna w sekcji Imports (Importy).
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Ilustracja: wybieranie obszaru zainteresowania na potrzeby klasyfikacji lasów namorzynowych
Zbieranie próbek treningowych
Przepływy pracy klasyfikacji z osadzaniem satelitarnym wymagają tylko kilku oznaczonych próbek, aby uzyskać stosunkowo dokładne wyniki. W przypadku klasyfikacji pokrycia terenu najłatwiej jest upuścić punkty i oznaczyć je w Earth Engine, aby utworzyć próbki szkoleniowe. Utworzymy klasyfikację 3-klasową, która przypisze każdy piksel z osadzania satelitarnego do jednej z tych 3 klas:
Klasa pokrycia terenu | Opis | Wartość klasy |
---|---|---|
mangrowce, | Wszystkie gatunki roślin przybrzeżnych odpornych na sól | 1 |
woda | Wszystkie wody powierzchniowe – jeziora, stawy, rzeki, oceany itp. | 2 |
inne | Wszystkie inne powierzchnie, w tym zabudowane, odkryta gleba, piasek, uprawy, drzewa itp. | 3 |
Abyśmy mogli prawidłowo oznaczać punkty, najpierw tworzymy i wczytujemy kompozycję bez chmur z danych z satelity Sentinel-2. Wybieramy wizualizację w fałszywych kolorach, która podkreśla różnicę między wodą, roślinnością i powierzchniami zabudowanymi, co pozwala nam łatwo wybrać odpowiednie próbki.
// 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)');
Ilustracja: kompozycja w fałszywych kolorach z satelity Sentinel-2
Mamy teraz obraz referencyjny z roku docelowego, którego możemy użyć do etykietowania próbek na potrzeby klasyfikacji. Najpierw skonfigurujemy warstwy do zbierania próbek. Otwórz sekcję Importy geometrii i kliknij + nowa warstwa.
Ilustracja: tworzenie nowej warstwy
Kliknij Edytuj właściwości warstwy (ikona koła zębatego) obok nowej warstwy i skonfiguruj ją tak, jak pokazano poniżej. Wpisz nazwę warstwy jako mangroves
i zmień typ na FeatureCollection
. Kliknij + Usługa i dodaj nową usługę landcover
o wartości 1
. Zmień kolor na odcień zieleni i kliknij OK.
Ilustracja: konfigurowanie właściwości warstwy mangrowców
Podobnie dodaj 2 nowe warstwy dla pozostałych klas. Użyj wartości landcover
2
w przypadku wody i 3
w przypadku innych produktów.
Ilustracja: konfigurowanie właściwości warstwy dla (po lewej) wody i (po prawej) innych warstw
Po skonfigurowaniu warstw możemy rozpocząć zbieranie próbek. Powiększ region i wizualnie zidentyfikuj piksele różnych klas. Wybierz warstwę mangroves
i użyj narzędzia Dodaj znacznik, aby umieścić punkty na pikselach należących do lasów namorzynowych, które na naszej kompozycji w fałszywych kolorach z satelity Sentinel-2 zwykle mają średnio nasycony zielony kolor (możesz też sprawdzić widok mapy bazowej z satelity). W przypadku klasyfikacji za pomocą zbioru danych Satellite Embedding nie potrzebujesz wielu punktów. Ważniejsze jest wybranie przykładów wysokiej jakości, które reprezentują zmienność w interesującym Cię regionie. Na potrzeby tego samouczka wystarczy zestaw 10 próbek.
Ilustracja: zbieranie próbek na zajęcia dotyczące lasów namorzynowych
Następnie przejdź do warstwy water
i zbierz próbki pikseli wód powierzchniowych, które w naszym kompozycie Sentinel-2 są prawie czarne ze względu na silną absorpcję pasm SWIR w przypadku otwartych wód. Powtórz ten proces w przypadku warstwy other
, wybierając przykłady, które wyraźnie nie są ani mangrove
, ani water
.
Ilustracja: pobieranie próbek wody i innych klas
Zbieranie próbek treningowych zostało zakończone. Możemy scalić 3 kolekcje cech w jedną kolekcję punktów kontrolnych (gcps).
var gcps = mangroves.merge(water).merge(other);
Trenowanie klasyfikatora
Możemy teraz wytrenować klasyfikator. Wczytujemy zbiór danych Satellite Embedding, filtrujemy kafelki dla wybranego roku i regionu, tworzymy mozaikę, a następnie pobieramy wektory osadzania, aby utworzyć zbiór danych treningowych.
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());
Funkcje trenowania mają wektory dystrybucyjne jako właściwości wejściowe, a powiązaną etykietę jako właściwość klasy. Możemy teraz wytrenować klasyfikator na podstawie wyodrębnionych cech. Możemy wybierać spośród różnych klasyfikatorów dostępnych w Earth Engine. W przypadku klasyfikacji z małą liczbą przykładów (klasyfikacji z użyciem bardzo małej liczby przykładów, takiej jak w naszym przykładzie) dobrym wyborem jest algorytm k-najbliższych sąsiadów (kNN). W klasyfikacji kNN przykłady z etykietami są używane do „podziału” lub klastrowania przestrzeni osadzania, przypisując etykietę do każdego piksela na podstawie etykiet najbliższych sąsiadów w przestrzeni osadzania. Wytrenujmy klasyfikator kNN na podstawie naszych danych treningowych.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Klasyfikowanie mozaiki osadzenia satelitarnego
Możemy teraz użyć wytrenowanego klasyfikatora do przewidywania klasy na wszystkich pikselach mozaiki osadzenia satelitarnego.
var classified = embeddingsImage.classify(classifier);
Eksportowanie sklasyfikowanego obrazu do komponentu (opcjonalnie)
Jeśli próbujesz sklasyfikować duży region, Earth Engine potrzebuje więcej czasu niż ten, który jest dozwolony w interaktywnym środowisku obliczeniowym. Dobrym rozwiązaniem jest eksportowanie wyników pośrednich jako zasobów, aby korzystać ze środowiska przetwarzania wsadowego, które ma dłuższe limity wykonywania zadań i więcej zasobów. Pomaga to również uniknąć błędów przekroczenia limitu czasu obliczeń lub przekroczenia pamięci użytkownika podczas pracy z dużymi regionami. Wyeksportujmy sklasyfikowany obraz.
// 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
});
Rozpocznij zadania eksportowania i poczekaj na ich zakończenie, zanim przejdziesz dalej. Po zakończeniu zadania eksportu importujemy sklasyfikowany obraz z powrotem do naszego kodu.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Wizualizacja klasyfikacji
Niezależnie od tego, czy klasyfikację przeprowadzono interaktywnie, czy wyeksportowano do zasobu, będziesz mieć teraz sklasyfikowaną zmienną z wynikami klasyfikacji.
// 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');
Ilustracja: obraz z klasyfikacją osadzania zdjęć satelitarnych
Tworzenie mapy lasów namorzynowych
Utworzyliśmy sklasyfikowany obraz z 3 klasami. Możemy wyodrębnić piksele zaklasyfikowane jako lasy namorzynowe (klasa 1), aby utworzyć mapę tych lasów.
// 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)');
Ilustracja: mapa namorzynów
Weryfikowanie wyników
Aby ocenić nasze wyniki, możemy porównać je z wysokiej jakości zbiorem danych poddanym recenzji: Global Mangrove Watch. Ten zbiór danych pochodzi z radaru z syntetyczną aperturą (SAR) w paśmie L, który jest obsługiwany przez JAXA. Zawiera roczne mapy lasów namorzynowych z lat 1996–2020. Ten zbiór danych jest dostępny w katalogu społeczności GEE, więc możemy go łatwo wczytać i wizualizować w 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)');
Zauważ, że wyniki globalnego monitorowania lasów namorzynowych są bardzo podobne do wyników klasyfikacji zbioru danych Satellite Embedding z użyciem małej liczby przykładów. Jeśli zmienisz mapę bazową na satelitarną, zobaczysz, że klasyfikacja osadzania satelitarnego uwzględnia też drobniejsze szczegóły krajobrazu, których brakuje w globalnej klasyfikacji obserwacji namorzynów.
Wypróbuj pełny skrypt tego samouczka w edytorze kodu Earth Engine