AlphaEarth Foundations de Google est un modèle d'intégration géospatiale entraîné sur divers ensembles de données d'observation de la Terre (OT). Le modèle a été exécuté sur des séries temporelles annuelles d'images. Les embeddings obtenus sont disponibles en tant qu'ensemble de données prêt pour l'analyse dans Earth Engine. Cet ensemble de données permet aux utilisateurs de créer un nombre illimité d'applications de réglage fin ou d'autres tâches sans exécuter de modèles de deep learning coûteux en termes de calcul. Le résultat est un ensemble de données à usage général qui peut être utilisé pour un certain nombre de tâches en aval différentes, telles que
- Classification
- Régression
- Détection des modifications
- Recherche de similarités
Dans ce tutoriel, nous allons comprendre le fonctionnement des embeddings et apprendre à accéder à l'ensemble de données Satellite Embedding et à le visualiser.
Comprendre les embeddings
Les embeddings permettent de compresser de grandes quantités d'informations en un ensemble plus petit de caractéristiques qui représentent une sémantique significative. Le modèle AlphaEarth Foundations prend des séries temporelles d'images provenant de capteurs tels que Sentinel-2, Sentinel-1 et Landsat, et apprend à représenter de manière unique les informations mutuelles entre les sources et les cibles avec seulement 64 nombres (pour en savoir plus, consultez l'article). Le flux de données d'entrée contient des milliers de bandes d'images provenant de plusieurs capteurs. Le modèle prend cette entrée de grande dimension et la transforme en une représentation de dimension inférieure.
Pour bien comprendre le fonctionnement d'AlphaEarth Foundations, vous pouvez utiliser un modèle mental appelé "analyse en composantes principales" (ACP). L'ACP permet également de réduire la dimensionnalité des données pour les applications de machine learning. Alors que l'ACP est une technique statistique qui peut compresser des dizaines de bandes d'entrée en quelques composantes principales, AlphaEarth Foundations est un modèle de deep learning qui peut prendre des milliers de dimensions d'entrée d'ensembles de données de séries temporelles multisenseurs et apprendre à créer une représentation à 64 bandes qui capture de manière unique la variabilité spatiale et temporelle de ce pixel.
Un champ d'embedding est un tableau ou un "champ" continu d'embeddings appris. Les images des collections de champs d'embedding représentent des trajectoires spatio-temporelles couvrant une année entière et comportent 64 bandes (une pour chaque dimension d'embedding).
Figure : Vecteur d'embedding n-dimensionnel échantillonné à partir d'un champ d'embedding
Accéder à l'ensemble de données d'embeddings satellite
L'ensemble de données Satellite Embedding est une collection d'images contenant des images annuelles à partir de 2017 (par exemple, 2017, 2018, 2019…). Chaque image comporte 64 bandes, où chaque pixel est le vecteur d'intégration représentant la série temporelle multisensorielle pour l'année donnée.
var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');
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 autour du réservoir Krishna Raja Sagara (KRS) en Inde 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 geometry
dans les importations.
// 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);
Figure : Sélection de la région d'intérêt
Préparer l'ensemble de données d'embeddings de satellites
Les images de chaque année sont divisées en tuiles pour faciliter l'accès. Nous appliquons des filtres et trouvons les images pour l'année et la région choisies.
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));
Les images d'intégration satellite sont quadrillées en tuiles de 163 840 mètres sur 163 840 mètres maximum chacune et diffusées dans la projection des zones UTM pour la tuile. Nous obtenons ainsi plusieurs tuiles d'intégration satellite couvrant la région d'intérêt. Nous pouvons utiliser la fonction mosaic()
pour combiner plusieurs tuiles en une seule image. Imprimons l'image obtenue pour voir les bandes.
var embeddingsImage = filteredEmbeddings.mosaic();
print('Satellite Embedding Image', embeddingsImage);
Vous verrez que l'image comporte 64 bandes, nommées A00, A01, … , A63. Chaque bande contient la valeur du vecteur d'intégration pour l'année donnée dans cette dimension ou cet axe. Contrairement aux bandes spectrales ou aux indices, les bandes individuelles n'ont pas de signification indépendante. Chaque bande représente un axe de l'espace d'intégration. Vous utiliserez les 64 bandes comme entrées pour vos applications en aval.
Figure : 64 bandes de l'image d'intégration satellite
Visualiser l'ensemble de données d'embeddings de satellites
Comme nous venons de le voir, notre image contient 64 bandes. Il n'est pas facile de visualiser toutes les informations contenues dans toutes les bandes, car nous ne pouvons afficher qu'une combinaison de trois bandes à la fois.
Nous pouvons choisir trois bandes pour visualiser trois axes de l'espace de représentation vectorielle sous forme d'image RVB.
var visParams = {min: -0.3, max: 0.3, bands: ['A01', 'A16', 'A09']};
Map.addLayer(embeddingsImage.clip(geometry), visParams, 'Embeddings Image');
Figure : Visualisation RVB des trois axes de l'espace de représentation vectorielle
Une autre façon de visualiser ces informations consiste à les utiliser pour regrouper les pixels avec des embeddings similaires et à utiliser ces regroupements pour comprendre comment le modèle a appris la variabilité spatiale et temporelle d'un paysage.
Nous pouvons utiliser des techniques de clustering non supervisées pour regrouper les pixels dans un espace à 64 dimensions en groupes ou "clusters" de valeurs similaires. Pour ce faire, nous échantillonnons d'abord certaines valeurs de pixels et entraînons un ee.Clusterer
.
var nSamples = 1000;
var training = embeddingsImage.sample({
region: geometry,
scale: 10,
numPixels: nSamples,
seed: 100
});
print(training.first());
Si vous imprimez les valeurs du premier échantillon, vous verrez qu'il comporte 64 valeurs de bande définissant le vecteur d'embedding pour ce pixel. Le vecteur d'embedding est conçu pour avoir une longueur unitaire (c'est-à-dire que la longueur du vecteur de l'origine (0,0,....0) aux valeurs du vecteur sera de 1).
Figure : Vecteur d'embedding extrait
Nous pouvons maintenant entraîner un modèle non supervisé pour regrouper les échantillons dans le nombre de clusters souhaité. Chaque cluster représenterait des pixels d'intégrations similaires.
// 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;
};
Nous pouvons maintenant regrouper l'image d'embedding plus grande pour voir les groupes de pixels ayant des embeddings similaires. Avant cela, il est important de comprendre que le modèle a capturé la trajectoire temporelle complète de chaque pixel pour l'année. Cela signifie que si deux pixels ont des valeurs spectrales similaires dans toutes les images, mais à des moments différents, ils peuvent être séparés.
Vous trouverez ci-dessous une visualisation de notre zone d'intérêt, telle qu'elle a été capturée par les images Sentinel-2 masquées par les nuages pour l'année 2024. N'oubliez pas que toutes les images (y compris celles de Sentinel-2, Landsat 8/9 et de nombreux autres capteurs) ont été utilisées pour apprendre les embeddings finaux.
Figure : Série temporelle annuelle Sentinel-2 pour notre région
Visualisons les images de représentation vectorielle satellite en segmentant le paysage en trois clusters.
var cluster3 = getClusters(3);
Map.addLayer(cluster3.randomVisualizer().clip(geometry), {}, '3 clusters');
Figure : Image d'intégration satellite avec trois clusters
Vous remarquerez que les clusters obtenus ont des limites très claires. En effet, les embeddings incluent intrinsèquement le contexte spatial : les pixels d'un même objet sont censés avoir des vecteurs d'embedding relativement similaires. De plus, l'un des clusters comprend des zones avec de l'eau saisonnière autour du réservoir principal. Cela est dû au contexte temporel capturé dans le vecteur d'intégration, qui nous permet de détecter ces pixels avec des modèles temporels similaires.
Voyons si nous pouvons affiner davantage les clusters en regroupant les pixels en cinq clusters.
var cluster5 = getClusters(5);
Map.addLayer(cluster5.randomVisualizer().clip(geometry), {}, '5 clusters');
Figure : Image d'intégration satellite avec cinq clusters
Nous pouvons continuer et affiner les images en groupes plus spécialisés en augmentant le nombre de clusters. Voici à quoi ressemble l'image avec 10 clusters.
var cluster10 = getClusters(10);
Map.addLayer(cluster10.randomVisualizer().clip(geometry), {}, '10 clusters');
Figure : Image d'intégration satellite avec 10 clusters
De nombreux détails émergent et nous pouvons voir différents types de cultures regroupés dans différents clusters. L'embedding satellite capture la phénologie des cultures ainsi que les variables climatiques. Il est donc bien adapté à la cartographie des types de cultures. Dans le tutoriel suivant (Classification non supervisée), nous verrons comment créer une carte des types de cultures avec des données d'intégration satellite avec peu ou pas de libellés au niveau des champs.
Essayez le script complet de ce tutoriel dans l'éditeur de code Earth Engine.