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

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

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

В этом уроке мы попытаемся найти все зернохранилища в регионе. Зернохранилища или зернохранилища — это высокие сооружения, обычно используемые для хранения зерна насыпью. Они встречаются на фермах или перерабатывающих предприятиях. Картографирование этих сооружений традиционными методами дистанционного зондирования затруднительно и требует обучения специальной модели обнаружения объектов. Поскольку силосы имеют уникальную форму, структуру и, как правило, изготовлены из схожих материалов, на спутниковых снимках они будут представлены уникальными векторами эмбеддинга, что позволит нам находить их с помощью простого поиска по сходству.


Зерновые силосы (изображение: Википедия)

Выберите регион поиска

В этом уроке мы составим карту зернохранилищ в округе Франклин, штат Канзас. Применим фильтр и выберем полигон для этого округа.

var counties = ee.FeatureCollection('TIGER/2018/Counties');

// Select Franklin County, Kansas
var selected = counties
  .filter(ee.Filter.eq('GEOID', '20059'));
var geometry = selected.geometry();

Map.centerObject(geometry);
Map.addLayer(geometry, {color: 'red'}, 'Search Area');


Рисунок: Выбранный регион

Выберите местоположение(я) ссылки

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

// Use the satellite basemap
Map.setOptions('SATELLITE');

Найдя местоположение интересующего вас объекта, используйте инструмент «Добавить маркер» из раздела «Инструменты рисования», чтобы поставить точку и отметить его как контрольное местоположение.


Рисунок: Добавление опорного местоположения

Часто достаточно даже одного местоположения, но наличие нескольких примеров помогает уменьшить количество ложных срабатываний (в данном случае, когда местоположения идентифицированы как зернохранилища, но на самом деле таковыми не являются). Мы изменим тип геометрии на FeatureCollection, чтобы можно было добавить несколько опорных точек. Нажмите кнопку «Изменить свойства слоя» рядом с геометрией. Измените имя слоя на samples и установите тип импорта FeatureCollection . Нажмите «ОК».


Рисунок: Настройка слоя образцов

Вернитесь в главное окно редактора кода и добавьте точки в нескольких наиболее характерных местах.


Рисунок: Добавление дополнительных опорных точек

Для этого урока мы выбрали три опорных местоположения. Они будут использоваться для извлечения векторов эмбеддинга из спутниковых изображений.

Выберите период времени

Выберите год, для которого мы хотим выполнить поиск.

var year = 2024;
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = startDate.advance(1, 'year');

Фильтрация и мозаика набора данных Satellite Embedding

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

var embeddings = ee.ImageCollection('GOOGLE/SATELLITE_EMBEDDING/V1/ANNUAL');

var mosaic = embeddings
  .filter(ee.Filter.date(startDate, endDate))
  .mosaic();

Извлечь вектор внедрения из образцов

Мы делаем выборку мозаики в опорных точках, чтобы получить вектор эмбеддинга, связанный с этими точками. Нам также необходимо выбрать масштаб, в котором мы хотим извлечь и сравнить вектор эмбеддинга. Очень практичным свойством эмбеддингов в Satellite Embedding является то, что они были разработаны для линейной композиции, что означает, что их можно агрегировать или упорядочивать с сохранением расстояний и интерпретируемого значения. Если мы возьмем пространственное среднее по 2x2 пикселям, результат будет представлять собой эмбеддинг большего пикселя с более низким разрешением. Собственное разрешение для Satellite Embedding составляет 10 м, и для идентификации небольших объектов, таких как зернохранилища, это будет хорошим масштабом для использования. Но если вы хотите найти объекты или участки большего размера, вы можете использовать большее значение (например, 20 м, 1000 м) для сопоставления объектов в более грубых масштабах.

// Choose the scale
// You may choose a larger value for larger objects
var scale = 10;

// Extract the embedding vector from the samples
var sampleEmbeddings = mosaic.sampleRegions({
  collection: samples,
  scale: scale
});

Рассчитать сходство

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

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

// We compute the dot product between two embedding vectors
var bandNames = mosaic.bandNames();

var sampleDistances = ee.ImageCollection(sampleEmbeddings.map(function(f) {
  var arrayImage = ee.Image(f.toArray(bandNames)).arrayFlatten([bandNames]);
  var dotProduct = arrayImage.multiply(mosaic)
    .reduce('sum')
    .rename('similarity');
  return dotProduct;
}));

// Calculate mean distance from all reference locations
var meanDistance = sampleDistances.mean();

Пиксели со скалярным произведением, близким к 1, имеют относительно схожие векторы встраивания (угол между ними близок к 0), в то время как скалярные произведения, близкие к -1, указывают на большее расхождение между векторами (ортогональными к противоположным направлениям). Мы можем визуализировать результаты, добавив изображение среднего расстояния к карте.

var palette = [
  '000004', '2C105C', '711F81', 'B63679',
  'EE605E', 'FDAE78', 'FCFDBF', 'FFFFFF'
];
var similarityVis = {palette: palette, min: 0, max: 1};

Map.addLayer(meanDistance.clip(geometry), similarityVis,
  'Similarity (bright = close)', false);


Рисунок: сходство пикселей вокруг контрольной точки — более яркие области имеют большее сходство.

Извлечь совпадения местоположения

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

// Apply a threshold
var threshold = 0.90;
var similarPixels = meanDistance.gt(threshold);

Результатом является бинарное изображение с пикселями, значения схожести которых меньше порогового значения. Теперь преобразуем полученное изображение в полигоны.

// Mask 0 values using selfMask()
// to get polygons only for the matched pixels
var polygons = similarPixels.selfMask().reduceToVectors({
  scale: scale,
  eightConnected: false,
  maxPixels: 1e10,
  geometry: geometry
});

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

// Extract the centroids of vectorized polygons
var predictedMatches = polygons.map(function(f) {
  return f.centroid({maxError: 1});
});

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

Векторизация — это операция в Earth Engine, требующая больших вычислительных ресурсов и памяти. Чтобы избежать ошибок времени ожидания вычислений или ошибок тайла при визуализации результатов, рекомендуется экспортировать результаты как ресурс. После экспорта ресурс можно импортировать в скрипт и визуализировать. Этот метод также гарантирует возможность масштабирования поиска на большие площади без проблем.

// Replace this with your asset folder
// The folder must exist before exporting
var exportFolder = 'projects/spatialthoughts/assets/satellite_embedding/';
var matchesExportFc = 'predicted_grain_silo_matches';
var matchesExportFcPath = exportFolder + matchesExportFc;

Export.table.toAsset({
  collection: predictedMatches,
  description: 'Predicted_Matches_Export',
  assetId: matchesExportFcPath
});

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

// Use the exported asset
var predictedMatches = ee.FeatureCollection(matchesExportFcPath);

Визуализируйте совпадения

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

Map.addLayer(predictedMatches, {color: 'cyan'}, 'Predicted Matches');


Рисунок: Прогнозируемое расположение зернохранилищ

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

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


Рисунок: Правильно идентифицированные места с зернохранилищами

Результаты также содержат несколько ложноположительных результатов. Обратите внимание: совпадения имеют много схожих характеристик с нашим эталонным местоположением и, следовательно, имеют схожие векторы встраивания.


Рисунок: Ложноположительные совпадения

Для улучшения результатов вы можете скорректировать контрольные местоположения и выбранный порог.

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