Нам нужно спасти легкие нашей планеты

Амазонка является домом для одного миллиона коренных жителей и трех миллионов видов растений и животных. Площадь биома Амазонки составляет 6,7 миллиона км² (вдвое больше, чем у Индии), он не имеет себе равных по масштабу, сложности и возможностям, и это действительно регион, отличающийся превосходной степенью.

В августе 2019 года исследование Национального института космических исследований (INPE) показало, что количество лесных пожаров Амазонки на 84% больше по сравнению с 2018 годом. Большинство этих пожаров можно отнести к региональной вырубке лесов, темпы которой резко возросли в 2019 году, что привело к разрушительные вспышки пожара в августе, разрушившие часть одного из самых важных хранилищ углерода, оставшихся на планете. Важно понимать место обезлесения и посягательства человека, чтобы обеспечить быстрое реагирование и ограничить дальнейший ущерб экосистеме.

Как машинное обучение / глубокое обучение помогает в наших усилиях по сохранению?

Ранее усилия по отслеживанию в основном полагались на изображения с низким разрешением, полученные со спутника Landsat (30-метровые пиксели). Однако развитие спутниковых изображений и машинного обучения (ML) приблизило нас к обнаружению мелкомасштабной вырубки лесов и различению антропогенных и естественных причин деградации.

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

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

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

Члены нашей команды - Айшвария Павар, Ананья Гарг, Оньекачи Уго, Сачин Балакришнан и Сахана Субраманиан.

I. Набор данных

Planet Labs, частная компания, занимающаяся съемкой Земли, которая разрабатывает спутники наблюдения Земли для захвата участков Земли, имеет маркированный набор данных о земных поверхностях на Kaggle.

Набор данных был составлен, начиная с начального набора сцен, которые охватывали все явления, которые Planet хотела продемонстрировать, и которые охватывали территорию в тридцать миллионов гектаров. Эти сцены были обработаны для создания чипов JPG размера (256, 256, 3) с каналами, представляющими R, G, B и 4-полосные чипы TIF, причем четвертый канал является инфракрасным.

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

Набор данных был разделен на два набора по 40 479 обучающих выборок и 61 192 тестовых выборки. Мы рассматриваем это как проблему классификации с несколькими метками, чтобы пометить каждое изображение одной или несколькими из 17 меток, которые указывают на атмосферные условия, растительный покров и землепользование.

II. Изучение данных

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

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

Из распределения меток мы видим, что он очень несбалансирован с некоторыми действительно распространенными метками, такими как первичные и прозрачные, и некоторыми метками, которые встречаются очень редко. Например, метка - Traditional_mines встречается всего в 99 изображениях (0,2% от общего числа обучающих изображений).

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

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

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

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

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

Мы изменили размер наших изображений до 128 x 128 x 3 и нормализовали значения пикселей, чтобы они были между 0 и 1 перед обучением наших моделей. Кроме того, мы увеличили изображения с помощью Keras ImageDataGenerator, который включал несколько горизонтальных и вертикальных переворачиваний, масштабирования и поворота изображений для более точных прогнозов на будущее. Это гарантирует, что модель будет подвергаться воздействию множества обучающих изображений и не будет чрезмерно тренироваться на какой-либо конкретной части изображения. Keras ImageDataGenerator применяет эти изменения случайным образом для каждого пакета, гарантируя, что модель каждый раз видит разные изображения.

IV. Метрики оценки

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

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

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

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

Наконец, чтобы контролировать точность и отзывчивость, мы использовали оценку F-beta в качестве основного показателя оценки. Мы использовали β как 2, потому что нам нужно было уменьшить влияние ложноотрицательных результатов.

Обобщенная формула: (1 + β²) * pr / (β²p + r).

V. Настройка гиперпараметров

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

  • Функция потерь: двоичная кросс-энтропия для 17 меток с горячим кодированием
  • Функция активации: функции активации Sigmoid и ReLu. Для последних плотных слоев с 17 нейронами мы использовали сигмовидную активацию для получения вероятностей прогноза.
  • Оптимизатор: стохастический градиентный спуск (SGD) и Адам
  • Количество эпох
  • Количество слоев нейронной сети
  • Темпы обучения
  • Частота выпадения: скорость, с которой набор нейронов выпадает из слоя, чтобы избежать переобучения.

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

Мы начали наш анализ на Google Colab, параллельно настраивая Google Cloud Platform (GCP). Мы взяли разнообразную выборку из 200 изображений (со всеми включенными ярлыками) и начали поисковый анализ в Google Colab. На начальном этапе нашего проекта мы выяснили гиперпараметры для CNN и модели трансферного обучения, перетренировав эти модели для нашего размера выборки. Позже, при масштабировании модели на GCP, мы инициализировали модели с гиперпараметрами, которые мы получили ранее. В некоторых случаях нам приходилось настраивать его дальше, но эти гиперпараметры были хорошим началом для наших моделей.

VI. Модели

Мы начали с создания базовой сверточной нейронной сети (CNN), чтобы увидеть, как она работает с нашим набором данных.

