<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.gis-lab.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Igg</id>
	<title>GIS-Lab - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gis-lab.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Igg"/>
	<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/w/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Igg"/>
	<updated>2026-05-18T22:04:06Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24832</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24832"/>
		<updated>2016-12-05T18:00:50Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений. &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе декстопной версии расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Обучающая выборка (тренинги) состоит из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (тренингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь следует пояснить, что при создании модели программа использует только те полигоны обучающей выборки которые пересекаются с указанными --input_rasters (если точнее, для всех остальных объектов, значения спектральных каналов будут равны нулю). Полигоны взяты из общего слоя, но для построения модели важны только те которые пересекаются с экстентом указанных в командной строке сцен. Количество каналов (bands) по которым строится модель равно сумме всех каналов сцен перечисленных в --input_rasters. Значения пикселей пересекающие полигоны (также можно использовать линии или точки) обучающей выборки (тренингов), на основе которых и строится модель классификации, можно сохранить в виде точечного слоя (опция  --save_points). Также можно сохранить и саму модель (опция --save_model). Для каждой поддиректории (path/row) модель будет уникальной, поскольку строится только на тех полигонах (из слоя cut1.shp) которые пересекаются со снимком. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть [http://gis-lab.info/qa/regress-r.html нормализованы].&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row создается отдельная модель для классификации. В нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории), поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные (--save_points) для создания общей для всех сцен модели и последовательно применим ее к каждой поддиректории с данными. &lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в значения излучения на сенсоре ([https://grasswiki.osgeo.org/wiki/Atmospheric_correction toar reflectance]).&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py здесь].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24831</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24831"/>
		<updated>2016-12-05T18:00:10Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений. &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе декстопной версии расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Обучающая выборка (тренинги) состоит из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (тренингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь следует пояснить, что при создании модели программа использует только те полигоны обучающей выборки которые пересекаются с указанными --input_rasters (если точнее, для всех остальных объектов, значения спектральных каналов будут равны нулю). Полигоны взяты из общего слоя, но для построения модели важны только те которые пересекаются с экстентом указанных в командной строке сцен. Количество каналов (bands) по которым строится модель равно сумме всех каналов сцен перечисленных в --input_rasters. Значения пикселей пересекающие полигоны (также можно использовать линии или точки) обучающей выборки (тренингов), на основе которых и строится модель классификации, можно сохранить в виде точечного слоя (опция  --save_points). Также можно сохранить и саму модель (опция --save_model). Для каждой поддиректории (path/row) модель будет уникальной, поскольку строится только на тех полигонах (из слоя cut1.shp) которые пересекаются со снимком. &lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть [http://gis-lab.info/qa/regress-r.html нормализованы].&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row создается отдельная модель для классификации. В нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории), поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные (--save_points) для создания общей для всех сцен модели и последовательно применим ее к каждой поддиректории с данными. &lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в значения излучения на сенсоре ([https://grasswiki.osgeo.org/wiki/Atmospheric_correction toar reflectance]).&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py здесь].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24830</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24830"/>
		<updated>2016-12-05T17:48:08Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений. &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе декстопной версии расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Обучающая выборка (тренинги) состоит из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (тренингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь следует пояснить, что при создании модели программа использует только те полигоны обучающей выборки которые пересекаются с указанными --input_rasters (если точнее, для всех остальных объектов, значения спектральных каналов будут равны нулю). Количество каналов (bands) по которым строится модель равно сумме всех каналов сцен перечисленных в --input_rasters. Значения пикселей пересекающие полигоны (также можно использовать линии или точки) обучающей выборки (тренингов), на основе которых и строится модель классификации, можно сохранить в виде точечного слоя (опция  --save_points). Также можно сохранить и саму модель (опция --save_model). Для каждой поддиректории (path/row) модель будет уникальной, поскольку строится только на тех полигонах (из слоя cut1.shp) которые пересекаются со снимком. &lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть [http://gis-lab.info/qa/regress-r.html нормализованы].&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row создается отдельная модель для классификации. В нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории), поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные (--save_points) для создания общей для всех сцен модели и последовательно применим ее к каждой поддиректории с данными. &lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в значения излучения на сенсоре ([https://grasswiki.osgeo.org/wiki/Atmospheric_correction toar reflectance]).&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py здесь].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24829</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24829"/>
		<updated>2016-12-05T17:46:44Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений. &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе декстопной версии расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Обучающая выборка (тренинги) состоит из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (тренингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь следует пояснить, что при создании модели программа использует только те полигоны обучающей выборки которые пересекаются с указанными --input_rasters (если точнее, для всех остальных объектов, значения спектральных каналов будут равны нулю). Количество каналов (bands) по которым строится модель равно сумме всех каналов сцен перечисленных в --input_rasters. Значения пикселей пересекающие полигоны (также можно использовать линии или точки) обучающей выборки (тренингов), на основе которых и строится модель классификации, можно сохранить в виде точечного слоя (опция  --save_points). Также можно сохранить и саму модель (опция --save_model). Для каждой поддиректории (path/row) модель будет уникальной, поскольку строится только на тех полигонах (из слоя cut1.shp) которые пересекаются со снимком. &lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть [http://gis-lab.info/qa/regress-r.html нормализованы].&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row создается отдельная модель для классификации. В нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории), поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные (--save_points) для создания общей для всех сцен модели и последовательно применим ее к каждой поддиректории с данными. &lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в значения излучения на сенсоре ([https://grasswiki.osgeo.org/wiki/Atmospheric_correctiontoar reflectance]).&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py здесь].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24828</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24828"/>
		<updated>2016-12-05T17:42:41Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений. &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе декстопной версии расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Обучающая выборка (тренинги) состоит из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (тренингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь следует пояснить, что при создании модели программа использует только те полигоны обучающей выборки которые пересекаются с указанными --input_rasters (если точнее, для всех остальных объектов, значения спектральных каналов будут равны нулю). Количество каналов (bands) по которым строится модель равно сумме всех каналов сцен перечисленных в --input_rasters. Значения пикселей пересекающие полигоны (также можно использовать линии или точки) обучающей выборки (тренингов), на основе которых и строится модель классификации, можно сохранить в виде точечного слоя (опция  --save_points). Также можно сохранить и саму модель (опция --save_model). Для каждой поддиректории (path/row) модель будет уникальной, поскольку строится только на тех полигонах (из слоя cut1.shp) которые пересекаются со снимком. &lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть [http://gis-lab.info/qa/regress-r.html нормализованы].&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row создается отдельная модель для классификации. В нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории), поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные (--save_points) для создания общей для всех сцен модели и последовательно применим ее к каждой поддиректории с данными. &lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py здесь].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24818</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24818"/>
		<updated>2016-11-27T18:08:46Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе декстопной версии расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py здесь].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24817</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24817"/>
		<updated>2016-11-27T18:07:13Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим), справа примеры снимка с результатом классификации (справа внизу) и без (справа вверху)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_trainigs_fin.jpg&amp;diff=24816</id>
		<title>Файл:Ex3 trainigs fin.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_trainigs_fin.jpg&amp;diff=24816"/>
		<updated>2016-11-27T18:05:21Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:Ex3 trainigs fin.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_result_fin.jpg&amp;diff=24815</id>
		<title>Файл:Ex3 result fin.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_result_fin.jpg&amp;diff=24815"/>
		<updated>2016-11-27T18:04:41Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:Ex3 result fin.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24814</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24814"/>
		<updated>2016-11-27T17:59:11Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках Landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24813</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24813"/>
		<updated>2016-11-27T17:58:10Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg|700px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отдельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации. Сверху-вниз примеры выявления выборочных рубок на снимках landsat до и после нарушения. Дата снимка - в верхнем левом углу.]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg|700px|thumb|center|Точечный слой треннингов на облачность]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg|700px|thumb|center|Результат классификации - маска облаков (синим)]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. &lt;br /&gt;
&lt;br /&gt;
Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24812</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24812"/>
		<updated>2016-11-27T17:45:24Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg|700px|thumb|center|Точечный слой треннингов для созданий модели]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg|700px|thumb|center|Точечный слой треннингов для отлельной рубки (пример)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg|700px|thumb|center|Результат классификации]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DTconsol_pic4.jpg&amp;diff=24811</id>
		<title>Файл:DTconsol pic4.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DTconsol_pic4.jpg&amp;diff=24811"/>
		<updated>2016-11-27T17:42:24Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:DTconsol pic4.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24810</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24810"/>
		<updated>2016-11-27T17:38:59Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Результат анализа изменений по снимкам Landsat слева - общий результат, справа примеры снимков до (декабрь 2015) и после (январь-февраль 2016) нарушения, и результат классификации]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg|700px|thumb|center|Пример выявления выборочной рубки]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic2res.jpg&amp;diff=24809</id>
		<title>Файл:Pic2res.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic2res.jpg&amp;diff=24809"/>
		<updated>2016-11-27T17:35:13Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:Pic2res.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic2res.jpg&amp;diff=24808</id>
		<title>Файл:Pic2res.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic2res.jpg&amp;diff=24808"/>
		<updated>2016-11-27T17:34:36Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:Pic2res.jpg»: Возврат к версии от 13:18, 20 ноября 2016&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic2res.jpg&amp;diff=24807</id>
		<title>Файл:Pic2res.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic2res.jpg&amp;diff=24807"/>
		<updated>2016-11-27T17:34:20Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:Pic2res.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24806</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24806"/>
		<updated>2016-11-27T17:31:17Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки (синим)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24805</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24805"/>
		<updated>2016-11-27T17:30:02Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки (синим)]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки (синим)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic1.jpg&amp;diff=24804</id>
		<title>Файл:Pic1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Pic1.jpg&amp;diff=24804"/>
		<updated>2016-11-27T17:28:26Z</updated>

		<summary type="html">&lt;p&gt;Igg: загружена новая версия «Файл:Pic1.jpg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24803</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24803"/>
		<updated>2016-11-27T17:27:55Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (январь 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24802</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24802"/>
		<updated>2016-11-27T17:26:50Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (февраль 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24801</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24801"/>
		<updated>2016-11-27T17:25:54Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]|700px|thumb|center|Создание обучающей выборки (треннингов) по снимкам Landsat до (декабрь 2015) и после (февраль 2016) вырубки]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24800</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24800"/>
		<updated>2016-11-27T17:18:01Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' - это простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив [http://nextgis.ru/nextgis-qgis/ NextGIS QGIS].&lt;br /&gt;
