Classificação supervisionada com o conjunto de dados de incorporação de satélite

Editar no GitHub
Informar problema
Histórico da página
Este tutorial faz parte de uma série sobre o conjunto de dados de incorporação de satélite. Consulte também Introdução, Classificação não supervisionada, Regressão e Pesquisa de similaridade.

Os embeddings de satélite podem ser usados para fluxos de trabalho padrão de classificação de sensoriamento remoto. Os embeddings foram projetados especificamente para se destacar no aprendizado com poucos exemplos, o que significa que um número relativamente pequeno de dados rotulados (dezenas a centenas de amostras) é necessário para alcançar resultados de classificação de alta qualidade. Como os embeddings incluem contexto espectral, espacial e temporal, classificadores simples, como k-Nearest Neighbors (kNN) ou Random Forest, podem usar os vetores de embedding para classificar paisagens complexas em classes de destino.

Neste tutorial, vamos aprender a usar uma abordagem de aprendizado supervisionado com o classificador kNN para classificar manguezais usando a incorporação de satélite.

Selecione uma região

Vamos começar definindo uma região de interesse. Para este tutorial, vamos escolher uma região ao longo da costa do Quênia e definir um polígono como a variável de geometria. Como alternativa, use as ferramentas de desenho no editor de código para desenhar um polígono ao redor da região de interesse, que será salva como a variável de geometria nas importações.

var geometry = ee.Geometry.Polygon([[
  [39.4926, -4.39833],
  [39.4926, -4.47394],
  [39.5491, -4.47394],
  [39.5491, -4.39833]
]])


Figura: seleção da área de interesse para classificação de manguezais

Coletar amostras de treinamento

Os fluxos de trabalho de classificação com o encadeamento do Satellite exigem apenas algumas amostras rotuladas para alcançar resultados relativamente precisos. Para nossa classificação de cobertura da terra, é mais fácil soltar pontos e rotulá-los no Earth Engine para criar as amostras de treinamento. Vamos criar uma classificação de três classes que vai classificar cada pixel do embedding de satélite em uma das seguintes classes:

Classe de cobertura da terra Descrição Valor da classe
manguezais Todas as espécies de vegetação costeira tolerante a sal 1
água Toda a água da superfície: lagos, lagoas, rios, oceanos etc. 2
outro Todas as outras superfícies, incluindo solo construído, exposto, areia, plantações, árvores etc. 3

Para rotular os pontos corretamente, primeiro criamos e carregamos um mosaico sem nuvens do Sentinel-2. Escolhemos uma visualização em falsa cor que destaca a diferença entre água, vegetação e superfícies construídas, permitindo selecionar amostras adequadas com facilidade.

// 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: composição de falsa cor do Sentinel-2

Agora temos uma imagem de referência do ano de destino que pode ser usada para rotular amostras para classificação. Primeiro, vamos configurar as camadas para coletar amostras. Abra a seção Importações de geometria e clique em + nova camada.


Figura: como criar uma nova camada

Clique em "Editar propriedades da camada" (ícone de engrenagem) ao lado da nova camada e configure-a como mostrado abaixo. Insira o nome da camada como mangroves e mude o tipo para FeatureCollection. Clique em + Propriedade e adicione uma nova propriedade landcover com o valor 1. Mude a cor para um tom de verde e clique em OK.


Figura: configuração das propriedades da camada de manguezais

Da mesma forma, adicione duas novas camadas para as outras classes. Use o valor landcover 2 para água e 3 para outros.


Figura: configuração das propriedades da camada para (esquerda) água e (direita) outras camadas

Depois que as camadas são configuradas, podemos começar a coletar amostras. Aumente o zoom em uma região e identifique visualmente pixels de diferentes classes. Selecione a camada mangroves e use a ferramenta Adicionar um marcador para inserir pontos em pixels pertencentes a manguezais, que tendem a aparecer como um verde de tom médio no nosso composto Sentinel-2 de falsa cor. Você também pode conferir a visualização do mapa de base de satélite para referência. Não é necessário ter muitos pontos ao classificar com o conjunto de dados de incorporação de satélite. É mais importante selecionar exemplos de alta qualidade que representem a variabilidade na sua região de interesse. Para este tutorial, um conjunto de 10 amostras é suficiente.