CNN

Мы построили 10-слойную CNN с увеличивающимся количеством фильтров. В наших первых двух слоях было 32 фильтра, за ними следовали два слоя по 64 фильтра и, наконец, шесть слоев по 128 и 256 фильтров. Эта архитектура была разработана после множества проб и ошибок, и эта комбинация лучше всего сработала для нашей проблемы.

Перед увеличением количества фильтров мы выпали 10% наших узлов. Это упорядочивает набор предшествующих ему слоев, тем самым предотвращая переоснащение нашей модели. На этом этапе мы также выполнили max pooling.

Нашей последней функцией активации была Sigmoid, и мы использовали оптимизатор Adam. Окончательный результат F-beta этой модели составил 0,792.

#hyperparameters for CNN
BATCH_SIZE = 128
DROPOUT_RATE = 0.1
EPOCHS = 25
LR = 0.0001 #learning rate
REG_STRENGTH = 0.01
NFOLDS = 5

VGG16

Одной из первых опробованных нами моделей трансферного обучения была модель VGG16. Это сверточная нейронная сеть, которая была предложена во время конкурса Imagenet 2014 года и получила высокую оценку за свои прорывные результаты. Если вы новичок в мире глубокого обучения (как и мы, когда начинали приключение!), Вы можете просмотреть более подробную информацию о задаче Imagenet здесь - ссылка

VGG использует архитектуру CNN, в которой преобладают сверточные фильтры очень маленького размера (3x3) с шагом 1 и используются уровни заполнения и maxpool с шагом 2. VGG16 имеет большое количество гиперпараметров с глубиной сети, увеличенной до 16–19 уровней.

Мы использовали 16-слойную версию - VGG16, которая дала хорошие результаты на подмножестве данных (мы запускали ее в Google Colab), поэтому мы решили обучить модель со всем набором данных в Google Cloud Platform (GCP). Используя 5-кратную перекрестную проверку и 24 эпохи во время фазы обучения, окончательный результат Kaggle F-beta на тестовой выборке из 60 тыс. Изображений составил 0,92595.

#hyperparameters for VGG16
BATCH_SIZE = 128
DROPOUT_RATE = 0.5
EPOCHS = 25
LR = 0.0001 #learning rate
REG_STRENGTH = 0.01
NFOLDS = 5

RESNet

После утомительной реализации VGG16 из-за трех полностью связанных уровней, мы решили перейти к RESNet, чтобы воспользоваться преимуществами «ярлыка идентификации». С увеличением количества слоев обучение глубоких сетей стало затруднительным из-за проблемы исчезающего градиента. Еще одна проблема с глубокими слоями связана с большим количеством параметров, добавление большего количества слоев для оптимизации увеличит ошибку обучения. RESNet вводит ярлыки идентификации, пропускающие один или несколько уровней.

RESNet имитирует ансамбли, поскольку некоторые соединения пропускаются, а разные сигналы обучаются с разной скоростью в зависимости от того, как ошибка передается в сети. После настройки параметров этой модели трансферного обучения мы получили точность 86,25%, что почти равно базовой точности. Кроме того, модель не могла эффективно предсказать редкие метки, и поэтому мы не включили эту модель в наш окончательный ансамбль.

Более подробную информацию можно найти на Реснете - ссылка

#hyperparameters for RESNet
BATCH_SIZE = 256
DROPOUT_RATE = 0.5
EPOCHS = 25
LR = 0.0001 #learning rate
REG_STRENGTH = 0.01
NFOLDS = 2

MobileNet

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

MobileNet использует разделимые по глубине свертки в отличие от стандартной свертки. Разделимая по глубине свертка делит свертки на две части:

  1. Глубинная свертка - это пространственная свертка Dk x Dk по каналам, что означает, что она применяет один фильтр к каждому из трех входных каналов, которые у нас есть (R, G и B).
  2. Точечная свертка - это сверточный слой 1x1, который используется для объединения результатов глубинной свертки.

Основное различие между MobileNet и «традиционной» CNN состоит в том, что стандартная свертка фильтрует и объединяет входные данные в новый набор выходных данных за один шаг. Разделимая по глубине свертка разделяет это на два слоя: отдельный слой для фильтрации и отдельный слой для объединения.

Мы использовали предварительно обученную модель Keras и использовали трансферное обучение для обучения наших изображений и использовали 5-кратную перекрестную проверку. Мы обучили модель для 25 эпох, но обнаружили, что потеря валидации не сходится. Мы увеличили размер эпохи до 50 и обнаружили, что она лучше сходится с оценкой F-beta 0,9244.

#hyperparameters for MobileNet
BATCH_SIZE = 128
DROPOUT_RATE = 0.5
EPOCHS = 50
LR = 0.0001 #learning rate
REG_STRENGTH = 0.01
NFOLDS = 2

VII. Удаление дымки

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

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

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

