Главная/Блог/Гайд/GeoAI: Полный гайд по извлечению…
Гайд13 мин чтения · 3 августа 2026 г.

GeoAI: Полный гайд по извлечению контуров зданий с помощью U-Net и SAM

Пошаговое руководство по созданию конвейера GeoAI: от подготовки данных NAIP до обучения U-Net, оценки метрик и сравнения с Zero-Shot моделями Grounding DINO и SAM.

GeoAI: Полный гайд по извлечению контуров зданий с помощью U-Net и SAM

В эпоху, когда спутниковые снимки высокого разрешения становятся доступнее, чем когда-либо, задача автоматического извлечения контуров зданий (building footprint extraction) перестала быть просто академической проблемой. Это критически важный компонент для городского планирования, оценки рисков стихийных бедствий, логистики и развития умных городов. Однако, как часто бывает в области компьютерного зрения, «просто запустить модель» — это лишь верхушка айсберга. Настоящая магия GeoAI (геопространственного искусственного интеллекта) кроется в правильной подготовке данных, настройке архитектуры нейронных сетей и, что не менее важно, в постобработке результатов, чтобы превратить «размытые» маски пикселей в чистые, регулярные полигоны, готовые к использованию в GIS-системах.

В этом подробном руководстве мы разберем полный рабочий процесс (workflow) извлечения контуров зданий с использованием высококачественных аэрофотоснимков NAIP (National Agriculture Imagery Program). Мы не просто обучим модель; мы пройдем через весь цикл: от конфигурации среды и скачивания данных до визуализации, обучения модели U-Net с энкодером ResNet-34, оценки качества и, наконец, сравнения традиционного глубокого обучения с современными методами Zero-Shot сегментации на базе Grounding DINO и Segment Anything Model (SAM). Этот материал предназначен для исследователей, разработчиков и аналитиков, которые хотят понять, как превратить растровые данные в структурированную векторную информацию.

01Шаг 1: Настройка среды и подготовка данных

Любой проект в области GeoAI начинается с надежного фундамента. В нашем случае мы используем среду Google Colab, которая предоставляет бесплатный доступ к GPU (например, NVIDIA T4), что критически важно для ускорения обучения нейронных сетей. Однако, прежде чем мы сможем обучать модели, необходимо установить специализированные библиотеки. Стандартные библиотеки компьютерного зрения здесь недостаточны — нам нужен инструментарий, который понимает геопространственные данные.

Ключевым компонентом выступает библиотека geoai-py, которая выступает в роли «клея» между геопространственными форматами (GeoTIFF, GeoJSON) и фреймворками глубокого обучения (PyTorch). Также нам понадобятся segmentation-models-pytorch для архитектуры U-Net и buildingregulariser для геометрической коррекции полигонов. Установка этих пакетов может занять несколько минут, так как они включают в себя сложные зависимости.

terminalpython
import os
import subprocess
import sys
import time
import warnings
warnings.filterwarnings("ignore")

# Проверка среды Colab
IN_COLAB = "google.colab" in sys.modules

def pip_install(packages, quiet=True):
    """Установка пакетов через pip внутри процесса ноутбука."""
    cmd = [sys.executable, "-m", "pip", "install", "--upgrade"]
    if quiet:
        cmd.append("-q")
    subprocess.run(cmd + list(packages), check=False)

try:
    import geoai
except ImportError:
    print(">>> Installing geoai-py and friends (takes ~2-4 minutes on Colab)...")
    pip_install("geoai-py", "segmentation-models-pytorch", "buildingregulariser")

try:
    import geoai
except Exception as e:
    raise SystemExit(f"Import failed after install ({e}).\n=> Runtime > Restart session, then re-run this cell. "
                     f"The install is cached, so it will be fast the second time.")

import geopandas as gpd
import matplotlib.pyplot as plt
import numpy as np
import rasterio
import torch
from rasterio.plot import plotting_extent
from IPython.display import display