Расширение использует метод деревьев решений, реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее об установке и работе расширения написано [http://gis-lab.info/qa/dtclassifier.html здесь].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в процесс обработки изображений или для анализа большого количества данных, удобнее использовать консольную версию инструмента. Про нее и пойдет речь в этой статье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам), разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов, содержащие признак, который нужно выделить при анализе, разделенные пробелом. Например, для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов, т.е. объектам, от которых нужно отделить объекты, содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен, исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов, полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп-файла с атрибутивной таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующий точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой тренингов выходит за границы растра, то часть точек за границами создается с ненулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои тренингов состоят из двух шейп-файлов (сut1.shp - рубки, произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Тренинги находятся в отдельной директории (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл, в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или создать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Создание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер, поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, а в данном примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Структура входящих данных (число каналов или сцен) должна быть одинаковой для каждого блока данных, в отличие от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор тренигов и создается отдельная модель для классификации. Но в нашем случае количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровняет баланс между числом тренировочных точек, содержащих признак, и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер, поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстрирует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но также можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и тренингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции (и код), чтобы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера важно, чтобы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех тренингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где тренинги выходят за границы снимка, поэтому при объединении задана функция &amp;quot;использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0)&amp;quot;. При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании тренингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя тренингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами, и хотя по-прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автоматической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодаря простоте и относительно высокой производительности, позволит развивать свои проекты в области ДЗЗ не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24784</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24784"/>
		<updated>2016-11-21T17:24:19Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/0B-Sx9ICoBa2QZzlCR2tOZEgtWkE/view?usp=sharing Загрузить] архив c данными, использовавшимися при подготовке статьи (4.7Гб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере, слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но так же можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера, важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0). При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании треннингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24783</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24783"/>
		<updated>2016-11-21T17:05:40Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier ----use_train_layer и --use_model, которые позволяют собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере, слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но так же можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера, важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0). При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании треннингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24782</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24782"/>
		<updated>2016-11-21T16:58:55Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере, слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но так же можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Для данного примера, важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0). При использовании большего числа снимков необходимо будет учитывать и дату каждой отдельной сцены при создании треннингов, но в данном простом примере используются только неперекрывающиеся участки облачности. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24781</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24781"/>
		<updated>2016-11-21T16:00:59Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере, слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но так же можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нулевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24780</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24780"/>
		<updated>2016-11-21T15:59:51Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере, слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но так же можно использовать любые другие способы создания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, целиком скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24779</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24779"/>
		<updated>2016-11-21T15:57:37Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp). В данном примере, слои получены случайной выборкой из классифицированного до этого (другими методами) растра, но так же можно использовать любые другие способы сохдания тестовых объектов. &lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24778</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24778"/>
		<updated>2016-11-21T15:47:52Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp. Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif).&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера).&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация.&lt;br /&gt;
