GIS-LAB

Географические информационные системы и дистанционное зондирование

Классификация растровых данных при помощи DTclassifier для QGIS

Обсудить в форуме Комментариев — 90Редактировать в вики

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/dtclassifier.html


Описание и пример использования нового инструмента классификации растров.

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

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

DTclassifier (Decision Tree classifier) является расширением свободной ГИС QGIS, которое позволяет пройти все этапы классификации данных дистанционного зондирования не покидая ГИС. Расширение использует алгоритмы библиотеки компьютерного зрения OpenCV, а именно классификацию при помощи деревьев решений.

Видео-демонстрацию работы DTclassifier можно посмотреть тут.

Разработка расширения выполнена NextGIS в рамках проекта по мониторингу лесов сертифицированных FSC (Forest Stewardship Council).

Создано в Nextgis.png Разработка открытого ПО ГИС и реализация проектов

Содержание

[править] Получение и установка

Расширение доступно как в виде исходного кода C++, так и в бинарной форме.

[править] Бинарная сборка

Для работы с программой в ОС Windows можно пойти двумя путями:

  • загрузить и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.

или

  • загрузить и установить QGIS версии 2.8 или выше (подробнее)
  • загрузить архив с расширением и необходимыми библиотеками
  • извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)

После установки нужно запустить QGIS и активировать расширение DTclassifier в Менеджере модулей («Модули → Управление модулями»).

[править] Исходный код

Исходный код модуля (лицензия GNU GPL v2) можно получить через репозиторий на GitHub, или выполнив команду:

git clone git@github.com:nextgis/dtclassifier.git

[править] Тестовые данные

Загрузить архив c данными, использовавшимися при подготовке статьи (85 Мб).

[править] Работа с расширением

После подключения и запуска расширения с помощью кнопки

Dtclassifier-01.png

появится главное окно

Dtclassifier-02.png

[править] Выбор тренировочных данных

При помощи выпадающих списков «Feature presence layer» и «Feature absence layer» выбираюся тренировочные слои, отмечающие области, где соответственно присутствует (presence) или отсутствует (absence) интересующих нас признак. Эти слои создаются заблаговременно, перед началом классификации. Создавать их можно прямо в QGIS по снимкам, используя всю функциональность для работы с векторными и растровыми данными. Подробнее о создании векторных данных можно прочитать в Руководстве пользователя QGIS.

Расширение работает во всеми видами геометрий: точками, линиями и полигонами. Кнопка «+» рядом с каждым списком позволяет выбрать несколько слоёв с тренировочными данными одновременно, причем геометрии этих слоев могут быть различными.

Dtclassifier-03.png

Выпадающий список работает только если слой с тренировочными данными — один. При выборе нескольких слоёв выпадающий список блокируется и если необходимо вернуться к работе с одним слоем нужно нажать кнопку «+» еще раз.

Все исходные слои будут собраны в один точечный shape-файл. При этом точечные слои будут записаны «как есть», а линейные и полигональные объекты будут сконвертированы в точечные так, чтобы получить точки во всех пикселях, попадающих в полигон или на линию.

Например для полигонального слоя:

Dtclassifier-04.png

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

Пример для линейного слоя:

Dtclassifier-05.png

ВАЖНО! Правильные тренировочные данные — залог успеха. Необходимо внимательно следить за выбираемыми слоями. Если один и тот же слой отнести к обоим классам, результат классификации будет некорректным.

[править] Выбор классифицируемых данных

Поле «Raster(s) to classify» позволяет указать растр, который необходимо классифицировать. Поддерживается выделение нескольких растров с зажатым Shift или Ctrl, это может быть полезным при анализе изменений, когда используются растры «до» и «после». Если выбрано несколько растров, то тренировочные данные будут выбираться из каждого снимка.

ВАЖНО! При выборе нескольких растров необходимо убедиться, что на диске, где располагается временный каталог, достаточно места (объем свободного места должен быть примерно равен двойному объему анализируемых растров).

В поле «Output raster» указывается файл, в который будет сохранен результат классификации.

[править] Дополнительные настройки

Если установить флаг «Add result to map canvas», то по окончанию процесса результат классификации будет загружен в QGIS. Установка флага «Save point layer to disk» заставит расширение сохранить тренировочные данные в точечный shape-файл рядом с итоговым файлом. Для каждой точки в файл записываются значения каналов растра и класс, которому принадлежит точка. они могут быть использованы для построения модели и классификации в другом программном обеспечении.

Группа «Settings» служит для настройки классификации. Здесь можно выбрать используемый метод: одиночное дерево решений («Use decision tree») или ансамбль деревьев («Use random forest»). Обычно, классификация при помощи ансамбля деревьев дает более точные результаты. При использовании одиночного дерева становится доступным флаг «Output values are discrete class labels», установка которого приведет к тому, что исходные данные будут трактоваться как набор дискретных величин (меток). Если флаг не установлен, то исходные данные трактуются как непрерывные.

Здесь же можно активировать «сглаживание» результатов классификации с настраиваемым размером окна («Generalize result using kernel size»). При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).

Помимо результатов классификации расширение сохраняет в формате YAML используемое при классификации дерево (имя файла формируется из имени файла назначения и суффикса «_tree»).

