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

Вид реализации

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

Услуга состоит из обработки изображений, внутреннего и внешнего интерфейса веб-приложений.

Сервис ClearCut: clearcut.quantumobile.com

Обработка изображений

Загрузка изображений

  1. Укажите учетные данные изображения, координаты, дату, покрытие облаков и т. Д .;
  2. Загрузите каналы изображения с сервера Sentinel-2.

Подготовка изображения

  1. Фильтровать каналы;
  2. Создать бэнд NDVI;
  3. Масштабируйте и объединяйте бэнды в один TIFF.

Прогноз модели

  1. Модель нагрузки;
  2. Прогнозировать маску сегментации;
  3. Сделайте маску многоугольником;
  4. Сохраните полигоны и изображение бинарной маски.

Серверная часть веб-приложения

Серверная часть сервиса представляет собой простое приложение WSGI, стоящее за uWSGI, реализованное с Django и Postgres (PostGIS) для хранения геопространственных данных, таких как многоугольники. Он предоставляет необходимые конечные точки REST для внешнего интерфейса веб-сайта, который включает:

а. Вызов модели
б. Получение гистограммы площадей
c. Фильтрация сплошных рубок по дате

Crontab имеет плановое обновление базы данных (каждые 5 дней загружаются, обрабатываются новые изображения, а полигоны сохраняются в базе данных).

Интерфейс веб-приложения

  1. Отобразите 3 типа сплошных рубок:
    a. Данные, которые менялись с течением времени
    b. Данные, которые не изменились или существенно не изменились
    c. Данные, в которых мы не уверены, в случае облаков или проблем с изображением
  2. Фильтрация по дате

Задача сегментации

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

На изображениях выше показан пример входного изображения и желаемого выходного изображения с разделенными фоном и передним планом (четкие обозначения).

Метрики

Первое, что нам нужно установить, - это наши показатели. Метрики дают понятную оценку производительности решения. Вот несколько показателей, которые можно использовать в задаче сегментации:

Точность

Основная цель сегментации - отделить экземпляры переднего плана от фона. Точность бесполезна, когда наши классы крайне несбалансированы. В нашем случае чистые обрезки составляют небольшую часть изображения. Таким образом, точность может составлять 90% без каких-либо сплошных рубок.

IoU

Intersection-Over-Union (IoU), также известный как индекс Жаккарда, является одним из наиболее часто используемых показателей в семантической сегментации. В общем, метрика IoU имеет тенденцию наказывать отдельные случаи плохой классификации, что более информативно, чем точность.

Счет в кости

Оценка Dice или оценка F очень похожа на IoU, но не так строги. Подобно тому, как L2 может наказывать за самые большие ошибки больше, чем L1, метрика IoU имеет тенденцию иметь эффект «возведения в квадрат» на ошибки относительно оценки F. В то время как оценка F измеряет среднюю производительность, оценка IoU измеряет производительность, близкую к худшей. Так что в нашем случае это более подходящий показатель.

Функция потерь

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

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

Архитектура модели

Обычно используемые архитектуры нейронных сетей для семантической сегментации - это U-net, LinkNet, PSPNet и FPN. Вот простая в использовании реализация этих моделей (Keras, PyTorch). Вы можете запускать модели с разными костями, которые имеют предварительно обученные веса.

Мы протестировали все вышеперечисленное с магистралями ResNet-50 и ResNet-101. U-net и FPN с ResNet-50 дают лучшие результаты по нашим данным. Для дальнейших улучшений мы тестировали только эти архитектуры.

каналы

При работе со спутниковыми изображениями рекомендуется использовать дополнительные каналы (полосы) для повышения производительности вашей модели. Может быть очень полезно увидеть эти полосы на части карты перед добавлением их в вашу модель, поэтому Sentinel-Hub и ArcGis - хорошие варианты для экспериментов с каналами.

