Использование консольного DTclassifier для классификации растровых данных и анализа изменений
Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[1]. Расширение использует метод деревьев решений реализованный на основе библиотеки OpenCV. Подробнее о работе расширения написано здесь [2].
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать консольную версию плагина. Что и было реализовано командой NextGIS
Создано в | Веб ГИС для вашей организации по доступной цене |
Получение и установка
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.
Бинарная сборка
Для работы с программой в ОС Windows можно пойти двумя путями:
- загрузить и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.
или
- загрузить и установить QGIS версии 2.8 или выше (подробнее)
- загрузить архив с расширением и необходимыми библиотеками
- извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)
После установки, в окне OSGeo4W shell наряду с другими функциями (GDAL) и (OGR)
появится функция classifier.
Исходный код
Исходный код модуля (лицензия GNU GPL v2) можно получить через репозиторий на GitHub, или выполнив команду:
git clone git@github.com:nextgis/dtclassifier.git
Тестовые данные
Загрузить архив c данными, использовавшимися при подготовке статьи (... Мб).
Работа с расширением
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, расширяющих функциональность приложения.
classifier.bat
- запуск расширения
Основные опции
--input_rasters
- пути к растровым данным (ВАЖНО! необходимо указывать полные пути к файлам) разделенные пробелом
--presence
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.
--absence
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.
--classify
путь для сохранения результата классификации
Дополнительные опции
--save_points
- сохраняет точки полученные из обучающих данных в виде шейп файла с атрибутивнлой таблицей значений растров
--save_model
- сохранить модель (дерево решений или модель random forest) в файл (.yaml)
--use_model
- использовать существующую модель. При этом параметры --presence и --absence игнорируются. (ВАЖНО! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)
--use_decision_tree
- использовать дерево решений (по умолчанию используется random forest)
--discrete_classes
- При использовании одиночного дерева (--use_decision_tree) становится что исходные данные будут трактоваться как набор дискретных величин (классов). Если флаг не установлен, то исходные данные трактуются как непрерывные (регрессионная модель).
--generalize
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).
--load_points
- использовать существующие точки для создания модели и классификации!!! еще не реализовано..
Примеры использования
Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. разбиты по директориям (data/<path/row>) и классификация проводится последовательно для каждого path/row. Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)
Пример рубки (рис.3)
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT. Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:
classifier.bat --presence d:\trainings\cut1.shp --absence d:\trainings\nochange.shp --input_rasters d:\data\113027\113027_16055.tif d:\data\113027\113027_15020.tif --save_points --save_model d:\data\113027\model.aml --classify d:\data\113027\113027_dtclass.tif --generalize 3
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий или cоздать скрипт (например на python):
Пример скрипта для обработки нескольких сцен
# -*- coding: UTF-8 -*-
import os
import glob
# path to data
datadir='d:\data'
# path to training
traindir='d:\\trainings'
# presence
presence=os.path.join(traindir,'cut1.shp')
# absence
absence=os.path.join(traindir,'nochange.shp')
for subdir, dirs, files in os.walk(datadir):
scenes=glob.glob(os.path.join(subdir, '*.tif'))
if scenes == []:
continue
else:
scenes=' '.join(scenes)
output=os.path.join(subdir, 'res/out.tif')
model=os.path.join(subdir, 'out_rfmodel.yaml')
# command DTclassifier
command= 'classifier.bat --input_rasters %s --save_points --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,model,presence,absence,output)
#run command
os.system(command)
}
Запустим скрипт в OSGeo4W shell:
После выполнения операции в каждой поддиректории будут созданы два растра результатов (out.tif и out_smooth.tif). Векторный слой точек и сохраненная модель (out_rfmodel.yaml). Результат классификации
Выборочная рубка
Пример 2. Cоздание объединенной модели классификации
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель которую затем можно применит ко всему массиву данных.
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row существует свой набор треннигов и отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном случае мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применим ее к каждой поддиректории.
Для этого создаим объединенный слой точек train_points.shp просто объединив 113027/out_train_points.shp и 112027/out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием. (рисунок)
Затем создадим модель (рисунок)
И применим ее последовательно к данным, используя аналогичный предыдущему скрипт: (скрипт)
Теперь в каждой поддиректории добавился результат классификации (out1.tif и out1_smooth.tif) Сравним с предыдущим результатом
(картинка)
Пример 3. Cоздание модели облачности на основе сырых данных Landsat
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat). ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели данные лучше сначала перевести в toar reflectance.