Figura: coleta de amostras para a classe de manguezais

Em seguida, mude para a camada water e colete amostras de pixels de água superficial, que aparecem quase pretos na nossa composição do Sentinel-2 devido à forte absorção das bandas SWIR para água aberta. Repita o processo para a camada other, selecionando exemplos que não sejam mangrove nem water.


Figura: coleta de amostras para água e outras classes

A coleta de amostras de treinamento foi concluída. Podemos mesclar as três FeatureCollections individuais em uma única coleção de pontos de controle de solo (GCPs, na sigla em inglês).

var gcps = mangroves.merge(water).merge(other);

Treinar um classificador

Agora está tudo pronto para treinar um classificador. Carregamos o conjunto de dados de incorporação de satélite, filtramos os blocos do ano e da região de interesse escolhidos, criamos um mosaico e amostramos os vetores de incorporação para criar um conjunto de dados de treinamento.

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());

Os atributos de treinamento têm os vetores de embedding como propriedades de entrada e o marcador associado como propriedade de classe. Agora podemos treinar um classificador com esses recursos extraídos. Podemos escolher entre vários classificadores disponíveis no Earth Engine. Uma boa opção para classificação de poucos disparos (com um número muito pequeno de exemplos, como o nosso) é o k-Nearest Neighbors (kNN). Em uma classificação kNN, exemplos rotulados são usados para "dividir" ou agrupar o espaço de incorporação, atribuindo um rótulo a cada pixel com base nos rótulos dos vizinhos mais próximos no espaço de incorporação. Vamos treinar um classificador kNN com nossos dados de treinamento.

var classifier = ee.Classifier.smileKNN().train({
  features: training,
  classProperty: 'landcover',
  inputProperties: embeddingsImage.bandNames()
});

Classificar o mosaico de incorporação de satélite

Agora podemos usar o classificador treinado para prever a classe em todos os pixels do mosaico de incorporação de satélite.

var classified = embeddingsImage.classify(classifier);

Exportar a imagem classificada para um recurso (opcional)

Se você estiver tentando classificar uma região grande, o Earth Engine vai precisar de mais tempo do que o permitido no ambiente de computação interativa. É uma prática recomendada exportar resultados intermediários como recursos para aproveitar o ambiente de computação em lote, que tem limites mais longos para execução de tarefas e mais recursos. Isso também ajuda a superar erros de tempo limite de computação excedido ou memória do usuário excedida ao trabalhar com regiões grandes. Vamos exportar a imagem classificada.

// 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
});

Inicie as tarefas de exportação e aguarde a conclusão antes de continuar. Quando a tarefa de exportação for concluída, vamos importar a imagem classificada de volta para nosso código.

// Use the exported asset
var classified = ee.Image(classifiedExportImagePath);

Visualizar a classificação

Se você executou a classificação de forma interativa ou exportou para um recurso, agora terá uma variável classificada com os resultados da classificação.

// 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: imagem de embeddings de satélite classificados

Criar um mapa de manguezais

Criamos uma imagem classificada com três classes. Podemos extrair os pixels classificados como manguezais (classe 1) para criar um mapa de manguezais.

// 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 manguezais

validar os resultados

Para avaliar nossos resultados, podemos compará-los com um conjunto de dados revisado por pares de alta qualidade: Global Mangrove Watch (em inglês). Esse conjunto de dados foi derivado do radar de abertura sintética (SAR) de banda L da JAXA e tem mapas anuais de manguezais de 1996 a 2020. Esse conjunto de dados está disponível no Catálogo da comunidade do GEE. Assim, podemos carregá-lo e visualizá-lo facilmente no 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)');

Há uma correspondência próxima entre os resultados do monitoramento global de manguezais e a saída da classificação de poucos disparos do conjunto de dados de incorporação de satélite. Se você mudar o mapa de base para satélite, vai notar que a classificação de incorporação de satélite também capturou os detalhes mais finos da paisagem que não aparecem na classificação global de observação de manguezais.

Teste o script completo deste tutorial no editor de código do Earth Engine.