Мы протестировали множество комбинаций каналов (RGB, NDVI, NDVI_COLOR, B2, B3, B4, B8), и лучшей является комбинация RGB, NDVI и B8 (инфракрасный). Он является наиболее экономичным с точки зрения затрат времени и памяти и дает лучшие результаты, чем простой канал RGB.

Рабочий процесс данных

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

Скачивание изображений из Sentinel-2

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

Для скачивания вы можете использовать Scihub Copernicus API. В сети можно найти различные рабочие решения, позволяющие упростить настройку параметров загрузки, и вот одно из них с двумя реализациями: первая на основе Scihub API и другая на базе французского зеркала. .

Предварительная обработка данных

После загрузки вы должны подготовить данные, прежде чем помещать их в свою модель. В скачанном архиве у вас есть несколько разных бэндов, поэтому мы должны их отфильтровать. Затем создайте канал NDVI из полос B4 и B8, масштабируйте все полосы, конвертируйте их в 8-битные изображения (значения пикселей 0–255) и объедините их все в одно изображение. Формат TIFF отлично подходит для хранения спутниковых снимков. Он сохраняет метаданные, такие как географические координаты, поэтому вы можете просматривать изображения в QGIS, и сохраняет каждую полосу как отдельный слой.

Исходный размер загружаемых изображений с разрешением 10 метров на пиксель составляет примерно 10K * 10K. Мы не можем работать с такими большими изображениями, поэтому следующий шаг - разрезать все изображение на маленькие части размером 224 * 224.

Затем помеченные сплошные вырезки должны быть преобразованы из полигонов GeoJSON в двоичные маски (0 - фон, 1 - передний план или сплошной вырез). У вас также может не быть полностью помеченного изображения, поэтому некоторые части изображения не будут иметь разметки, и мы должны их отфильтровать. Мы можем установить порог процентного отношения пикселей переднего плана к общему количеству пикселей на изображении, чтобы избавиться от изображений с небольшим количеством полезной информации. Но рекомендуется оставить несколько изображений без меток, чтобы улучшить производительность модели в регионах без четких границ, таких как города, реки или посевы.

Деление набора данных

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

После подготовки данных мы должны разделить наши данные на наборы данных. Обучающий набор данных является самым большим, обычно около 70–80% всех данных, остальное идет на проверку и тестирование наборов данных. Вот список методов, которые можно использовать для разделения ваших данных:

Разделение тренировок и тестов

Разделение поезд / тест является самым простым. Каждое изображение случайным образом попадает в некоторые наборы данных с фиксированной вероятностью. Мы делаем одно деление для обучающего теста (70–30%) или множественное деление для обучающего теста-валидации (70–20–10%).

Стратифицированное разделение

Стратифицированное разделение - аналогично разделению поездов / тестов, но мы также сохраняем баланс классов (площади полигонов). В нашем случае это не дало существенного улучшения.

Географическое разделение

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

Складывание-раскол

Раскол сгиба - это просто географическое разделение, но по сгибам. Мы делим набор данных на указанное количество складок и одну дополнительную для теста. Затем мы используем классическую перекрестную проверку, которая обычно дает лучшие результаты, чем простое разделение на поезд / тест.

Аугментации

Из одного файла TIFF (10K * 10K) мы получаем 2401 изображение (224 * 224), и примерно только 10–15% из них помечены. Это действительно небольшое количество образцов для обучения, даже если у нас есть изображения с разных дат. Итак, решение этой проблемы - применить некоторые дополнения. Albumentations - хороший пакет со встроенными дополнениями, который также дает возможность легко строить конвейеры для предварительной обработки. В нашем случае мы использовали RGBShift и CLAHE для полосы RGB, RandomRotate90 и Flip для всех полос. Эти дополнения увеличивают количество образцов для обучения, чтобы предотвратить переобучение и не так сильно искажать изображения.

Полученные результаты

Окончательная конфигурация

Магистраль: U-Net с ResNet50.