Результаты сохранены в директории ..DT\result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24777</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24777"/>
		<updated>2016-11-21T15:45:02Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (&amp;lt;path/row&amp;gt;train_points.shp) и модели (&amp;lt;path/row&amp;gt;model.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (&amp;lt;path/row&amp;gt;out1.tif и &amp;lt;path/row&amp;gt;out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции( и код) что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов - ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере -where Band_1 &amp;gt; 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing using ogr2ogr&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате - создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация&lt;br /&gt;
Результаты сохранены в директории /result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24776</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24776"/>
		<updated>2016-11-21T15:38:00Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере Band_1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате -  создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация&lt;br /&gt;
Результаты сохранены в директории /result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24775</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24775"/>
		<updated>2016-11-21T15:34:28Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
'''DT classifier''' простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS.&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. В примере используется расположение d:\DT. &lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_batch_classify.py] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Runscript.jpg]]&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере Band_1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате -  создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация&lt;br /&gt;
Результаты сохранены в директории /result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Runscript.jpg&amp;diff=24774</id>
		<title>Файл:Runscript.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Runscript.jpg&amp;diff=24774"/>
		<updated>2016-11-21T15:31:15Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DT_batch_classify.zip&amp;diff=24773</id>
		<title>Файл:DT batch classify.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:DT_batch_classify.zip&amp;diff=24773"/>
		<updated>2016-11-21T15:27:38Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24772</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24772"/>
		<updated>2016-11-21T15:19:30Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере Band_1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате -  создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация&lt;br /&gt;
