Реконструкция 3D-зданий из воздушного лидара с искусственным интеллектом: подробности

Авторы: Дмитрий Кудинов, Дэниэл Хеджес; Авторы: Омар Махер

В этом сообщении блога мы расскажем о проекте Proof-of-Concept, который мы реализовали здесь, в Esri, по реконструкции трехмерных моделей зданий из данных воздушного LiDAR с помощью глубоких нейронных сетей, в частности, модели Mask R-CNN, обученной обнаруживать и сообщать о случаях сегментов крыши различных типов. Мы расскажем о подготовке данных, обучении Mask R-CNN и достигнутой точности, рассмотрим архитектуру вывода и интеграцию TensorFlow и ArcGIS Pro 2.3 BETA, а также шаги, используемые для восстановления трехмерных моделей зданий на основе прогнозов.

Вступление

Ценность точных трехмерных моделей зданий для городов трудно переоценить, но современные подходы к сбору и хранению таких данных трудоемки, подвержены ошибкам и дороги. Мы объединились с Miami-Dade County и Nvidia в этом проекте, чтобы посмотреть, сможем ли мы оптимизировать этот рабочий процесс сбора данных или, по крайней мере, сделать его более рентабельным.

Рабочий процесс, традиционно используемый для восстановления трехмерных моделей зданий из воздушных LiDAR, относительно прост: облако точек LiDAR преобразуется в растр цифровой модели поверхности (DSM), который затем проверяется редакторами на предмет присутствующих зданий. Если здание найдено, один или несколько многоугольников, описывающих форму крыши здания, оцифровываются вручную, например если это большая вальмовая крыша с двумя двускатными выходами, то редактор будет рисовать три многоугольника (один вальм и два фронтона сверху). После того, как все крыши описаны таким образом, применяется набор процедурных правил ArcGIS для выдавливания моделей зданий с использованием оцифрованных вручную сегментов крыши с высотой и направлениями гребней, вычисленными из DSM.

Самый трудоемкий и дорогостоящий этап в описанном выше рабочем процессе - это ручной поиск и оцифровка полигонов сегментов крыши из растра DSM (средний редактор-человек оцифровывает около 70 сегментов крыши в час), и именно здесь мы решили помочь нашим пользователям. . В результате у нас теперь есть обученная сеть, которая может производить до 60 000 сегментов крыши в час с помощью одного графического процессора для этого географического региона! Конечно, прогнозы искусственного интеллекта не так точны, как прогнозы, оцифрованные людьми, но, с другой стороны, наличие уже достаточно близких автоматически сгенерированных сегментов может мгновенно повысить производительность редакторов-людей, требуя точной настройки предлагаемых искусственным интеллектом моделей. вместо того, чтобы оцифровать их с нуля.

Недавно мы опубликовали общий обзор этого проекта, поэтому, если вас интересуют более нетехнические подробности, вы можете найти их здесь.

Обучение

Подготовка данных

Как было упомянуто в обзорном посте выше, у нас было около 200 квадратных миль (~ 518 км²) воздушного LiDAR с 213 000 сегментов крыши, вручную оцифрованных редакторами-людьми. Каждый сегмент крыши представляет собой многоугольник одного из семи типов: плоский, двускатный, шатровый, навес, купол, свод и мансарда.

Сегменты крыши хранились как объекты в классе полигональных объектов в локальной файловой базе геоданных, тогда как облако точек LiDAR было преобразовано в одноканальный (32-битный) растровый слой с разрешением 2,25 квадратных фута (~ 0,21 м²) на пиксель с использованием Инструмент геообработки LAS Dataset to Raster.

Первоначально один канал растра LiDAR представлял высоты над уровнем моря - цифровую модель поверхности (DSM), которую мы затем нормализовали путем вычитания цифровой модели местности (DTM). Полученный растр nDSM содержал высоту над уровнем земли.

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

Создание обучающих, проверочных и тестовых наборов

После того, как слои nDSM и оцифрованные вручную слои сегментов крыши были готовы, мы запустили ArcGIS Pro 2.3 BETA-версию инструмента геообработки Экспорт обучающих данных для глубокого обучения, который экспортировал плитки и маски для задачи сегментации экземпляра (рис. 1) .