Набор данных: зима (2016.01.03) и лето (2016.06.21, 2016.08.30, 2019.06.26) + 10% немаркированных изображений, чтобы дать дополнительный контекст (избавиться от неузнаваемости в городе и других местах). области).

Каналы: RGB, NDVI, B8.

Функция разделения: разделение на обучение / тест (80–20%). Мы не используем географическое разделение, потому что мы обнаружили область, которая не меняется с течением времени, поэтому не будет смешивания данных поездов и тестов в разные сезоны, если мы укажем случайное начальное число.

Гиперпараметры:

  • Оптимизатор Адама (lr = 1e-3)
  • Планировщик (этапы = [10, 20, 40], гамма = 0,3)
  • Эпохи = 100 (мы тестировали 500 и 700 - и модель была переоборудована)
  • Размер партии = 8
  • Функция потерь - бинарная кросс-энтропия в сочетании со счетом игральных костей (bce_weitgh = 0,2, dice_weight = 0,8)

Дополнения:

  • RandomRotate90, Flip, RandomSizedCrop для всех каналов
  • RGBShift, CLAHE для канала RGB

Mertics:

  • Обучить
    Dice = 0,5757
    Убыток = 0,3482
  • Проверка
    Dice = 0,5722
    Убыток = 0,3516

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

В дополнение к простому подходу мы протестировали следующие методы:

Мультиклассовое предсказание

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

Магистраль: FPN с Resnet50.

Набор данных: осень + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Созданы плитки размером 320x320 и произвольно вырезаны из них 224x224. Удалена «плохая» разметка из Dataframes.

Каналы: RGB.

Гиперпараметры:

  • Оптимизатор Адама (lr = 1e-3)
  • Планировщик (этапы = [10, 20, 40], гамма = 0,3)
  • Эпохи = 100 (мы тестировали 500 и 700 - и модель была переоборудована)
  • Размер партии = 8
  • Функция потерь - бинарная кросс-энтропия в сочетании со счетом игральных костей (bce_weitgh = 0,2, dice_weight = 0,8)

Дополнения:

  • Случайные вращения
  • Случайная горизонтальная
  • Вертикальный флип
  • RGBShift
  • CLAHE

Mertics:

  • Обучение
    Dice = 0,4727
    Убыток = 0,4476
  • Проверка
    Dice = 0,3873
    Убыток = 0,5154
  • Тест
    Dice = 0,5296 (добавлены вероятности из 2 классов вырубки леса)

Прогноз сезона

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

Магистраль: FPN с Resnet50.

Набор данных: осень + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Удалены все данные, где размер разметки слишком мал (‹ 0,1% от размера изображения) и данные, где большая часть разметки находится на краю изображения.

Каналы: RGB.

Гиперпараметры:

  • Оптимизатор Адама (lr = 1e-3)
  • Планировщик (этапы = [10, 20, 40], гамма = 0,3)
  • Эпохи = 100 (мы тестировали 500 и 700 - и модель была переоборудована)
  • Размер партии = 8
  • Функция потерь - двоичная перекрестная энтропия в сочетании со счетом в кости + двоичная перекрестная энтропия для прогнозирования сезона. (bce_weight = 0,2, dice_weight = 0,8, Season_weight = 0,2)

Дополнения:

  • Случайные вращения
  • Случайная горизонтальная
  • Вертикальный флип
  • RGBShift
  • CLAHE

Mertics:

  • Тренировка
    Кости = 0,634
    Убыток = 0,25
  • Проверка
    Dice = 0,607
    Убыток = 0,579
  • Тест
    Dice = 0,5124

Автоэнкодер

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

Магистраль: FPN с Resnet50.

Набор данных: осень + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Удалены все данные, где размер разметки слишком мал (‹ 0,1% от размера изображения) и данные, где большая часть разметки находится на краю изображения.
Создал плитки размером 320x320 и произвольно вырезал из них 224x224. Удалена «плохая» разметка из Dataframes.

