Контролируемая классификация с использованием набора данных спутникового встраивания

Редактировать на GitHub
Сообщить о проблеме
История страницы
Автор(ы): spatialthoughts
Это руководство является частью серии руководств по набору данных Satellite Embedding, см. также Введение , Неконтролируемая классификация , Регрессия и поиск сходства .

Спутниковые вложения могут использоваться в стандартных рабочих процессах классификации данных дистанционного зондирования. Эти вложения были специально разработаны для эффективного обучения с низкой частотой дискретизации, что означает, что для достижения высококачественных результатов классификации требуется относительно небольшое количество размеченных данных (десятки-сотни выборок). Поскольку вложения включают спектральный, пространственный и временной контекст, простые классификаторы, такие как метод k-ближайших соседей (kNN) или случайный лес, могут использовать векторы вложений для классификации сложных ландшафтов по целевым классам.

В этом уроке мы научимся использовать контролируемый подход к обучению с использованием классификатора kNN для классификации мангровых зарослей с использованием метода внедрения спутников.

Выберите регион

Начнём с определения интересующей области. В этом уроке мы выберем область вдоль побережья Кении и определим полигон в качестве геометрической переменной. Кроме того, вы можете использовать инструменты рисования в редакторе кода, чтобы нарисовать полигон вокруг интересующей области, который будет сохранён как геометрическая переменная в импортируемых данных.

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


Рисунок: Выбор интересующей области для классификации мангровых зарослей

Соберите обучающие образцы

Рабочие процессы классификации с использованием спутникового встраивания требуют лишь нескольких размеченных образцов для получения относительно точных результатов. Для нашей классификации ландшафта проще всего добавить точки и разметить их в Earth Engine для создания обучающих образцов. Мы создадим трёхклассовую классификацию, которая отнесёт каждый пиксель спутникового встраивания к одному из следующих трёх классов:

Класс землепользования Описание Значение класса
мангровые заросли Все виды солеустойчивой прибрежной растительности 1
вода Все поверхностные воды — озера, пруды, реки, океаны и т. д. 2
другой Все остальные поверхности, включая застроенную, открытую почву, песок, посевы, деревья и т. д. 3

Чтобы правильно маркировать точки, мы сначала создаём композитный снимок Sentinel-2 без облачности и загружаем его. Мы выбираем визуализацию в псевдоцветах, которая подчёркивает разницу между водой, растительностью и застроенными поверхностями, что позволяет нам легко выбирать нужные образцы.

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


Рисунок: Композитный снимок Sentinel-2 в псевдоцветном исполнении

Теперь у нас есть эталонное изображение за целевой год, которое можно использовать для маркировки образцов при классификации. Сначала настроим слои для сбора образцов. Откройте раздел «Импорт геометрии» и нажмите кнопку «+ новый слой» .


Рисунок: Создание нового слоя

Нажмите кнопку «Изменить свойства слоя» (значок шестеренки) рядом с новым слоем и настройте его, как показано ниже. Введите имя слоя mangroves и измените тип на FeatureCollection . Нажмите кнопку «+Свойство» и добавьте новый объект landcover со значением 1 Измените цвет на оттенок зелёного и нажмите «ОК».


Рисунок: Настройка свойств слоя для слоя мангровых зарослей

Аналогичным образом добавьте 2 новых слоя для других классов. Используйте значение landcover 2 для водных объектов и 3 для прочих.


Рисунок: Настройка свойств слоя для воды (слева) и других слоев (справа)

После настройки слоёв можно приступить к сбору образцов. Увеличьте масштаб области и визуально определите пиксели разных классов. Выберите слой mangroves зарослей и используйте инструмент «Добавить маркер», чтобы добавить точки на пикселях, принадлежащих мангровым лесам, которые, как правило, отображаются в виде полутонов зелёного цвета на нашем композитном изображении Sentinel-2 в псевдоцветах (вы также можете посмотреть базовую карту спутникового снимка для справки). При классификации с использованием набора данных Satellite Embedding не требуется много точек; важнее выбрать высококачественные примеры, отражающие изменчивость в интересующей вас области. Для этого руководства будет достаточно набора из 10 образцов.