Инструмент записывает выходные плитки и маски в целевую папку с удобной структурой папок, которую с помощью небольшого скрипта можно легко подключить к платформе глубокого обучения. Плитки и маски в нашем случае представляли собой файлы GeoTIFF 512 x 512, содержащие чипы растеризованного LiDAR, и маски экземпляров для каждого типа крыши - изображения с одинаковым размером пикселя и значениями цветового канала, перечисляющие экземпляры определенного типа крыши, присутствующие в черепице ( Рис.2).

Полученный набор содержал около 19 000 уникальных образцов (тайл + маски) - не так много, учитывая сложность задачи и размер обучающих наборов похожих успешных проектов. Чтобы сохранить как можно больше обучающих выборок, мы разделили исходный набор на неперекрывающиеся подмножества обучения (95%), проверки (2%) и тестирования (3%). Традиционно образцы проверки использовались для проверки сходимости потерь в конце каждой эпохи обучения, тогда как набор тестов использовался только в конце каждого эксперимента.

Скромный размер обучающей выборки вызывал проблему из-за разной высоты зданий: здания в нашем интересующем регионе варьируются от одноэтажного сарая ниже 9 футов (~ 2,7 м) до 600 футов. (~ 183м) и выше. При таком разбросе по высоте нам просто не хватило образцов для эффективного обучения нейронной сети. Решение, которое мы нашли здесь, состояло в том, чтобы нормализовать каждый входной тайл, чтобы его одноканальный Float32 преобразовывался в три 8-битных целых беззнаковых диапазона, выделяя красную полосу для нормализованного значения высоты, зеленую и синюю полосы для нормализованных производных высоты - sobelX и sobelY соответственно (рис. 3). Такая нормализация сделала входной сигнал практически неизменным относительно высоты здания, хотя снизила точность небольших конструкций сверху и вокруг высоких зданий.

Увеличение данных

Тем не менее, даже с приведенной выше нормализацией результирующий обучающий набор из ~ 18 200 образцов был не таким большим, поэтому, чтобы продолжить обучение на большем количестве образцов, мы использовали традиционные методы увеличения изображения, в частности imgaug. Библиотека Python, основанная в основном на аффинных преобразованиях и флипах (рис. 4).

Загрузка обучающих данных и конфигурации маски R-CNN

Для нейронной сети мы выбрали одну из реализаций с открытым исходным кодом современной архитектуры Mask R-CNN.

От исходных документов Mask R-CNN и FPN наша реализация отличалась только размерами якорей (10, 20, 40, 80, 160), чтобы более эффективно подбирать маски меньшего размера при работе с разрешением 2,25 кв. Фута на пиксель. и количество RoI (1000), что позволяет использовать большее количество предложений RPN на изображение. Наша реализация также использует настраиваемое значение конфигурации DETECTION_MAX_INSTANCES = 1000, которое позволяет сообщать о большем количестве обнаружений через структуру материального порта.

Мы использовали TensorFlow 1.7 для обучения модели с магистралью ResNet-101. Первоначально, начиная с предварительно обученных весов Imagenet, мы сначала выборочно обучили полностью подключенные слои, чтобы адаптировать их к нашим новым классам, и только затем приступили к полному обучению сети в течение примерно 1400 эпох, 4 изображения на графический процессор, с использованием двух NVIDIA Quadro. GV100 подключены к NVlink и достигли ~ 0,574 MAP на валидации и ~ 0,483 MAP на тестовых наборах.

Реализация материального порта позволяет удобно создавать подклассы от utils.Dataset, чтобы загружать ваши данные в структуру для обучения. На рис. 5 представлена ​​наша реализация загрузки листов и масок, созданных инструментом геообработки «Экспорт обучающих данных для глубокого обучения» (на этом этапе плитки уже нормализованы с помощью сценария из рис. 3).

Логический вывод

Архитектура

Для логического вывода мы выбрали архитектуру клиент-сервер, где роль сервиса играет предварительно обученная модель Mask R-CNN, заключенная в REST API, и ArcGIS Pro 2.3 BETA в качестве клиента. В этом случае оправдано использование клиент-серверной архитектуры, поскольку логический вывод также выполняется с использованием нескольких дорогих графических процессоров, которые организация может захотеть совместно использовать для множества клиентов для лучшего использования.

