Klasyfikacja nadzorowana z użyciem zbioru danych z osadzaniem satelitarnym

Edytuj w GitHubie
Zgłoś problem
Historia strony
Ten samouczek jest częścią serii samouczków dotyczących zbioru danych Satellite Embedding. Zobacz też Wprowadzenie, klasyfikację bez nadzoru, regresję i wyszukiwanie podobieństw.

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