Les embeddings satellite peuvent être utilisés pour les workflows de classification de télédétection standards. Les embeddings ont été spécifiquement conçus pour exceller dans l'apprentissage à faible coup, ce qui signifie qu'un nombre relativement faible de données étiquetées (de l'ordre de quelques dizaines à quelques centaines d'échantillons) est nécessaire pour obtenir des résultats de classification de haute qualité. Comme les embeddings incluent un contexte spectral, spatial et temporel, des classificateurs simples tels que k-Nearest Neighbors (kNN) ou Random Forest peuvent utiliser les vecteurs d'embedding pour classer des paysages complexes dans des classes cibles.
Dans ce tutoriel, nous allons apprendre à utiliser une approche d'apprentissage supervisé à l'aide du classificateur kNN pour classer les mangroves à l'aide de l'intégration de satellites.
Sélectionnez une région
Commençons par définir une région d'intérêt. Pour ce tutoriel, nous allons choisir une région le long de la côte kényane et définir un polygone comme variable de géométrie. Vous pouvez également utiliser les outils de dessin de l'éditeur de code pour dessiner un polygone autour de la région d'intérêt, qui sera enregistré en tant que variable de géométrie dans les importations.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Figure : Sélection de la zone d'intérêt pour la classification des mangroves
Collecter des exemples d'entraînement
Les workflows de classification avec l'embedding satellite ne nécessitent qu'une poignée d'échantillons étiquetés pour obtenir des résultats relativement précis. Pour notre classification de la couverture terrestre, le plus simple est de déposer des points et de les libeller dans Earth Engine pour créer les échantillons d'entraînement. Nous allons créer une classification à trois classes qui classera chaque pixel de l'embedding satellite dans l'une des trois classes suivantes :
Classe de couverture du sol | Description | Valeur de classe |
---|---|---|
mangroves | Toutes les espèces de végétation côtière tolérant le sel | 1 |
eau | Toutes les eaux de surface (lacs, étangs, rivières, océans, etc.) | 2 |
autre | Toutes les autres surfaces, y compris les surfaces construites, les sols à nu, le sable, les cultures, les arbres, etc. | 3 |
Pour nous permettre d'étiqueter correctement les points, nous allons d'abord créer un composite Sentinel-2 sans nuages et le charger. Nous choisissons une visualisation en fausses couleurs qui met en évidence la différence entre l'eau, la végétation et les surfaces construites, ce qui nous permet de choisir facilement des échantillons appropriés.
// 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)');
Figure : Composite en fausses couleurs Sentinel-2
Nous disposons désormais d'une image de référence de l'année cible qui peut être utilisée pour étiqueter des échantillons à des fins de classification. Nous allons d'abord configurer les calques pour collecter des échantillons. Ouvrez la section Importations de géométrie, puis cliquez sur + Nouveau calque.
Figure : Créer un calque
Cliquez sur "Modifier les propriétés du calque" (icône en forme de roue dentée) à côté du nouveau calque et configurez-le comme indiqué ci-dessous. Saisissez mangroves
comme nom de calque et définissez le type sur FeatureCollection
. Cliquez sur + Propriété, puis ajoutez une propriété landcover
avec la valeur 1
. Choisissez une nuance de vert, puis cliquez sur OK.
Figure : Configuration des propriétés du calque de mangroves
De même, ajoutez deux nouvelles couches pour les autres classes. Utilisez la valeur landcover
2
pour l'eau et 3
pour les autres.
Figure : Configuration des propriétés des calques pour (à gauche) l'eau et (à droite) les autres calques
Une fois les calques configurés, nous pouvons commencer à collecter des échantillons. Faites un zoom avant sur une région et identifiez visuellement les pixels de différentes classes. Sélectionnez le calque mangroves
et utilisez l'outil Ajouter un repère pour placer des points sur les pixels appartenant aux mangroves, qui ont tendance à apparaître en vert moyen dans notre composite Sentinel-2 en fausses couleurs (vous pouvez également consulter la vue de la carte de base satellite pour référence). Vous n'avez pas besoin de nombreux points lorsque vous classez des données avec l'ensemble de données d'intégration satellite. Il est plus important de sélectionner des exemples de haute qualité qui représentent la variabilité dans votre région d'intérêt. Pour ce tutoriel, un ensemble de 10 échantillons devrait suffire.
Figure : Collecte d'échantillons pour la classe "mangroves"
Ensuite, passez au calque water
et collectez des échantillons pour les pixels d'eau de surface, qui apparaissent presque noirs dans notre composite Sentinel-2 en raison de la forte absorption des bandes SWIR pour les eaux libres. Répétez la procédure pour le calque other
, en sélectionnant des exemples qui ne sont clairement ni mangrove
ni water
.
Figure : Collecte d'échantillons pour l'eau et d'autres classes
La collecte d'exemples d'entraînement est maintenant terminée. Nous pouvons fusionner les trois FeatureCollections individuels en une seule collection de points de contrôle au sol (gcps).
var gcps = mangroves.merge(water).merge(other);
Entraîner un classificateur
Nous sommes maintenant prêts à entraîner un classificateur. Nous chargeons l'ensemble de données Satellite Embedding, filtrons les tuiles pour l'année et la région d'intérêt choisies, créons une mosaïque, puis échantillonnons les vecteurs d'embedding pour créer un ensemble de données d'entraînement.
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());
Les caractéristiques d'entraînement ont les vecteurs d'embedding comme propriétés d'entrée et le libellé associé comme propriété de classe. Nous pouvons maintenant entraîner un classificateur avec ces caractéristiques extraites. Nous pouvons choisir parmi différents classificateurs disponibles dans Earth Engine. Pour la classification low-shot (classification utilisant un très petit nombre d'exemples, comme dans notre exemple), le meilleur choix est k-Nearest Neighbors (kNN). Dans une classification kNN, des exemples étiquetés sont utilisés pour "partitionner" ou regrouper l'espace d'intégration, en attribuant une étiquette à chaque pixel en fonction de la ou des étiquettes de ses voisins les plus proches dans l'espace d'intégration. Entraînons un classificateur kNN avec nos données d'entraînement.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Classer la mosaïque d'intégration satellite
Nous pouvons maintenant utiliser le classificateur entraîné pour prédire la classe de tous les pixels de la mosaïque d'intégration satellite.
var classified = embeddingsImage.classify(classifier);
Exporter l'image classifiée vers un élément (facultatif)
Si vous essayez de classer une grande région, Earth Engine a besoin de plus de temps que ce qui est autorisé dans l'environnement de calcul interactif. Il est recommandé d'exporter les résultats intermédiaires en tant qu'éléments pour exploiter l'environnement de calcul par lot, qui offre des limites plus longues pour l'exécution des tâches et dispose de plus de ressources. Cela permet également de surmonter les erreurs Computation timed out (Délai de calcul dépassé) ou User memory exceeded (Mémoire utilisateur dépassée) lorsque vous travaillez avec de grandes régions. Exportons l'image classifiée.
// 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
});
Lancez les tâches d'exportation et attendez qu'elles soient terminées avant de continuer. Une fois la tâche d'exportation terminée, nous importons l'image classifiée dans notre code.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Visualiser la classification
Que vous ayez exécuté votre classification de manière interactive ou que vous l'ayez exportée vers un élément, vous disposez désormais d'une variable classifiée contenant les résultats de votre classification.
// 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');
Figure : Image des embeddings satellite classifiés
Créer une carte de mangroves
Nous avons créé une image classifiée avec trois classes. Nous pouvons extraire les pixels classés comme mangroves (classe 1) pour créer une carte des mangroves.
// 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)');
Figure : Carte des mangroves
Valider les résultats
Pour évaluer nos résultats, nous pouvons les comparer à un ensemble de données de haute qualité évalué par des pairs : Global Mangrove Watch. Cet ensemble de données est dérivé du radar à synthèse d'ouverture (SAR) en bande L de la JAXA et contient des cartes annuelles des mangroves de 1996 à 2020. Cet ensemble de données est disponible dans le catalogue de la communauté GEE. Nous pouvons donc le charger et le visualiser facilement dans 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)');
Notez qu'il existe une forte correspondance entre les résultats de la surveillance mondiale des mangroves et la sortie de la classification low-shot de l'ensemble de données Satellite Embedding. Si vous passez à la carte de base satellite, vous verrez que la classification de l'intégration satellite a également capturé les détails plus fins du paysage qui manquent dans la classification mondiale de surveillance des mangroves.
Essayez le script complet de ce tutoriel dans l'éditeur de code Earth Engine.