Сервер: оболочка REST и набор функций JSON в качестве вывода

В качестве доказательства концепции, прежде чем обернуть модель в полноценный серверный фреймворк, мы использовали библиотеки Python3 для создания прототипа простого HTTP-сервера с функцией загрузки изображений, который принимал бы растеризованные плитки LiDAR и возвращал JSON FeatureSet распознанных сегментов крыши. . Наш полный прототип сервера содержится в одном блокноте Jupyter, который включает код вывода Mask R-CNN (Keras + TensorFlow), код для векторизации результирующих масок (skimage libs) и код для пакетной обработки.

Выходной JSON FeatureSet соответствует формату ArcGIS REST API для полигональных объектов. Хотя выходом Mask R-CNN является растровая маска, мы выполняем векторизацию на стороне сервера и упрощение обнаружения по Рамеру – Дугласу – Пекеру перед их стерилизацией в JSON - см. Рис. 6 для примера ответа сервера.

Сервер: плитки и артефакты мозаики

Служба ожидает, что входные плитки размером 512 x 512 x 1 будут отправлены в качестве входных данных. Однако есть проблема: если использовать простую схему неперекрывающейся черепицы, крыши, которые падают между соседними черепицами, будут сообщаться как отсоединенные части, и их нужно будет как-то объединить позже с помощью данных о местоположении швов. Хотя это выглядит приемлемым решением, процесс «заживления» швов плитки должен выполняться с помощью алгоритма на базе ЦП на стороне клиента, что требует от клиента наличия довольно продвинутой реализации механизма геометрии и, следовательно, исключает большинство тонких клиентов.

Мы решили использовать другой подход и вместо этого сделать большую часть работы серверным графическим процессором. В найденном нами решении используются перекрывающиеся плитки с шагом 256 пикселей, то есть 50% перекрытия по каждой оси. Для каждой плитки мы сообщаем только об обнаружениях, которые либо полностью находятся в центральной части (рис. 7) плитки, либо об обнаружениях, которые слишком велики, чтобы о них могли сообщить перекрывающиеся ближайшие соседи; все другие обнаружения отбрасываются, предполагая, что соседние плитки будут сообщать о них.

Однако у этого подхода есть свои плюсы и минусы. Хорошо то, что такая обработка позволяет эффективно использовать графический процессор для удаления артефактов швов масштабируемым образом, оставляя требования для реализации на стороне клиента на относительно низком уровне. С другой стороны, это происходит за счет четырехкратного увеличения объема работы графического процессора сервера, поскольку почти каждый входной пиксель должен обрабатываться четыре раза как часть различных перекрывающихся плиток. Другим недостатком является то, что соседи должны сообщать об обнаружениях, которые находятся за пределами центральной части текущей черепицы: в редких случаях один и тот же сегмент крыши может рассматриваться двумя черепицами как принадлежащий друг другу (это может произойти из-за того, что сверточные слои находятся в разных начальных условиях на соседних тайлах)… в результате о таком обнаружении может вообще не быть сообщено.

Тем не менее, имея на руках высокие требования к масштабируемости, мы решили поручить серверному графическому процессору выполнять работу по удалению артефактов стыков плитки.

Сервер: «Супер-плитка» и пакетный вывод

Более эффективно попросить GPU выполнить логический вывод для нескольких тайлов (столько, сколько умещается в памяти GPU) за один проход, так как это сокращает затраты на маршалинг данных и инициализацию стека вывода. Из-за локальной нормализации псевдо-цвета, выполненной на исходных обучающих плитках размером 512 x 512, имело смысл придерживаться тех же размеров плитки для вывода, а с графическим процессором NVIDIA Quadro GP100 16 Гбайт мы могли выполнять вывод на нескольких таких плитках. за один проход тоже.

Чтобы использовать это эффективно, мы заставили клиента загружать более крупные тайлы («супер-тайлы») размером 1024 x 1024, которые затем были взяты сервером и объединены в 9 перекрывающихся тайлов каждый (сетка 3 x 3 размером 512 x 512 тайлов с 50% перекрытия), поэтому сервер может обрабатывать их в пакетном режиме за один цикл запрос-ответ. По этой причине координаты, которые вы видите на рис. 6 в образце ответа, хотя и указаны в пикселях, взяты из пространства пикселей 1024 x 1024 «супер-тайл».