Результаты сохранены в директории /result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create model&lt;br /&gt;
if os.path.isfile(os.path.join(traindir,merge_train_points)):&lt;br /&gt;
   try:&lt;br /&gt;
      merge_train=os.path.join(traindir,merge_train_points)&lt;br /&gt;
      command='classifier.bat --use_train_layer %s --save_model %s' % (merge_train,model)&lt;br /&gt;
      os.system(command)&lt;br /&gt;
   except IOError:&lt;br /&gt;
      False&lt;br /&gt;
&lt;br /&gt;
#classify&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out_cloud.tif')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (bands,model,output)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат автоматической обработки:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 result fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
В качестве заключения, можно сказать, что автоматизация задач обработки и классификации данных ДЗЗ развивается стремительными темпами и хотя по прежнему остается прерогативой крупных команд и организаций,&lt;br /&gt;
методы полу-автомтической и автоматической обработки становятся доступны и для более широкого круга пользователей. Данное расширение, благодяря простоте и относительно высокой производительности, возможно позволит развивать свои проекты в области ДЗЗ, не только профессиональным разработчикам, но и исследователям, только начинающим использовать языки программирования в своей работе.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_result_fin.jpg&amp;diff=24771</id>
		<title>Файл:Ex3 result fin.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_result_fin.jpg&amp;diff=24771"/>
		<updated>2016-11-21T14:55:06Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24770</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24770"/>
		<updated>2016-11-21T14:50:33Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические и BQA каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove BQA bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*BQA.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
	   &lt;br /&gt;
#remove panchromatic bands&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command) &lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере Band_1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате -  создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация&lt;br /&gt;
Результаты сохранены в директории /result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24769</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24769"/>
		<updated>2016-11-21T13:51:11Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove panchromatic channel&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере Band_1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате -  создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex3 trainigs fin.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;br /&gt;
&lt;br /&gt;
Заключительный этап - создание модели из объединенного слоя треннингов и классификация&lt;br /&gt;
Результаты сохранены в директории /result в двух файлах для каждого снимка, &amp;lt;имя исходного архива&amp;gt;..out_cloud.tif и ..out_cloud_smooth.tif (генерализованный)&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_trainigs_fin.jpg&amp;diff=24768</id>
		<title>Файл:Ex3 trainigs fin.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ex3_trainigs_fin.jpg&amp;diff=24768"/>
		<updated>2016-11-21T13:41:23Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24767</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24767"/>
		<updated>2016-11-21T13:38:24Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