Приоритет темного канала рассчитывается путем первого взятия произвольного изображения J с определенным размером изображения и выбранным размером пятна (скажем, 15 x 15). Для каждого пикселя мы вычисляем минимальное из его значений (R, G, B), после чего применяется другой минимальный фильтр, чтобы выбрать локальный патч с центром в пикселе.

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

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

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

Мы обучили новую модель с недавно обработанными изображениями после удаления дымки и увидели действительно многообещающие результаты, особенно в отношении некоторых редких меток, таких как кустарная мина, косая горка и т. Д., Которые ранее имели отзыв на 1%, увеличились. до 48% и 92%.

VIII. Классовый дисбаланс

Как отмечалось ранее, у нас есть классы, которые составляют менее 0,2% наших меток. Мы реализовали следующие несколько стратегий, чтобы решить эту проблему.

XGBoost

Известный своей способностью стимулировать слабых учеников, XGBoost обычно дает лучшую точность при несбалансированных данных. И наша интуиция использовать эту модель для улучшения запоминания оказалась правильной! Преодолев сложнейшую задачу настройки параметров модели, мы смогли улучшить отзыв для редких этикеток. Благодаря усовершенствованию алгоритмов и систематической оптимизации XGBoost это оказалась наша самая быстрая модель с оценкой F-beta 0,882.

"Редкий" CNN

XGBoost был моделью для большинства Kagglers, когда дело дошло до классового дисбаланса. Поскольку до сих пор не было особого «повышения» производительности нашей модели, мы искали другие варианты решения проблем меньшинств. Неудивительно, что на помощь снова пришли сверточные нейронные сети, на этот раз мы называем это «Редкими CNN».

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

Этап обучения
Самым первым требованием было обучить модель на равном количестве «редких» и «нередких» изображений. Многие редкие метки, как правило, сосуществуют, поэтому в общей сложности у нас было только 2180 «редких» изображений из 40 000 обучающих данных. Мы извлекли все изображения, содержащие редкие метки, а также равное количество случайных выборок «нередких» изображений. После необходимой предварительной обработки мы использовали отдельный VGG16 и обучили эти данные, чтобы классифицировать изображение только на основе редких меток. Вектор метки (значение y в контролируемом обучении), на котором обучалась модель, имел длину 7, причем каждый элемент соответствовал присутствию редкой метки (в том же порядке, как показано ниже).

Например:

  1. Входное изображение с меткой - цветение чистое культивирование жилья первичное slash_burn будет обучено метке vector [0, 0, 1, 0, 0, 0, 1]. Обратите внимание, что ясно, выращивание, проживание и первичный - не редкость здесь.
  2. Входное изображение с меткой - сельское хозяйство, чистое жилье, первичная дорога будет обучено метке вектора [0, 0, 0, 0, 0, 0, 0]. Обратите внимание, что ни один из ярлыков здесь не является редким
  3. Входное изображение, имеющее все 7 редких меток (просто для информации, у нас не было такой комбинации), будет обучаться на векторе меток [1, 1, 1, 1, 1, 1, 1]

Прогноз
Прогнозы для конкретного входного изображения снова будут вектором длины 7 - каждый из элементов соответствует индивидуальной вероятности одной из 7 редких меток. Ниже показана архитектура модели:

Одни и те же данные изображения будут загружены в обе модели - основной CNN и «Rare» CNN. Выходные данные вероятности модели, которая обнаруживает редкие метки, используются для увеличения вероятностей редких меток соответствующих изображений из основного выхода CNN.

Этот подход помог значительно повысить способность нашей модели обнаруживать и прогнозировать редкие метки, о чем свидетельствует повышение точности и F1-баллов для редких меток, как показано ниже:

IX. Резюме модели

После того, как мы обучили все наши индивидуальные модели, мы создали ансамбль из наиболее эффективных перед тем, как сделать окончательную отправку Kaggle. Окончательный результат F-beta, который мы получили с ансамблем, составил 0,9257. Несмотря на то, что этот результат был немного ниже, чем у нашей индивидуальной модели с лучшими характеристиками, нам удалось повысить точность и запоминаемость редких этикеток.

X. Заключение

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

  1. Мы познакомились с облачной платформой Google, чтобы настроить виртуальные машины (ВМ) и загрузить наш огромный набор данных в облако.
  2. Устранение неполадок в моделях глубокого обучения - сложная задача, особенно если у вас большой объем обучающих данных. Рекомендуется начать обучение вашей модели на небольшом подмножестве изображений и достичь базовой точности. Сокращенный набор данных поможет вам понять влияние различных гиперпараметров модели на выходные данные.
  3. После того, как мы реализовали начальные модели, такие как CNN, RESNet и VGG16, мы выполнили дополнительные шаги предварительной обработки, такие как удаление дымки, и смогли улучшить общую производительность. Это помогло нам еще больше понять важность предварительной обработки изображений для обеспечения точности.
  4. Мы узнали, что повторное обучение нашей модели не является решением для достижения более высокой точности. Поиск оптимального набора гиперпараметров более важен для повышения предсказательной силы модели.

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

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

Полный исходный код доступен на Github - ссылка.

Ссылки