Клиент: ArcGIS Pro 2.3 BETA и функция Python Raster

Для этого эксперимента мы использовали ArcGIS Pro 2.3 BETA и его новый инструмент геообработки Обнаружение объектов с использованием глубокого обучения, который удобно выполняет разбиение входного растра и для каждого извлеченного фрагмента вызывает пользовательскую функцию Python Raster Function (PRF), работающую как клиент REST для наша служба вывода Маска R-CNN. Вы можете найти более подробную информацию о PRF здесь - обратите внимание, что до официального выпуска ArcGIS Pro 2.3 подпись методов и API может измениться. Посетите эту страницу GitHub после официального выпуска последней документации и примеров по функциям Python Raster.

3D реконструкция

После того, как инструмент «Обнаружение объекта с помощью глубокого обучения» будет запущен и обнаруженные объекты будут записаны в класс пространственных объектов в базе геоданных, мы можем использовать традиционные инструменты геообработки и процедурные правила для выдавливания мультипатчей 3D-зданий.

Во-первых, мы использовали инструмент Регуляризация следа здания из набора инструментов 3D Analyst, чтобы упорядочить необработанные обнаружения. Затем мы использовали отметку поверхности и растры DSM, чтобы получить базовую отметку для каждого сегмента здания и вычислить направление конька крыши. Последним шагом был вызов инструмента GP Элементы из правил CityEngine, который применил процедурное правило к этим многоугольникам для окончательной реконструкции трехмерных зданий.

Полученные результаты

За и против

На данный момент, после четырех недель обучения и по мере того, как мы достигли плато обучения на данном наборе данных Майами, мы можем сделать некоторые выводы: хотя точность прогнозов нейронной сети не достигла точности человеческих редакторов, скорость (60 000 сегментов в час от одного графического процессора NVIDIA Quadro GP100 по сравнению с 70 на человеко-час) и пренебрежимо малые предельные затраты, при которых можно производить прогнозы нейронной сети, делают предварительно обученный сервис Mask R-CNN отличным вспомогательным инструментом, который значительно снижает стоимость создание и поддержка 3D-моделей городов. С помощью этого нового инструмента в рабочем процессе редакторы-люди вместо того, чтобы начинать с растеризованного облака точек LiDAR и вручную оцифровывать сегменты крыши, теперь могут сосредоточиться на точной настройке предлагаемых искусственным интеллектом мультипатчей 3D-зданий с использованием стандартных инструментов редактирования.

Живая веб-сцена

В текущей 3D WebScene вы можете найти необработанные прогнозы Mask R-CNN (Predictions__2D) и трехмерные здания, выдавленные поверх них (Predictions__3D), ни в одном из них не было внесено никаких изменений вручную:



Текущая и будущая работа

Увеличение обучающей выборки и повышение качества прогнозов

И все же точность прогнозируемых ИИ сегментов крыши можно еще больше улучшить, увеличив размер обучающего набора, добавив больше архитектурных вариаций и условий окружающей среды: даунтауны с близко стоящими многоэтажками, затененные деревьями здания, путепроводы на автомагистралях в качестве отрицательных примеров. , рядом водоемы и др.

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

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

Еще одна проблема с данными о реальных тренировках - это дисбаланс классов, например Количество зданий с плоскими крышами, по крайней мере, в округе Майами-Дейд, значительно превышает количество крыш всех других типов, в то время как купола и своды - довольно редкие исключения - и это проблема для обучения классификатора нейронной сети. Здесь мы будем использовать синтетические обучающие примеры, созданные с помощью ArcGIS CityEngine и ArcGIS Pro.

Создание службы вывода ArcGIS Online

Наша цель - добиться стабильного качества и точности для больших географических регионов, условий и архитектурных стилей. Как только это будет сделано, мы с нетерпением ждем публикации этой модели как бета-версии службы логических выводов ArcGIS Online, которая будет использоваться нашими клиентами и партнерами для снижения стоимости 3D-моделей зданий при одновременном повышении качества и охвата такого контента.