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

Генеративно-состязательные сети (или GAN для краткости) уже некоторое время являются горячей темой в сообществе машинного обучения и в основном известны своей способностью воспроизводить реалистично выглядящие изображения и переходы между выходными состояниями сети, что приводит к завораживающим преобразованиям. видео. Существует множество предварительно обученных моделей, которые используются для создания лиц, пейзажей, картин и т. д. Просто загляните на thisxdoesnotexist.com, чтобы получить представление о масштабах различных моделей.

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

Во второй части мы рассмотрим некоторые особенности рабочего процесса, включая примеры кода. Давайте погрузимся!

Экспорт одного спутникового изображения SENTINEL-2 с помощью Google Earth Engine

Базовый код

  1. Перейдите на https://earthengine.google.com и зарегистрируйте новую учетную запись (вам нужно будет подключить ее к существующей или вновь созданной учетной записи Google)
  2. Либо откройте и скопируйте этот пример кода, либо создайте новый скрипт и вставьте код JavaScript ниже. Я постарался подробно все прокомментировать, чтобы объяснить, что происходит в каждой строке.
  3. Щелкните ссылку, которая появляется в консоли справа, чтобы получить доступ к миниатюре экспортированного изображения и загрузить ее.

Выделение некоторых аспектов кода и решений

У Google есть справочники по API для каждой функции и даже несколько руководств, которые помогут вам начать работу, но давайте углубимся в некоторые из почему приведенного выше кода. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их в комментариях.

Зачем нам нужно получать отпечаток изображения?

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

Что произойдет, если область экспорта больше, чем спутниковый снимок?

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

Почему бы не объединить несколько изображений в одно?

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

Экспорт одного изображения приводит (на мой взгляд) к более чистым результатам, а также экономит дополнительные вычислительные операции.

Зачем вычислять центр тяжести и дополнительную ограничивающую рамку?

Код выше:

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

Код не особенно красив, так как он находит максимальную область экспорта методом перебора, но, эй, он работает. Если вы найдете более элегантный способ, дайте мне знать!

Зачем нужно задавать параметры экспорта?

С помощью этого фрагмента кода мы сообщаем API, как мы хотим отображать (и затем экспортировать) наше изображение.

Изображения SENTINEL-2 содержат гораздо больше информации, чем нам нужно для нашей простой цели. Взгляните на Документацию по коллекции SENTINEL-2, чтобы увидеть обзор всех различных групп.

Нам нужен только диапазон B4/B3/B2 (каналы для красного/зеленого/синего) и тоже не полное разрешение, а уменьшенная версия, например. 2048x2048 пиксель.

Значения min и max регулируют, как диапазон цветового канала будет скорректирован, чтобы соответствовать нашему экспортированному изображению 0-255 RGB. Идеальные значения будут отличаться от изображения к изображению, и я, к сожалению, еще не нашел хорошего способа автоматической установки этих значений, но вы можете поиграть со значениями, чтобы увидеть, какое из них подходит лучше всего.

Экспорт нескольких спутниковых изображений SENTINEL-2 с помощью QGIS, Google Earth Engine и Google Colab

Мы успешно экспортировали одно изображение SENTINEL-2 — теперь пришло время сделать это тысячи раз для создания набора данных. Давайте немного автоматизируем, хорошо?

Генерация случайных местоположений с помощью QGIS

Этот шаг, вероятно, можно было бы сделать в самом Earth Engine, но мне было проще сделать это в QGIS.

Шаг 1:
Загрузите, установите и откройте последнюю версию QGIS для вашей системы.

Шаг 2:
При создании нового проекта нас приветствует этот экран.

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

Для этого загрузите файлы береговой линии из NaturalEarthData и Набор данных характеристик стран WGS84. Перетащите обе загруженные папки в QGI, и обновленный проект должен выглядеть примерно так:

Шаг 4.
Далее создадим несколько случайных точек! В QGIS встроены функции, которые позволяют вам размещать случайные точки либо внутри полигона (наш файл земли), либо непосредственно на линии (наш файл береговых линий).

Чтобы сгенерировать случайные точки на суше, выберите слой набора данных Country WGS84 и перейдите в раздел Vector › Research Tools ›Random Points in Layer Bounds.

Вы, конечно, можете задать свои параметры, но я пока выбрал 100 локаций с минимальным расстоянием между ними в 1 градус.

Запускаем скрипт, и у нас есть несколько случайных точек на суше!

Шаг 5.
Чтобы создать случайные точки на береговой линии, выберите слой ne_110m_coastline и перейдите в раздел Вектор › Инструменты исследования › Случайные точки на линиях. Выполнение команды приведет к появлению нескольких случайных точек на контурах береговой линии (те же настройки, что и выше: 100 точек, минимальное расстояние 1 градус).

Как вы можете заметить, у нас есть некоторые береговые линии, которые более густонаселены, и некоторые, которые довольно редки. Причина этого в том, что алгоритм размещения рассматривает каждый контур как отдельный объект и пытается разместить 100 точек на каждом. Неважно, длинное ли это побережье Антарктиды или один остров Гавайи: каждый должен получить 100 баллов (при условии, что они находятся на расстоянии не менее 1 градуса друг от друга).

Шаг 6:
Чтобы экспортировать местоположения, щелкните правой кнопкой мыши слой Случайные точки › Экспорт › Сохранить объекты как… и выберите Comma Separated Value [CSV] в качестве целевого формата. Определите путь экспорта и установите GEOMETRY в параметрах слоя на AS_YX. Вы можете проверить, все ли получилось, открыв CSV-файл и вставив некоторые координаты в Google Maps.

Экспорт изображений SENTINEL-2 с помощью Google Colab

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

Логика кода будет относительно простой:

  1. Возьмите первый набор координат в файле CSV.
  2. Запрос спутникового изображения для местоположения
  3. Загрузите и сохраните изображение на Google Диске
  4. Повторить

Давайте экспортируем несколько изображений:

  1. Перейдите к Colab Notebook, который я написал, и либо запустите его напрямую, либо скопируйте, чтобы настроить под свои нужды. Если вы не знакомы с Colab, было бы неплохо сначала прочитать это начальное руководство.
  2. Загрузите CSV с экспортированными координатами в среду выполнения (код по умолчанию ищет файл с именем random_points.csv).
  3. Теперь просто выполните каждую ячейку сверху вниз, следуя инструкциям для авторизации Earth Engine и необязательно для Google Диска.
  4. Запустите Cell [4] и наблюдайте, как спутниковые изображения появляются на вашем Диске или в оперативной памяти!

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

До следующего раза ✌️