Нажатие кнопки «Ok» запустит процесс извлечения тренировочных данных, обучение классификатора и собственно классификацию. Ход классификации отображается при помощи двух индикаторов: верхний отображает прогресс текущей операции, а нижний — общий прогресс.

[править] Пример: детектирование рубок

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

Процесс тематической классификации состоит из нескольких этапов:

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

[править] Поиск и подготовка растровых данных

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

Если вы хотите повторить пример, загрузите архив с исходными данными.

Для задачи детектирования рубок возьмем растр after.tif и выставим комбинацию каналов 5-4-3, чтобы было легче различать рубки (розовые на снимке).

Dtclassifier-06.png

[править] Сбор тренировочных данных

Для построения дерева решений необходимо подготовить тренировочные данные (т.н. «обучение с учителем»), содержащие объекты двух классов: присутствие и отсутствие рубок.

Нам необходимо как минимум два векторных слоя: один соответствующий рубкам, а второй — местам, где рубок нет. Так, можно создать два точечных слоя и расставить точки в нужных местах (на рисунке синие точки соответствуют рубкам, зеленые — отсутствие рубок).

Dtclassifier-07.png

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

Dtclassifier-08.png

Так как расширение поддерживает все типы геометрии (точки, линии, полигоны), то можно использовать несколько слоев одновременно. Загрузим слои рубок presence-poly.shp, presence-poi.shp (полигоны и точки соответственно) и аналогичные слои с данными об отсутствии рубок — absence-poly.shp, absence-poi.shp.

Если включить флаг «Save point layer to disk», то точечный слой, полученный из исходных тренировочных слоев, будет сохранен для дальнейшего использования. Например, сохранив атрибутивную таблицу в формат CSV, можно выполнить классификацию этого же растра в R (подробнее), а затем сравнить результаты.

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

[править] Классификация

После подготовки тренировочных слоёв и исходного растра можно приступать к анализу. Используя кнопки «+» рядом с выпадающими списками указываем тренировочные слои (наличие рубок — presence layer; отсутствие рубок — absence layer), в списке растров выбираем растр after.tif, указываем путь для сохранения результатов.

Так как значения пикселей растра являются непрерывными значениями, флаг «Output values are discrete class labels» активировать не нужно. А вот сглаживание («Generalize result using kernel size») стоит включить: это уберет «шумы» и сделает результат более четким. Размер окна по умолчанию (3) в большинстве случаев достаточен.

Нажатием на кнопку «Ok» запускаем классификацию. После непродолжительного ожидания получим два новых растра.

Фрагмент классифицированного растра:

Dtclassifier-09.png

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

Dtclassifier-10.png

Видим, что одиночных пикселей меньше, а границы рубок стали более четкими.

[править] Пример: анализ изменений

Еще одной задачей, которую можно решить при помощи DTclassifier является анализ изменений. Суть такого анализа состоит в том, что берется серия растров (в простейшем случае — пара) до и после некоторого события. Затем выделяются изменившиеся области.

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

Создадим новый проект в QGIS и загрузим оба растра: before.tif и after.tif. Как видно из названия, снимок before.tif выполнен до интересующего нас события (в данном случае — вырубка леса), а снимок after — после. Применив этот подход, мы можем выделить рубки появившиеся в промежуток между снимками «до» и «после».

Сбор тренировочных данных немного отличается от описаного в предыдущем примере. Если при тематической классификации данные набирались по принципу признак присутствует / признак отсутствует, то теперь данные отбираются по двум растрам. В слои изменений (presence) заносятся области, в которых признак присутствует на снимке «после», но отсутствует на снимке «до».

Dtclassifier-11.png
Dtclassifier-08.png

А вот слои отсутствия признака (absence) формируются, как и в предыдущем примере, из областей где на обоих снимках интересующий нас признак отсутствует.

В этом примере в качестве тренировочных данных будем использовать только полигональные слои presence-poly.shp и absence-poly.shp, разумеется, при необходимости допускается использование нескольих слоёв.

Вызовем главное окно DTclassifier, в выпадающих списках «Feature presence layer» и «Feature absence layer» выбираем слои presence-poly и absence-poly соответственно. В списке исходных растров, зажав Shift, выделяем оба растра before и after. Указываем куда сохранять результат, настройки классификации можно оставить без изменений. Нажатием на кнопку «OK» запускаем анализ и ждем его окончания.

Ниже показан фрагмент снимка до вырубки:

Dtclassifier-12.png

Тот же участок после рубки:

Dtclassifier-13.png

Результат анализа наложен на снимок предшествующий вырубке леса:

Dtclassifier-14.png

[править] Заключение

DTClassifier является достаточно простым и функциональным интегрированным расширением для решения задач классификации растровых данных на два класса (признак присутствует / признак отсутствует), а также для анализа изменений. Интеграция с QGIS позволяет быстро модифицировать тренировочные данные, и подбирать оптимальное их количество, а благодаря использованию библиотеки компьютерного зрения OpenCV расширение DTClassifier обладает высокой скоростью работы.

[править] Контакты

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

Создано в Nextgis.png Разработка открытого ПО ГИС и реализация проектов

[править] Ссылки по теме

Обсудить в форуме Комментариев — 90Редактировать в вики

Последнее обновление: 2016-11-22 12:15

Дата создания: 21.06.2011
Автор(ы): Александр Бруй, Максим Дубинин


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter