Las incorporaciones de satélite se pueden usar para flujos de trabajo de clasificación de detección remota estándar. Los embeddings se diseñaron específicamente para destacar en el aprendizaje con pocos ejemplos, lo que significa que se requiere una cantidad relativamente pequeña de datos etiquetados (entre 10 y 100 muestras) para lograr resultados de clasificación de alta calidad. Dado que los embeddings incluyen contexto espectral, espacial y temporal, los clasificadores simples, como k-Nearest Neighbors (kNN) o Random Forest, pueden usar los vectores de embedding para clasificar paisajes complejos en clases objetivo.
En este instructivo, aprenderemos a usar un enfoque de aprendizaje supervisado con el clasificador kNN para clasificar manglares con la incorporación de satélites.
Selecciona una región
Comencemos por definir una región de interés. En este instructivo, elegiremos una región a lo largo de la costa de Kenia y definiremos un polígono como la variable de geometría. Como alternativa, puedes usar las herramientas de dibujo en el editor de código para dibujar un polígono alrededor de la región de interés que se guardará como la variable de geometría en las importaciones.
var geometry = ee.Geometry.Polygon([[
[39.4926, -4.39833],
[39.4926, -4.47394],
[39.5491, -4.47394],
[39.5491, -4.39833]
]])
Figura: Selección del área de interés para la clasificación de manglares
Recopila muestras de entrenamiento
Los flujos de trabajo de clasificación con la incorporación de Satellite solo requieren unas pocas muestras etiquetadas para lograr resultados relativamente precisos. Para nuestra clasificación de la cobertura terrestre, lo más fácil es soltar puntos y etiquetarlos en Earth Engine para crear las muestras de entrenamiento. Crearemos una clasificación de 3 clases que clasificará cada píxel del Satellite Embedding en una de las siguientes tres clases:
Clase de cobertura terrestre | Descripción | Valor de clase |
---|---|---|
manglares | Todas las especies de vegetación costera tolerante a la sal | 1 |
agua | Toda el agua superficial: lagos, estanques, ríos, océanos, etc. | 2 |
otro | Todas las demás superficies, incluidas las construidas, el suelo expuesto, la arena, los cultivos, los árboles, etcétera | 3 |
Para que podamos etiquetar los puntos correctamente, primero creamos un compuesto sin nubes de Sentinel-2 y lo cargamos. Elegimos una visualización en falso color que destaca la diferencia entre el agua, la vegetación y las superficies construidas, lo que nos permite elegir muestras adecuadas con facilidad.
// 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)');
Figura: Imagen compuesta en falso color de Sentinel-2
Ahora tenemos una imagen de referencia del año objetivo que se puede usar para etiquetar muestras para la clasificación. Primero, configuraremos las capas para recopilar muestras. Abre la sección Geometry Imports y haz clic en + new layer.
Figura: Creación de una capa nueva
Haz clic en Editar propiedades de la capa (ícono de ajustes) junto a la capa nueva y configúrala como se muestra a continuación. Ingresa el nombre de la capa como mangroves
y cambia el tipo a FeatureCollection
. Haz clic en + Propiedad y agrega una propiedad nueva landcover
con el valor 1
. Cambia el color a un tono de verde y haz clic en Aceptar.
Figura: Configuración de las propiedades de la capa de manglares
De manera similar, agrega 2 capas nuevas para las otras clases. Usa el valor landcover
2
para el agua y 3
para otros.
Figura: Configuración de las propiedades de la capa para (izquierda) agua y (derecha) otras capas
Una vez que se configuren las capas, podremos comenzar a recopilar muestras. Acercar el zoom a una región y, luego, identificar visualmente los píxeles de diferentes clases Selecciona la capa mangroves
y usa la herramienta Agregar un marcador para colocar puntos en los píxeles que pertenecen a los bosques de manglares, que suelen aparecer como un verde de tono medio en nuestro compuesto de color falso de Sentinel-2 (también puedes consultar la vista del mapa base de satélite como referencia). No necesitas muchos puntos cuando clasificas con el conjunto de datos de Satellite Embedding. En cambio, es más importante seleccionar ejemplos de alta calidad que representen la variabilidad dentro de tu región de interés. Para este instructivo, un conjunto de 10 muestras debería ser suficiente.
Figura: Recopilación de muestras para la clase de manglares
A continuación, cambia a la capa water
y recopila muestras de los píxeles de agua superficial, que aparecen casi negros en nuestro compuesto de Sentinel-2 debido a la fuerte absorción de las bandas SWIR para el agua abierta. Repite el proceso para la capa other
y selecciona ejemplos que claramente no sean mangrove
ni water
.
Figura: Recopilación de muestras para agua y otras clases
Ya se completó la recopilación de muestras de entrenamiento. Podemos combinar los tres FeatureCollections individuales en una sola colección de puntos de control terrestres (GCP).
var gcps = mangroves.merge(water).merge(other);
Entrena un clasificador
Ahora ya podemos entrenar un clasificador. Cargamos el conjunto de datos de Satellite Embedding, filtramos las segmentaciones para el año y la región de interés elegidos, creamos un mosaico y, luego, tomamos muestras de los vectores de incorporación para crear un conjunto de datos de entrenamiento.
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());
Los atributos de entrenamiento tienen los vectores de incorporación como propiedades de entrada y la etiqueta asociada como propiedad de clase. Ahora podemos entrenar un clasificador con estos atributos extraídos. Podemos elegir entre una variedad de clasificadores disponibles en Earth Engine. Una buena opción para la clasificación con pocos ejemplos (clasificación con una cantidad muy pequeña de ejemplos, como en nuestro ejemplo) es k-Nearest Neighbors (kNN). En una clasificación de kNN, se usan ejemplos etiquetados para “particionar” o agrupar en clústeres el espacio de incorporación, y se asigna una etiqueta a cada píxel según las etiquetas de sus vecinos más cercanos en el espacio de incorporación. Entrenemos un clasificador kNN con nuestros datos de entrenamiento.
var classifier = ee.Classifier.smileKNN().train({
features: training,
classProperty: 'landcover',
inputProperties: embeddingsImage.bandNames()
});
Clasifica el mosaico de la integración de satélite
Ahora podemos usar el clasificador entrenado para predecir la clase en todos los píxeles del mosaico de Satellite Embedding.
var classified = embeddingsImage.classify(classifier);
Exporta la imagen clasificada a un recurso (opcional)
Si intentas clasificar una región grande, Earth Engine necesita más tiempo del que se permite en el entorno de procesamiento interactivo. Una buena práctica es exportar los resultados intermedios como recursos para aprovechar el entorno de procesamiento por lotes, que tiene límites más largos para la ejecución de tareas y más recursos. Esto también ayuda a superar los errores de tiempo de espera agotado para el cálculo o se excedió la memoria del usuario cuando se trabaja con regiones grandes. Exportemos la imagen clasificada.
// 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
});
Inicia las tareas de exportación y espera a que finalicen antes de continuar. Una vez que finaliza la tarea de exportación, importamos la imagen clasificada de nuevo en nuestro código.
// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);
Visualiza la clasificación
Ya sea que hayas ejecutado la clasificación de forma interactiva o la hayas exportado a un recurso, ahora tendrás una variable clasificada con los resultados de tu clasificación.
// 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');
Figura: Imagen de incorporaciones satelitales clasificadas
Crea un mapa de manglares
Creamos una imagen clasificada con 3 clases. Podemos extraer los píxeles clasificados como manglares (clase 1) para crear un mapa de manglares.
// 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)');
Figura: Mapa de manglares
Valida los resultados
Para evaluar nuestros resultados, podemos compararlos con un conjunto de datos de alta calidad revisado por expertos: Global Mangrove Watch. Este conjunto de datos se derivó del radar de apertura sintética (SAR) de banda L de JAXA y contiene mapas anuales de manglares desde 1996 hasta 2020. Este conjunto de datos está disponible en el catálogo de la comunidad de GEE, por lo que podemos cargarlo y visualizarlo fácilmente en 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)');
Observa que hay una coincidencia cercana entre los resultados del monitoreo global de manglares y el resultado de la clasificación con pocos ejemplos del conjunto de datos de Satellite Embedding. Si cambias el mapa base a Satélite, verás que la clasificación de la incorporación de satélite también capturó los detalles más finos del paisaje que faltan en la clasificación global de monitoreo de manglares.
Prueba la secuencia de comandos completa de este instructivo en el editor de código de Earth Engine.