Каналы: RGB.

Гиперпараметры:

  • Оптимизатор Адама (lr = 1e-3)
  • Планировщик (этапы = [10, 20, 40], гамма = 0,3)
  • Эпохи = 100 (мы тестировали 500 и 700 - и модель была переоборудована)
  • Размер партии = 8
  • Функция потерь - двоичная кросс-энтропия в сочетании со счетом игральных костей. (bce_weight = 0,2, dice_weight = 0,8)

Дополнения:

  • Случайные вращения
  • Случайная горизонтальная
  • Вертикальный флип
  • RGBShift
  • CLAHE

Mertics:

  • Обучить
    Dice = 0,4943 (среднее значение за пакет)
    Потери = 0,4355 (среднее значение за пакет)
  • Проверка
    Dice = 0,5696 (среднее значение за пакет)
    Потери = 0,3750 (среднее значение за пакет)
  • Тест
    Dice = 0,4422 (в среднем)

Складки

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

Магистраль: FPN с Resnet50.

Набор данных: осень + 2 лета + зима (26.10.16, 30.08.16, 21.06.16, 03.01.16).
Созданы плитки размером 320x320 и произвольно вырезаны из них 224x224. Удалена «плохая» разметка из фреймов данных.
Данные были разделены с использованием географической информации. Нижняя часть разметки / изображения была взята в тестовый набор. Верхняя часть изображения была разделена на равные части между наборами поездов и проверок.
Распределение складывается по количеству:

  1. поезд: 478, вал: 77
  2. поезд: 431, вал: 124
  3. поезд: 444, вал: 111
  4. поезд: 416, вал: 139

Каналы: RGB.

Гиперпараметры:

  • Оптимизатор Адама (lr = 1e-3)
  • Планировщик (этапы = [10, 20, 40], гамма = 0,3)
  • Эпохи = 100 (мы тестировали 500 и 700 - и модель была переоборудована)
  • Размер партии = 8
  • Функция потерь - двоичная кросс-энтропия в сочетании со счетом игральных костей. (bce_weight = 0,2, dice_weight = 0,8)

Дополнения:

  • Случайные вращения
  • Случайная горизонтальная
  • Вертикальный флип
  • RGBShift
  • CLAHE

Mertics:

  • Тренировка складками
  1. Игра в кости = 0,6543
    Убыток = 0,2936
  2. Игра в кости = 0,6496
    Убыток = 0,3002
  3. Игра в кости = 0,6876
    Убыток = 0,2650
  4. Игра в кости = 0,6667
    Убыток = 0,2849
  • Проверка по складкам
  1. Игра в кости = 0,6259
    Убыток = 0,3251
  2. Игра в кости = 0,5970
    Убыток = 0,3421
  3. Игра в кости = 0,6801
    Убыток = 0,2802
  4. Игра в кости = 0,6363
    Убыток = 0,3080
  • Тест
    Dice = 0,5643

Интернет Сервис

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

Программа находит и классифицирует сплошные вырубки за указанный период времени. Таким образом, пользователи могут легко узнать старые и новые.

Данные отображаются на OpenStreetMap (пока только по одному региону). Здесь мы можем найти следующие классы сплошных рубок:

  1. Желтый многоугольник - зона вырубки леса, которая не меняется в течение заданного периода времени.
  2. Красный многоугольник - зона, где обнаружена повышенная площадь вырубки леса.
  3. Серый многоугольник - зоны с неопределенностью в отношении сплошных рубок. Раньше были сплошные рубки, а сейчас их нет. Облака и другие переменные факторы могут влиять на прогнозы модели.

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

Заключение

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

Сервис ClearCut: clearcut.quantumobile.com
Репозиторий Git: github.com/QuantuMobileSoftware/clearcut_detection

Автор Никита Лузан
Вычитка Надежда Пивовар, Клим Ямковый