Статьи

Выделение объектов на данных дистанционного зондирования с помощью нейросетей и ArcGIS Pro

2025-09-02 13:34 ГИС БПЛА и ДЗЗ
Время прочтения: 7 мин
Необходимо: ПК или ноутбук с дискретной видеокартой и, желательно, с операционной системой Windows (иначе вам при обучении нейросети будет выдавать ошибку); ArcGIS Pro версии 3.0 и выше; от 30-40 Гб свободной памяти
Нейросети сегодня находят все большее применение в географических задачах, а потому все чаще попадают в поле зрения ГИС-специалиста. Одной из наиболее заметных задач в геопространственном анализе, где применяются нейросети, является задача выделения объектов.
В этой статье мы хотим осветить, как компания Esri в ArcGIS Pro сделала выполнение этой задачи максимально простой и доступной для любого пользователя ГИС. Так, у нас в научной работе стояла задача максимально упростить и автоматизировать выделение куртин на ортофотопланах. Это было необходимо для Ботанического института РАН им. В.Л. Комарова для мониторинга вулканогенных сукцессий на лавовых потоках и пеплово-шлаковых полях на плато Толбачинский дол на Камчатке. Это плато за последние полвека пережило два мощных извержения, в 1975-1976 гг. и в 2012-2013 гг. Первое из них входит в шестерку самых мощных извержений на Земле, происходивших в историческое время. Сотрудники института периодически летают на Толбачинский дол, чтобы фиксировать динамику растительности, закладывая пробные площади на различных участках плато и снимая эти площади с квадрокоптеров.
Итак, чтобы начать выделять объекты, нам в первую очередь необходимо установить набор библиотек для глубокого обучения с сайта по ссылке для нашей версии.
Теперь можно приступать к подготовке shape-файла обучающей выборки. Создайте в этом shape-файле поле classvalue, и при создании полигонов вписывайте в него любое (но одинаковое) число. Если хотите определять на снимке сразу несколько типов объектов, отмечайте эти типы разными числами. Так, мы в качестве примера отрисуем куртины растений (в поле classvalue они у нас будут отмечены цифрой 1), а также приложенные к ним номерки на наших архивных ортофотопланах (мы их отметим цифрой 2).
Далее начните отрисовывать объекты. Помните, какие объекты бы вы ни выделяли — чем больше и чем тщательнее вы их разметите, тем точнее сработает нейросеть (но опасайтесь переобучения! — о нем ниже).
После того, как оцифровка окончена, нам необходимо конвертировать обучающие данные в формат наборов данных для глубокого обучения с помощью инструмента ArcGIS Pro экспорт обучающих данных для глубокого обучения (export training data for deep learning). Выбираем входной растр и создаем папку, куда мы сохраним преобразованные данные. В поле значений класса вводим classvalue; формат изображений выставляем tiff.
Размеры листа (tile size) по X и по Y — это размер кусочков, на которые разбивается изображение и на которых будет обучаться нейросеть. Необходимость разбивки связана с тем, что слишком тяжелые изображения со слишком большим количеством пикселей обучаться в ней не могут — здесь ограничениями выступают объем памяти графического процессора и сама архитектура нейросетей. Тем не менее, теоретически значения размеров листа могут быть любыми; при их выставлении стоит ориентироваться на средний размер выделяемых вами объектов и контекст, необходимый для их корректного обнаружения и точного выделения — он должен быть достаточным. Мы в нашем примере выставим размер в 256*256 пикселей.
Шаг (stride) по X и по Y — это величина сдвига при генерации кусочков изображения. Соответственно, чем он меньше, тем больше изображений у нас будет и тем лучше для каждого объекта будет учтен контекст. Кроме того, при небольшой величине сдвига маловероятна ситуация, когда какой-либо объект во всех изображениях захвачен не полностью (что ухудшает работу нейросети). Тем не менее, количество времени на обучение в таком случае будет затрачено больше. Мы выставим шаг по X и по Y в 128 пикселей, то есть каждый новый кусочек у нас будет включать половину предыдущего.
Систему привязки выберем пространство карты, формат метаданных — Маски RCNN. Последние привязаны к нейросетевой архитектуре Mask R-CNN, которая предназначена для выделения объектов и с которой мы с вами будем работать.
Далее нам необходимо перейти в блокнот Jupiter, встроенный в ArcGIS Pro.
Затем в открывшееся окно необходимо скопировать следующий код:
import os 
from pathlib import Path 
from arcgis.gis import GIS 
from arcgis.learn import MaskRCNN, prepare_data # Импортируем необходимые библиотеки
data = prepare_data(r'C:\Users\ваш путь папки с обучающей выборкой', batch_size=4, chip_size = 256) 
data.show_batch (rows=5) # Здесь мы можем просмотреть наши кусочки, на которых будет обучаться нейросеть. Параметр rows задаёт количество строк, которое мы просмотрим. Число кусочков в строке будет равно значению параметра batch_size.
model = MaskRCNN(data) # Применяем модель Mask R-CNN к обучающим данным 
model.fit(50) # Выставляем количество эпох для обучения модели 
import matplotlib as plt 
import matplotlib.pyplot as plt # Импортируем библиотеку matplotlib, необходимую для построения графиков
model.plot_losses() # Создаем графики train и valid loss 
plt.show() 
model.show_results()  
model.save('Numbers') # Сохранение модели в папку с обучающей выборкой. 'Numbers' – название модели
Модель создана.
В команде prepare_data() гиперпараметр batch_size (вы его встретите и при применении созданной модели) отвечает за размер пакета (и долю этого пакета от всего датасета), подаваемого нейросети. Аналогично с переменной размер листа, о которой мы писали выше, необходимость ввода гиперпараметра batch_size связана с ограничениями в графической памяти компьютера. Чем больше значение batch_size, тем точнее нейросеть будет выделять объекты, но тем больше времени будет затрачено и тем больший объем графической памяти потребует процесс. В нашем случае этот параметр будет задавать количество кусочков, которые нейросеть будет просматривать за один раз в рамках одной эпохи.
В команде model.fit() мы выставляем количество эпох. Эпоха в обучении нейронных сетей обозначает один полный цикл исполнения алгоритма и нахождения их определенных параметров. С каждой выполненной эпохой нейросеть все более подстраивается к входным данным. Тем не менее, большее количество эпох не всегда означает лучшее качество модели — с определенного момента алгоритм начинает все в большей степени учитывать незначительные признаки, присущие только входным данным, которые не имеют отношения к всему набору реальных данных. Например, при распознавании машин на изображении алгоритм все более воспринимает его фон как важную входную характеристику; очевидно, такая чрезмерная подстройка модели к входным данным, называемая переобучением, ухудшает качество модели. Таким образом, в любом процессе обучения нейросети важно найти оптимальное количество эпох, чтобы, с одной стороны, получить максимально точную модель, а с другой стороны — не переобучить ее.
Переобучение может иметь место при любом несоответствии входных и реальных данных — именно поэтому при разметке обучающей выборки стремитесь учитывать как соотношение различных типов объектов, так и характерные их особенности внутри одного типа сообразно вашей задаче. Так, например, при задаче выделения крыш в крупном городе у вас не должно быть в обучающей выборке много малых крыш одноэтажных частных домов. А при задаче определения крыш только одноэтажных частных домов, вероятно, не стоит выделять веранды, пристройки, присущие незначительной их части, если вы формируете небольшую выборку. Все это исказит ваши обучающие данные относительно реальных.
В команде model.plot_losses() создаются графики train и valid loss. Train и valid loss — это ошибки тренировочной (на которой модель обучается) и тестовой (на которой эта модель применяется) выборок. Они считаются для каждой эпохи. По динамике этих характеристик можно многое сказать как о процессе обучения, так и о самих обучающих данных и модели. Подробно останавливаться в рамках этой статьи на этих метриках мы не будем. Более детально о них можно прочитать, например, здесь. Обозначим лишь, что чем меньше эта ошибка — тем лучше. При этом крайне желательно, чтобы в вашей итоговой эпохе ошибка valid loss была не больше, чем ошибка train loss (таким образом вы избежите переобучения).
Теперь, когда мы сгенерировали модель, применим ее к нашим снимкам. Для этого найдем в ArcGIS Pro инструмент выявить объекты при помощи глубокого обучения (detect objects using deep learning). В поле определение модели выбираем наш результат обучения, путь к которому имеет следующий вид: ваша папка с моделью, которую вы создали на этапе формирования обучающей выборки/models/checkpoint_дата_epoch_N/ checkpoint_дата_epoch_N.dlpk(.emd).
Аргумент padding обозначает количество пикселов из смежных кусочков, которые будут учтены при работе нейросети; при высоком значении этого параметра она будет склонна «сглаживать» исходное изображение, усредняя значения пикселей с аномальными значениями (относительно соседних пикселей). Таким образом, выставление больших величин этой переменной может помочь, если вы, например, работаете с зашумленным снимком.
Аргумент threshold задает вероятностное (от 0 до 1) значение порога уверенности выделения объектов нейросетью. Объекты, значение уверенности выделения которых ниже этого порога, отображены не будут.
Аргумент return_bboxes определяет, будут ли выделенные объекты заключены в рамку. Мы у себя при выделении куртин и их номерков на ортофотопланах выставим значение padding = 64, threshold = 0,1 (чтобы все обнаруженные нейросетью объекты отобразились на нашем экране), выделение рамок в параметре return_bboxes отключим.
Как итог, у нас вот так выделило наши куртины и приложенные к ним номерки:

Источники и дополнительные материалы:

Материал подготовили Никита Максимович и Артем Тарасов
E-mail адреса для связи: nekit.maksimovich@mail.ru и artrar.90@mail.ru