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

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

Набор данных

Planet Labs — компания, занимающаяся визуализацией Земли, которая разрабатывает и производит миниатюрные спутники. Полученный нами набор данных можно найти на Kaggle, он состоит из изображения тропического леса Амазонки, разбитого на тысячи фрагментов, каждый фрагмент имеет размер 256 x 256 пикселей. Продукт Planet для мониторинга с высоким разрешением способен ежедневно получать новые изображения, поэтому критически важным будет анализ этих изображений на высоких скоростях.

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

Построение сверточной нейронной сети

Известно, что сверточные нейронные сети (CNN) очень эффективны в задачах классификации изображений, и здесь мы сосредоточимся на них. Мы будем использовать несколько пакетов Python open-cv и scikit-learn для предварительной обработки изображений. Затем мы будем использовать пакет Keras вместе с бэкендом Tensorflow для построения сверточных нейронных сетей.

Во-первых, мы конвертируем наши тренировочные изображения в тензоры, в основном изображение может быть представлено набором значений пикселей, и, поскольку мы имеем дело с цветными изображениями, каждый пиксель имеет 3 канала (RGB). Нам нужны нормализованные значения пикселей, поэтому мы делим каждое значение пикселя на 255. В результате каждое изображение имеет входную форму (256, 256, 3).

Наша сверточная нейронная сеть, которую мы строим с нуля, имеет 3 сверточных 2D-слоя, каждый из которых будет использовать выпрямленную линейную единицу в качестве функции активации. Мы также собираемся использовать сверточное окно 3x3 (размер ядра) и удваивать количество фильтров по мере углубления сети. Между нашими сверточными слоями мы будем использовать слой максимального объединения, который уменьшит наши параметры наполовину. Наконец, выходной слой — это плотный слой, который будет соответствовать нашим 16 выходным классам, и будет использоваться сигмовидная функция активации. В целом эта нейронная сеть довольно проста и служит хорошим эталоном для этой задачи.

Мы обучили приведенную выше CNN рандомизированным весам и бинарной функции перекрестной энтропийной потери, используя экземпляр p2.large на AWS. Нам удалось получить показатель отзыва 0,72, показатель точности 0,79 и показатель F-бета 0,73. Это неплохо для такой простой нейронной сети!

Использование трансферного обучения

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

Эти предварительно обученные архитектуры CNN доступны в пакете Keras, и мы выберем модель ResNet50. Эти CNN обучены на наборе данных imagenet распознавать 1000 категорий повседневных объектов. Более ранние уровни этих сетей CNN также были бы очень применимы к нашей проблеме, а именно, они просто обнаруживают края и формы. Мы могли бы просто перенести знания из этих CNN на нашу проблему. Для этого мы берем модель ResNet50 и размораживаем веса последних слоев, замораживая веса начальных слоев. Мы заменяем выходной слой модели ResNet50 и адаптируем его к нашей задаче, добавляя плотный слой с 16 выходными классами (вместо 1000!).

Оценка и результаты

Обучение нашей модели трансферного обучения на графическом процессоре заняло около 8 часов! Но мы улучшили наши результаты. Мы получили показатель отзыва 0,83, показатель точности 0,89 и показатель F-бета 0,84. Наша оценка F-бета, которая является мерой как полноты, так и точности, придает большее значение полноте, поскольку мы хотим обнаружить все метки, присутствующие на этих изображениях, а не то, насколько точны эти классификации. Мы также создали здесь полезную визуализацию, чтобы убедиться, что наша модель не переоснащается. Графики ниже показывают, что и точность, и потери движутся в правильном направлении, учитывая наше количество эпох обучения.

Я включил весь исходный код этого проекта в следующий репозиторий Github: https://github.com/schhumanzhang/deforestation_deep_learning.

Существует также хорошее внешнее приложение, написанное под названием react.js, где вы можете загружать образцы спутниковых изображений с Planet и классифицировать их нашим CNN выше.