Рисунок: Сбор образцов для класса мангровых деревьев

Затем переключитесь на слой water и соберите образцы пикселей поверхности воды, которые на нашем композитном изображении Sentinel-2 выглядят почти чёрными из-за сильного поглощения полос коротковолнового ИК-диапазона открытой воды. Повторите процесс для other слоя, выбрав примеры, которые явно не относятся ни к mangrove , ни water .


Рисунок: Сбор проб воды и других классов

Коллекция обучающей выборки готова. Мы можем объединить три отдельные коллекции FeatureCollections в единую коллекцию опорных точек (GCP).

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

Обучить классификатор

Теперь мы готовы к обучению классификатора. Мы загружаем набор данных Satellite Embedding, фильтруем по фрагментам для выбранного года и интересующего региона, создаём мозаику, а затем сэмплируем векторы встраивания для создания обучающего набора данных.

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

Обучающие признаки имеют векторы эмбеддинга в качестве входных свойств, а соответствующую метку — в качестве свойства класса. Теперь мы можем обучить классификатор с помощью этих извлеченных признаков. Мы можем выбрать один из множества классификаторов, доступных в Earth Engine. Хорошим выбором для классификации с минимальным количеством примеров (классификации с использованием очень небольшого количества примеров, как в нашем примере) является метод k-ближайших соседей (kNN). В классификации kNN помеченные примеры используются для «разбиения» или кластеризации пространства эмбеддинга, присваивая метку каждому пикселю на основе метки(ок) его ближайшего(их) соседа(ов) в пространстве эмбеддинга. Давайте обучим классификатор kNN на наших обучающих данных.

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

Классифицируйте мозаику встраивания спутников

Теперь мы можем использовать обученный классификатор для прогнозирования класса во всех пикселях мозаики Satellite Embedding.

var classified = embeddingsImage.classify(classifier);

Экспортировать классифицированное изображение в актив (необязательно)

Если вы пытаетесь классифицировать большой регион, Earth Engine потребуется больше времени, чем разрешено в интерактивной вычислительной среде. Рекомендуется экспортировать промежуточные результаты в виде ресурсов, чтобы использовать возможности среды пакетных вычислений, которая имеет более длительные сроки выполнения задач и располагает большим количеством ресурсов. Это также помогает избежать ошибок, связанных с истечением времени ожидания вычислений или исчерпанием пользовательской памяти при работе с большими регионами. Давайте экспортируем классифицированное изображение.

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

Запустите экспорт и дождитесь его завершения, прежде чем продолжить. После завершения экспорта мы импортируем классифицированное изображение обратно в наш код.

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

Визуализируйте классификацию

Независимо от того, провели ли вы классификацию интерактивно или экспортировали ее в актив, теперь у вас будет классифицированная переменная с результатами вашей классификации.

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


Рисунок: Классифицированное спутниковое изображение

Создайте карту мангровых зарослей

Мы создали классифицированное изображение с тремя классами. Мы можем извлечь пиксели, классифицированные как «Мангровые леса» (класс 1), и создать карту мангровых зарослей.

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


Рисунок: Карта мангровых зарослей

Подтвердите результаты

Чтобы оценить наши результаты, мы можем сравнить их с высококачественным рецензируемым набором данных: Global Mangrove Watch . Этот набор данных был получен с помощью радиолокатора с синтезированной апертурой (SAR) L-диапазона от JAXA и содержит ежегодные карты мангровых зарослей за 1996–2020 годы. Этот набор данных доступен в каталоге сообщества GEE , поэтому мы можем легко загрузить его и визуализировать в 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)');


Рисунок: (слева) Карта мангровых зарослей, полученная с помощью спутниковых снимков (справа) Карта мангровых зарослей от GMW

Обратите внимание на близкое соответствие между результатами глобального наблюдения за мангровыми зарослями и результатами классификации по методу «Sputnik Embedding». Если переключить базовую карту на «Sputnik», можно увидеть, что классификация по методу «Sputnik Embedding» также отразила более мелкие детали ландшафта, отсутствующие в классификации глобального наблюдения за мангровыми зарослями.

Попробуйте полный сценарий для этого урока в редакторе кода Earth Engine .