'''ВАЖНО''': Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
'''Определение путей к данным и треннингам и импорт необходимых библиотек.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Распаковка и удаление ненужных каналов.'''&lt;br /&gt;
&lt;br /&gt;
В данном примере я просто удалил панхроматические каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove panchromatic channel&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Создание общего точечного слоя тренингов.'''&lt;br /&gt;
&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнут дублирующиеся точки с разными значениями класса объекта, но с одинаковыми значениями излучения в каналах снимка.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там, где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов (в данном примере Band_1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#create train points from selected scenes&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   bands=' '.join(bands)&lt;br /&gt;
	   train_points=os.path.join(traindir, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --presence %s --absence %s' % (bands,train_points,presence,absence)&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
&lt;br /&gt;
#merge trainings with null values removing&lt;br /&gt;
commandlist=[]&lt;br /&gt;
driver='ESRI Shapefile'&lt;br /&gt;
trainings=glob.glob(os.path.join(traindir, '*train_points.shp'))&lt;br /&gt;
for training in trainings:&lt;br /&gt;
	if commandlist == []:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; %s %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training)&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command1='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
	   commandlist.append(command1)&lt;br /&gt;
	else:&lt;br /&gt;
	   merge_train=os.path.join(traindir, merge_train_points)&lt;br /&gt;
	   #remove ext&lt;br /&gt;
	   merge_name = merge_train_points.split('.')[0]&lt;br /&gt;
	   command='ogr2ogr -f \&amp;quot;%s\&amp;quot; -update -append  %s %s -nln %s -where \&amp;quot;Band_1 &amp;gt; 0\&amp;quot;' % (driver,merge_train,training,merge_name)&lt;br /&gt;
	   commandlist.append(command)&lt;br /&gt;
&lt;br /&gt;
#run merge shp &lt;br /&gt;
#f = open('%s\com.txt' % (traindir), 'w')&lt;br /&gt;
for command in commandlist:&lt;br /&gt;
	#f.write(command+'\n')&lt;br /&gt;
	os.system(command)&lt;br /&gt;
#f.close()&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате -  создан точечный слой d:\DT\cloud_trainings\cloud_train_points.shp&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
'''Создание модели и классификация.'''&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24766</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24766"/>
		<updated>2016-11-21T13:18:48Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубок попала в изменения), что скорее всего связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности (или любой другой классификации) для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облаков (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Попробуем максимально автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
Для этого воспользуемся возможностями python, скрипт доступен здесь[https://github.com/IgorGlushkov/DT_classifier_utilities/blob/master/DT_cloud_model.py].&lt;br /&gt;
Разобьем обработку на несколько этапов:&lt;br /&gt;
&lt;br /&gt;
Определение путей к данным и треннингам и импорт необходимых библиотек.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
import tarfile&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\cloud_data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\cloud_trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cloud.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nocloud.shp')&lt;br /&gt;
#merge points&lt;br /&gt;
merge_train_points='cloud_train_points.shp'&lt;br /&gt;
#model&lt;br /&gt;
model='d:\DT\model\model_cloud.yaml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Распаковка и удаление ненужных каналов.&lt;br /&gt;
В данном примере я просто удалил панхроматические каналы, но конечно можно использовать и другие опции что бы сохранить эти данные для других задач.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#unzip in separate folders&lt;br /&gt;
scenes = glob.glob(os.path.join(datadir, '*gz'))&lt;br /&gt;
for scene in scenes:&lt;br /&gt;
    try:&lt;br /&gt;
		a = tarfile.open(scene)&lt;br /&gt;
		scene_name = scene.split('.')[0]&lt;br /&gt;
		a.extractall(path=os.path.join(datadir,scene_name))&lt;br /&gt;
		a.close()&lt;br /&gt;
    except IOError:&lt;br /&gt;
        False&lt;br /&gt;
		&lt;br /&gt;
#remove panchromatic channel&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	bands=glob.glob(os.path.join(subdir, '*B8.TIF'))&lt;br /&gt;
	if bands == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   command= 'rm %s' % (bands[0])&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание общего точечного слоя тренингов.&lt;br /&gt;
Здесь следует отметит, что создание обучающего слоя тренингов -ключевой момент, который определяет качество получаемой модели и классификации. Важно что бы тренинги с облаками не располагались в области перекрытия снимков, поскольку в этом случае возникнет дулирующиеся точки с разными значениями исзлучения в каналах. Для облачного снимкаи безоблочного в зоне перекрытия.&lt;br /&gt;
Также следует учитывать, что DT classifier собирает данные со всех треннингов последовательно для каждого снимка, что приводит к появлению большого числа нудевых значений там где треннинги выходят за границы снимка, поэтому при объединении задана функция использовать только ненулевые значения каналов.&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24765</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24765"/>
		<updated>2016-11-20T20:37:24Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
Данный пример иллюстриует возможность встраивания плагина в процесс обработки данных, например создание масок облачности для нескольких сцен, на основе общего слоя треннингов.&lt;br /&gt;
В директории DT\cloud_data находится три &amp;quot;исходных&amp;quot; сцены Landsat (..tar.gz - архивы), а в DT\cloud_trainings обучающие слои облкаов (cloud.shp) и необлачных участков (nocloud.shp).&lt;br /&gt;
Поробуем полностью автоматизировать процесс обработки и получения масок облачности для данных сцен.&lt;br /&gt;
&lt;br /&gt;
каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24764</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24764"/>
		<updated>2016-11-20T16:54:03Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24763</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24763"/>
		<updated>2016-11-20T16:35:56Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24762</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24762"/>
		<updated>2016-11-20T16:24:30Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out.tif')&lt;br /&gt;
	   model=os.path.join(result, str(os.path.basename(subdir))+'model.yaml')&lt;br /&gt;
	   train_points=os.path.join(result, str(os.path.basename(subdir))+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
#result&lt;br /&gt;
result='d:\DT\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(result, str(os.path.basename(subdir))+'out1.tif')&lt;br /&gt;
	   #command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\result добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24761</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24761"/>
		<updated>2016-11-20T16:06:46Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(datadir, str(subdir)+'out.tif')&lt;br /&gt;
           model=os.path.join(datadir, str(subdir)+'out_rfmodel.yaml')&lt;br /&gt;
           train_points=os.path.join(datadir, str(subdir)+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\data (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(datadir, str(subdir)+'out1.tif')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в директории d:\DT\data добавятся результаты классификации (...out1.tif и ...out1_smooth.tif)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24760</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24760"/>
		<updated>2016-11-20T16:04:12Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(datadir, str(subdir)+'out.tif')&lt;br /&gt;
           model=os.path.join(datadir, str(subdir)+'out_rfmodel.yaml')&lt;br /&gt;
           train_points=os.path.join(datadir, str(subdir)+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию d:\DT\data (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(subdir, 'out.tif')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в каждой поддиректории добавится результат классификации (out.tif и out_smooth.tif)&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24759</id>
		<title>Использование консольного DTclassifier для классификации растровых данных и анализа изменений</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_DTclassifier_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=24759"/>
		<updated>2016-11-20T15:29:53Z</updated>

		<summary type="html">&lt;p&gt;Igg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|Черновик}} &lt;br /&gt;
{{Аннотация|Описание и примеры использования консольной версии DTclassifier для классификации растровых данных.}}&lt;br /&gt;
&lt;br /&gt;
DT classifier простой в использовании и эффективный плагин для классификации растровых изображений &lt;br /&gt;
Декстопная версия расширения входит в дистрибутив QGIS-NextGIS[http://nextgis.ru/nextgis-qgis/].&lt;br /&gt;
Расширение использует метод деревьев решений реализованный на основе библиотеки [https://github.com/opencv/opencv/wiki OpenCV]. &lt;br /&gt;
Подробнее о работе расширения написано здесь [http://gis-lab.info/qa/dtclassifier.html].&lt;br /&gt;
&lt;br /&gt;
Плагин имеет удобный графический интерфейс, но для некоторых задач, например, &lt;br /&gt;
для встраивания алгоритмов классификации в workflow обработки изображений или для анализа большого количества данных удобнее использоывать&lt;br /&gt;
консольную версию плагина. Что и было реализовано командой NextGIS&lt;br /&gt;
&lt;br /&gt;
{{NextGIS}} &lt;br /&gt;
&lt;br /&gt;
=== Получение и установка ===&lt;br /&gt;
&lt;br /&gt;
Расширение доступно как в виде исходного кода C++, так и в бинарной форме.&lt;br /&gt;
&lt;br /&gt;
==== Бинарная сборка ====&lt;br /&gt;
&lt;br /&gt;
Для работы с программой в ОС Windows можно пойти двумя путями:&lt;br /&gt;
&lt;br /&gt;
* [http://nextgis.ru/nextgis-qgis/ загрузить] и установить NextGIS QGIS версии 15.4.88 или выше, DTClassifier включен в дистрибутив.&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
* загрузить и установить QGIS версии 2.8 или выше ([http://gis-lab.info/qa/qgis-osgeo4w.html подробнее])&lt;br /&gt;
* [http://nextgis.ru/programs/dtclassifier-qgis2.0.zip загрузить] архив с расширением и необходимыми библиотеками&lt;br /&gt;
* извлечь содержимое архива в каталог модулей QGIS (обычно это C:\OSGeo4W\apps\qgis-dev\plugins и C:\OSGeo4W\bin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После установки, в окне [https://trac.osgeo.org/osgeo4w/ OSGeo4W] shell наряду с другими функциями ([http://gdal.org GDAL]) и ([http://gdal.org OGR])&lt;br /&gt;
появится функция '''classifier'''.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== Исходный код ====&lt;br /&gt;
&lt;br /&gt;
Исходный код модуля (лицензия GNU GPL v2) можно получить через [https://github.com/nextgis/dtclassifier репозиторий на GitHub], или выполнив команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone git@github.com:nextgis/dtclassifier.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Тестовые данные ====&lt;br /&gt;
&lt;br /&gt;
[http://gis-lab.info/data/samples/ Загрузить] архив c данными, использовавшимися при подготовке статьи (... Мб).&lt;br /&gt;
&lt;br /&gt;
=== Работа с расширением === &lt;br /&gt;
Синтаксис расширения включает несколько обязательных параметров и ряд дополнительных, &lt;br /&gt;
расширяющих функциональность приложения.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic2a.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;classifier.bat&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- запуск расширения&lt;br /&gt;
&lt;br /&gt;
'''Основные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--input_rasters&amp;lt;/pre&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
- пути к растровым данным ('''ВАЖНО'''! необходимо указывать полные пути к файлам) разделенные пробелом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--presence &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям объектов содержащие признак который нужно выделить при анализе, разделенные пробелом. Например для природных экосистем: облака, водные объекты, рубки или пожары.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--absence&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- полные пути к векторным слоям фоновых объектов , т.е. объектам от которых нужно отделить объекты содержащие признак.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--classify&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
путь для сохранения результата классификации&lt;br /&gt;
&lt;br /&gt;
'''Дополнительные опции'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--decision_tree&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует дерево решений (по умолчанию используется random forest). ПРИМЕЧАНИЕ: Опыт показывает, что использование Random Forest существенно улучшает результат классификации&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--discrete_classes&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- Применяется при использовании одиночного дерева (--use_decision_tree). В этом случае, если флаг установлен исходные данные будут трактоваться как набор дискретных величин (классификационная модель). Если флаг не установлен, то используется регрессионная модель.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--generalize&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- размер окна для генерализации (kernel size). «Cглаживание» результатов классификации с настраиваемым размером окна. При включенном сглаживании будет создан не один, а два растра: классифицированный и сглаженный (имя содержит суффикс «_smooth»).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_train_layer &amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет слой тренингов полученный из обучающих данных (полигонов, линий и тд.) в виде точечного шейп файла с атрибутивнлой таблицей, включающей значения растров и классы обучающей выборки (1- presence,0 - absence)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--save_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- сохраняет модель (дерево решений или модель random forest) в файл (.yaml)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_model&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использовует существующую модель. При этом параметры --presence и --absence игнорируются.&lt;br /&gt;
('''ВАЖНО'''! количество и порядок каналов должен быть таким же как при создании модели, иначе результат будет некорректным)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--use_train_layer&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
- использует существующией точечный файл (полученный при помощи опции --save_train_layer) для создания модели. При этом игнорируются опции --presence и --absence. Также используется для создания модели, без последующей классификации. В этом случае достаточно просто игнорировать опции --classify и --input_rasters&lt;br /&gt;
&lt;br /&gt;
Также приведены примеры синтаксиса командной строки:&lt;br /&gt;
&lt;br /&gt;
Классификация.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Классификация c с использованием существующей модели.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --use_model model.yaml --classify result.tiff&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели (без классификации).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat  --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание модели на основе точечного слоя.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer train_points.shp --save_model model.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание точечного слоя тренингов.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --input_rasters rast1 [rast2, ...] --presence vect1.shp [vect2, ...] --absence vect1.shp [vect2, ...] --save_train_layer train_points.shp &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''TODO''': Проверить! Если слой треннингов выходит за границы растра, то часть точек за границами создается с не нулевыми значениями (+ errors при выполнении), которые приходится удалять вручную. &lt;br /&gt;
Возможно, это связано с топологией слоя, но проверка в QGIS не показала ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Примеры использования === &lt;br /&gt;
&lt;br /&gt;
==== Пример 1. Классификация сцен Landsat в batch режиме на основе общего слоя тестовых объектов ====&lt;br /&gt;
&lt;br /&gt;
Для выявления изменения лесного покрова в результате рубок в зимний период используется анализ изменений 2-х и более сцен Landsat. Если территория исследования занимает значительную площадь&lt;br /&gt;
и включает в себя несколько path/row спутника, то удобнее использовать консольную версию для проведения классификации в batch режиме. В данном примере, сцены Landsat за период 2015-2016 гг. &lt;br /&gt;
разбиты по директориям (data/&amp;lt;path/row&amp;gt;) и классификация проводится последовательно для каждого path/row.&lt;br /&gt;
Слои трениннгов состоят из двух шейп файлов (сut1.shp - рубки произошедшие за период наблюдения и nochange.shp - не изменившиеся территории). Треннинги находятся в отдельной дир-ии (trainings)&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Распакуем и сохраним на диске тестовые данные. Нпример d:\DT.&lt;br /&gt;
Снимки лежат в d:\DT\data, тренинги в d:\DT\trainings. Командная строка для классификации отдельного path/row:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --presence d:\DT\trainings\cut1.shp --absence d:\DT\trainings\nochange.shp --input_rasters d:\DT\data\113027\113027_16055.tif d:\DT\data\113027\113027_15020.tif --save_points --save_model d:\DT\data\113027\model.aml --classify d:\DT\data\113027\113027_dtclass.tif --generalize 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для обработки нескольких path/row можно создать .bat файл в котором последовательно записать командные строки для обработки всех директорий&lt;br /&gt;
или cоздать скрипт (например на python):&lt;br /&gt;
&lt;br /&gt;
Пример [http://wiki.gis-lab.info/w/%D0%A4%D0%B0%D0%B9%D0%BB:BatchDT.zip скрипта] для обработки нескольких сцен &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to training&lt;br /&gt;
traindir='d:\DT\trainings'&lt;br /&gt;
# presence&lt;br /&gt;
presence=os.path.join(traindir,'cut1.shp')&lt;br /&gt;
# absence&lt;br /&gt;
absence=os.path.join(traindir,'nochange.shp')&lt;br /&gt;
#resulrdir&lt;br /&gt;
resulrdir='d:\DT\result'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(resulrdir, str(subdir)+'out.tif')&lt;br /&gt;
           model=os.path.join(resulrdir, str(subdir)+'out_rfmodel.yaml')&lt;br /&gt;
           train_points=os.path.join(resulrdir, str(subdir)+'train_points.shp')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --save_train_layer %s --save_model %s --presence %s --absence %s --classify %s --generalize 3' % (scenes,train_points,model,presence,absence,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустим скрипт в OSGeo4W shell:&lt;br /&gt;
&lt;br /&gt;
После выполнения операции результаты будут сохранены в директорию result (генерализованые растры имеют суффикс _smooth.tif). Также будут сохранены векторные слои (точки) треннингов (суффикс - ..train_points.shp и модели (...out_rfmodel.yaml).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Результат классификации:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol_pic4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример выявления выборочной рубки:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic2res.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 2. Cоздание объединенной модели классификации ====&lt;br /&gt;
ВАЖНО: Этот пример носит скорее демонстрационный характер поскольку для создания реальной модели входящие данные должны быть нормализованы.&lt;br /&gt;
&lt;br /&gt;
Предыдущий пример фактически повторяет функционал декстопной версии, в этом же примере используются две новые функции DTClassifier --load_points и --use_model, которые позволяют&lt;br /&gt;
собирать тренировочные данные с отдельно выбранных сцен и на этой основе создавать модель, которую затем можно применить ко всему массиву данных. &lt;br /&gt;
&lt;br /&gt;
Cтруктура входящих данных (число каналов или сцен ) должна быть одинаковой для для каждого блока данных, в отличии от предыдущего примера, где число снимков / каналов в поддиректории может варьировать, поскольку для каждого path/row используется свой набор треннигов и создается отдельная модель для классификации. Но в нашем случае, количество каналов для каждого path/row одинаковое (2 снимка по 7 каналов в каждой поддиректории). Поэтому в данном примере мы используем сохраненные на предыдущем этапе точечные данные для создания модели и последовательно применяем ее к каждой поддиректории.&lt;br /&gt;
&lt;br /&gt;
Для этого создадим объединенный слой точек train_points.shp, просто объединив ..113027\out_train_points.shp и ..112027\out_train_points.shp в QGIS. Дополнительно можно убрать нулевые значения&lt;br /&gt;
что выровнять баланс между числом тренировочных точек содержащих признак и точками с его отсутствием.&lt;br /&gt;
&lt;br /&gt;
[[Файл:DTconsol pic6.jpeg]]&lt;br /&gt;
&lt;br /&gt;
Для отдельной рубки слой выглядит так:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 trainings1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраним объединенный слой точек в директорию d:\DT\model\points.shp Затем создадим модель, используя командную строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
classifier.bat --use_train_layer d:\DT\model\points.shp --save_model d:\DT\model\model_all.yaml &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И применим ее последовательно к данным, к примеру, используя скрипт (python):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
import os&lt;br /&gt;
import glob&lt;br /&gt;
&lt;br /&gt;
# path to data&lt;br /&gt;
datadir='d:\DT\data'&lt;br /&gt;
# path to model&lt;br /&gt;
model='d:\DT\model\model_all.aml'&lt;br /&gt;
&lt;br /&gt;
for subdir, dirs, files in os.walk(datadir):&lt;br /&gt;
	scenes=glob.glob(os.path.join(subdir, '*.tif'))&lt;br /&gt;
	if scenes == []:&lt;br /&gt;
	   continue&lt;br /&gt;
	else:&lt;br /&gt;
	   scenes=' '.join(scenes)&lt;br /&gt;
	   output=os.path.join(subdir, 'out.tif')&lt;br /&gt;
	   # command DTclassifier&lt;br /&gt;
	   command= 'classifier.bat --input_rasters %s --use_model %s --classify %s --generalize 3' % (scenes,model,output)&lt;br /&gt;
	   #run command&lt;br /&gt;
	   print command&lt;br /&gt;
	   os.system(command)&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После завершения, в каждой поддиректории добавится результат классификации (out.tif и out_smooth.tif)&lt;br /&gt;
Откроем результат в QGIS:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ex2 resmodel.jpg]]&lt;br /&gt;
&lt;br /&gt;
Цветом показаны результаты классификации на основе объединенной модели (красным) и модели для каждой сцены (синим - модель из предыдущего примера)&lt;br /&gt;
Следует отметить, что результат объединенной модели несколько хуже (меньшая площадь рубки попала в изменения), что связано с варьированием яркости между ненормализованными снимками.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Пример 3. Cоздание модели облачности на основе ''исходных'' данных Landsat ====&lt;br /&gt;
&lt;br /&gt;
ВАЖНО: Этот пример также носит скорее демонстрационный характер поскольку для создания реальной модели каналы лучше сначала перевести в toar reflectance.&lt;br /&gt;
&lt;br /&gt;
В данном примере, в каждой поддиректории структура данных не меняется (11 каналов Landsat).&lt;/div&gt;</summary>
		<author><name>Igg</name></author>
	</entry>
</feed>