print(f"geoai        : {geoai.__version__}")
print(f"torch        : {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"GPU          : {torch.cuda.get_device_name(0)}")
else:
    print("!! No GPU detected. Training will still run but be much slower.")
    print("   Colab: Runtime > Change runtime type > Hardware accelerator > T4 GPU")

DEVICE = geoai.get_device()
print(f"geoai device : {DEVICE}")

# Конфигурация параметров
CFG = {
    "tile_size": 512,
    "stride": 256,
    "buffer_radius": 5,
    "architecture": "unet",
    "encoder": "resnet34",
    "encoder_weights": "imagenet",
    "num_channels": 3,
    "num_classes": 2,
    "batch_size": 8,
    "num_epochs": 12,
    "learning_rate": 1e-3,
    "val_split": 0.2,
    "window_size": 512,
    "overlap": 256,
    "run_zero_shot": True,
    "run_pretrained": True,
    "run_real_aoi": False
}

WORK = "/content/geoai_tutorial" if IN_COLAB else os.path.abspath("geoai_tutorial")
os.makedirs(WORK, exist_ok=True)
os.chdir(WORK)
print(f"working dir  : {WORK}")

Обратите внимание на конфигурационный словарь CFG. Здесь мы задаем размер тайла (чипа) изображения — 512x512 пикселей, и шаг (stride) — 256. Это означает, что при нарезке изображений для обучения мы будем использовать 50% перекрытия, что помогает модели лучше учиться на границах объектов. Мы также выбираем архитектуру U-Net с энкодером ResNet-34, предварительно обученным на ImageNet. Это стандартный, но очень эффективный выбор для задач семантической сегментации, так как ResNet-34 уже «знает», как выделять текстуры и края, что ускоряет сходимость модели.

💡
Совет по производительности. Если вы запускаете код локально на машине без мощной видеокарты, обучение будет идти медленно. В Google Colab убедитесь, что в настройках Runtime выбран Hardware Accelerator типа T4 GPU. Это ускорит процесс в десятки раз.

02Шаг 2: Исследование данных и визуализация

Прежде чем кормить модель данными, необходимо понять их природу. Мы работаем с данными NAIP — это растровые изображения (GeoTIFF) и векторные контуры зданий (GeoJSON). Важно проверить их пространственные свойства: систему координат (CRS), разрешение пикселей, размерность и статистику значений.

С помощью функций geoai.get_raster_info и geoai.get_vector_info мы получаем метаданные. Например, нам нужно убедиться, что растр и векторные данные совпадают по системе координат. Если нет, потребуется предварительная трансформация. Далее мы визуализируем данные, наложив векторные контуры зданий на растровое изображение. Это позволяет вручную оценить качество данных: нет ли пропущенных зданий, не пересекаются ли полигоны неестественным образом и насколько точно векторные данные соответствуют реальным объектам на снимке.

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

GeoAI: Полный гайд по извлечению контуров зданий с помощью U-Net и SAM

03Шаг 3: Нарезка изображений (Chipping) и создание масок

Нейронные сети, такие как U-Net, не могут обрабатывать изображения произвольного размера. Поэтому исходное большое растровое изображение необходимо разбить на меньшие фрагменты — «чипы» или тайлы. В нашем случае мы нарезаем изображение на фрагменты 512x512 пикселей с перекрытием 256 пикселей. Это перекрытие необходимо для того, чтобы здания, находящиеся на границе двух соседних тайлов, не были обрезаны и были полностью видны модели.

Параллельно с нарезкой изображений мы создаем соответствующие маски (label masks). Маска — это растровое изображение того же размера, где пиксели, принадлежащие зданиям, имеют значение 1 (или 255), а фон — 0. Это «учебник» для нашей модели. Библиотека geoai.export_geotiff_tiles автоматически выполняет эту операцию, создавая две папки: images и labels.

Важно отметить статистику тайлов. Не все тайлы будут содержать здания. Некоторые участки могут быть парками, дорогами или открытой местностью. Модель должна учиться различать эти классы. Поэтому мы также подсчитываем количество тайлов, содержащих здания, и общее количество «foreground» пикселей. Если зданий слишком мало, модель может стать смещенной (biased) в сторону фона, что снизит точность обнаружения.

04Шаг 4: Обучение модели U-Net

Теперь, когда данные подготовлены, мы приступаем к обучению. Мы используем архитектуру U-Net с энкодером ResNet-34. U-Net состоит из двух частей: энкодера, который сжимает изображение и извлекает признаки, и декодера, который восстанавливает пространственное разрешение и предсказывает маску для каждого пикселя. Использование предобученного энкодера (weights="imagenet") позволяет модели быстрее научиться выделять важные визуальные паттерны, такие как края крыш, тени и текстуры материалов.

terminalpython
def step4():
    geoai.train_segmentation_model(
        images_dir=f"{TILES_DIR}/images",
        labels_dir=f"{TILES_DIR}/labels",
        output_dir=MODEL_DIR,
        architecture=CFG["architecture"],
        encoder_name=CFG["encoder"],
        encoder_weights=CFG["encoder_weights"],
        num_channels=CFG["num_channels"],
        num_classes=CFG["num_classes"],
        batch_size=CFG["batch_size"],
        num_epochs=CFG["num_epochs"],
        learning_rate=CFG["learning_rate"],
        val_split=CFG["val_split"],
        save_best_only=True,
        early_stopping_patience=5,
        verbose=True
    )
    print(f"\n  best checkpoint: {BEST_MODEL}")
    print(f"  size: {os.path.getsize(BEST_MODEL) / 1e6:.1f} MB")
    return BEST_MODEL

Мы настраиваем процесс обучения с разделением данных на обучающую и валидационную выборки (80/20). Также включен механизм ранней остановки (early stopping) с патентом 5 эпох. Это означает, что если метрика качества на валидационной выборке перестанет улучшаться в течение 5 эпох, обучение автоматически остановится, чтобы избежать переобучения. Мы сохраняем только лучшую модель (best_model.pth), которая демонстрирует наилучшие результаты на валидации.

⚠️ Важно: Переобучение.
Если кривая потерь на обучении (train loss) продолжает падать, а на валидации (val loss) растет или выходит на плато, модель переобучилась. В таком случае стоит уменьшить сложность модели, увеличить количество данных или усилить регуляризацию.

05Шаг 5: Диагностика обучения и анализ кривых

После завершения обучения важно проанализировать, как модель училась. Мы загружаем историю обучения (training history) и строим графики изменения потерь (loss) и метрик качества (IoU, F1) по эпохам. Эти графики — наш главный инструмент диагностики.

Идеальная ситуация: кривые train и val loss сходятся к низким значениям, а кривые IoU и F1 растут и стабилизируются. Если val loss начинает расти, а train loss падает — это классический признак переобучения. Если обе кривые остаются высокими и плоскими — модель недообучена (underfitting), возможно, ей нужно больше эпох, более сложная архитектура или больше обучающих данных. Мы также определяем лучшую эпоху по максимальному значению Validation IoU, так как именно эта версия модели будет использоваться для инференса.

GeoAI: Полный гайд по извлечению контуров зданий с помощью U-Net и SAM

На графике выше показаны кривые обучения. Видно, что метрика Validation IoU достигает пика на определенной эпохе, после чего начинает незначительно колебаться или снижаться. Это подтверждает правильность выбора момента остановки обучения. Мы фиксируем модель, достигшую этого пика, как лучшую.

06Шаг 6: Инференс на новых данных (Sliding-Window Inference)

Обученная модель теперь готова к работе. Мы применяем ее к новому, ранее не виденному изображению (test scene). Поскольку изображение может быть огромным, мы не можем пропустить его целиком через сеть. Вместо этого используется метод скользящего окна (sliding-window inference). Изображение разбивается на тайлы с тем же размером и перекрытием, что и при обучении. Модель предсказывает маску для каждого тайла, а затем результаты объединяются в единую карту.

Важным аспектом является обработка границ тайлов. Из-за перекрытия, пиксели на границах могут иметь несколько предсказаний. Библиотека geoai автоматически усредняет вероятности или выбирает максимальное значение, обеспечивая плавный переход между тайлами. Результатом является растровая маска (prediction.tif) и карта вероятностей (probability.tif), где каждый пиксель показывает уверенность модели в том, что он принадлежит зданию.

07Шаг 7: Векторизация и регуляризация контуров

Самая большая проблема семантической сегментации — «зубчатые» и нерегулярные границы. Нейронная сеть предсказывает маски пикселей, которые редко образуют идеальные прямоугольники или правильные полигоны, характерные для зданий. Чтобы сделать результаты полезными для GIS, необходимо преобразовать растровую маску в векторные полигоны и очистить их.

Этот процесс состоит из нескольких этапов:

  1. Группировка регионов: Удаление мелких шумовых областей (например, одиночных пикселей или маленьких пятен), которые с высокой вероятностью являются ошибками классификации.
  2. Векторизация: Преобразование чистой маски в GeoJSON с полигонами.
  3. Ортогонализация: Выпрямление углов. Большинство зданий имеют прямые углы. Алгоритм пытается выровнять грани полигонов по осям X и Y, если это геометрически обосновано.
  4. Регуляризация: Упрощение геометрии и приведение углов к стандартным значениям (90, 45 градусов). Это делает контуры «чистыми» и эстетически приятными.

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

GeoAI: Полный гайд по извлечению контуров зданий с помощью U-Net и SAM
📌 Факт.
Регуляризация контуров может изменить площадь здания на несколько процентов. Это важно учитывать при расчете плотности застройки или оценке ущерба. Всегда проверяйте, как постобработка влияет на итоговые метрики.

08Шаг 8: Количественная оценка точности

Как мы знаем, что наша модель работает хорошо? Мы сравниваем предсказанные контуры с эталонными данными (ground truth). В нашем случае мы используем векторные данные зданий, которые были скачаны вместе с обучающей выборкой. Мы растеризуем эталонные векторы, чтобы получить маску, и сравниваем ее с предсказанием модели.

Основные метрики:

  • IoU (Intersection over Union): Отношение площади пересечения предсказания и эталона к площади их объединения. Это самая строгая и информативная метрика. Значение 1.0 означает идеальное совпадение.
  • F1 Score: Гармоническое среднее точности (precision) и полноты (recall). Показывает баланс между ложными срабатываниями и пропущенными объектами.

Важно понимать, что IoU для фона (класс 0) будет всегда очень высоким, так как фон занимает большую часть изображения. Поэтому нас интересует IoU именно для класса «здание». Высокий IoU (>0.7) и F1 (>0.8) свидетельствуют о хорошем качестве модели.

09Шаг 9: Zero-Shot сегментация с Grounding DINO и SAM

Традиционное обучение U-Net требует размеченных данных. Но что, если у нас нет размеченных данных для конкретного региона или типа зданий? Здесь на сцену выходят модели Zero-Shot, такие как Grounding DINO и Segment Anything Model (SAM). Эти модели не требуют дообучения для новых классов объектов.

Grounding DINO — это модель обнаружения объектов, которая может находить объекты по текстовому описанию. SAM — это модель сегментации, которая может выделять объекты на изображении. Вместе они образуют мощный инструмент: мы задаем текстовый промпт, например, "building" или "house", и модель сама находит и сегментирует эти объекты на изображении, не видя их ранее.

terminalpython
def step9():
    if not CFG["run_zero_shot"]:
        print("  disabled in CFG")
        return
    
    # ... код обрезки чипа ...
    
    sam = geoai.GroundedSAM(
        detector_id="IDEA-Research/grounding-dino-tiny",
        segmenter_id="facebook/sam-vit-base",
        tile_size=1024,
        overlap=128,
        threshold=0.3
    )
    
    out_mask = os.path.join(WORK, "zeroshot_mask.tif")
    gdf = sam.segment_image(
        input_path=chip,
        output_path=out_mask,
        text_prompts=["building", "house", "rooftop"],
        polygon_refinement=True,
        export_polygons=True,
        min_polygon_area=30,
        simplify_tolerance=1.5
    )
    
    print(f"  zero-shot objects found: {len(gdf) if gdf is not None else 0}")

В этом примере мы используем текстовые промпты "building", "house" и "rooftop". Модель находит объекты, соответствующие этим описаниям, и создает маски. Это особенно полезно для быстрой оценки или когда размеченные данные недоступны. Однако, Zero-Shot модели могут быть менее точными, чем специализированные модели, обученные на конкретных данных, особенно в сложных условиях (тени, перекрытия).

GeoAI: Полный гайд по извлечению контуров зданий с помощью U-Net и SAM

10Шаг 10: Сравнение с предобученной моделью Mask R-CNN

Для полноты картины мы сравниваем результаты нашего обученного U-Net с предобученной моделью Mask R-CNN, специально заточенной под извлечение контуров зданий в США. Mask R-CNN — это модель инстанс-сегментации, которая не только классифицирует пиксели, но и выделяет отдельные экземпляры объектов.

Мы используем библиотеку geoai.BuildingFootprintExtractor для обработки изображения через Mask R-CNN. Затем мы сравниваем количество найденных полигонов, их геометрию и визуальное качество. Обычно, предобученные модели показывают хорошие результаты «из коробки», но они могут не учитывать локальные особенности (например, типичную архитектуру конкретного региона). Обученная нами U-Net, напротив, адаптирована под конкретные данные, но требует больше усилий для настройки.

Сравнение показывает, что U-Net часто дает более плотные и полные маски (меньше пропущенных зданий), в то время как Mask R-CNN может лучше разделять соседние здания, если они имеют четкие границы. Выбор между ними зависит от задачи: если важна полнота обнаружения — U-Net; если важна точность границ и разделение объектов — Mask R-CNN.

11Что это значит на практике

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

  1. Гибкость выбора инструментов. Вы не обязаны выбирать между традиционным глубоким обучением (U-Net) и новыми Zero-Shot моделями (SAM). Их можно комбинировать. Например, использовать SAM для быстрой разметки данных, а затем дообучать U-Net для повышения точности.
  2. Важность постобработки. Предсказание маски — это только половина дела. Без векторизации и регуляризации результаты бесполезны для большинства GIS-задач. Инструменты вроде buildingregulariser делают ИИ-результаты «production-ready».
  3. Доступность данных. Использование открытых данных, таких как NAIP и Overture Maps, позволяет запускать подобные проекты без дорогостоящих лицензий на спутниковые снимки. Это democratizes доступ к передовым технологиям анализа изображений.
  4. Локализация и адаптация. Хотя мы использовали данные из США, описанный подход универсален. Вы можете заменить NAIP на снимки Sentinel-2 или PlanetScope, а векторные данные — на локальные кадастровые записи. Ключевые шаги (нарезка, обучение, инференс, векторизация) останутся неизменными.

В заключение, GeoAI — это не просто «еще одна нейросеть». Это комплексный процесс, требующий понимания как компьютерного зрения, так и геоинформатики. Освоив этот workflow, вы получаете мощный инструмент для автоматизации рутинных задач картографирования и анализа территорий, экономя время и ресурсы.

Источник: MarkTechPost ↗