Освойте эту универсальную технику маркировки областей пикселей на изображении.

Сегментация изображения — очень универсальный метод, который позволяет идентифицировать цели размером от небольшого кластера пикселей до целей, заполняющих все изображение. Этот пост знакомит с сегментацией и разъясняет различные типы сегментации (семантическая, экземплярная и паноптическая). Затем обсуждается аннотация изображения, поскольку это очень трудоемкая, но важная задача для проектов сегментации. Затем пересматриваются некоторые важные наборы данных из открытых источников, прежде чем начинается обсуждение диапазона обычно используемых моделей. Пост завершается практическими советами по подходу к вашему первому проекту сегментации.

Что такое сегментация изображения?

Сегментация изображения – это метод, присваивающий каждому пикселю в изображении одну метку, что позволяет идентифицировать области изображения, содержащие один и тот же целевой класс, и границы между областями. В частности, этот метод часто называют семантической сегментацией, чтобы отличить его от сегментации экземпляров и паноптической сегментации, которые являются специальными методами, которые я буду обсудим позже в этом посте. Однако когда люди говорят «сегментация», они обычно имеют в виду семантическую сегментацию, поэтому я не буду использовать слово «семантическая» и просто упомяну «сегментацию». Поскольку изображение стоит тысячи слов, я ссылаюсь на изображение ниже, на котором показано изображение, которое было вручную аннотировано как обучающие данные для (семантической) модели сегментации. В этом изображении каждый цвет представляет один класс, и всем пикселям изображения назначается класс:

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

  • Дороги и здания
  • Растительность, обычно сельскохозяйственные культуры или деревья
  • Вода, береговая линия и наводнения
  • Зоны пожара, дыма и ожогов
  • Оползни
  • Ледники
  • Крупные искусственные сооружения, включая солнечные батареи и бассейны.

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

Аннотация

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

  1. Маски уровня пикселей (Маски)
  2. Границы многоугольника (геометрия)

Первый подход заключается в том, что аннотации предоставляются в виде файлов масок на уровне пикселей. Эти файлы маски представляют собой изображения (в формате jpeg, png или tif), которые имеют тот же размер, что и изображение, которое они аннотируют, и обычно представляют собой 8-битные изображения, т. е. с целочисленными значениями пикселей в диапазоне от 0 до 255. Если в вашей задаче было два класса, скажем, фон и паводковые воды, это изображение маски будет использовать значения пикселей 0 для представления фона и другое значение (скажем, 255) для представления паводковых вод. Изображения маски сопровождаются текстовым файлом, в котором указано сопоставление значения пикселя со значением класса — обычно это словарь Python, сброшенный в файл json.

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

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

Обратите внимание, что сгенерировать файлы масок из полигонов с помощью gdal_rasterize относительно просто, но пойти другим путем (из масок в полигоны) сложно. Кроме того, вы обычно должны использовать программное обеспечение для аннотаций для визуализации многоугольников, где изображение маски можно просмотреть с помощью средства просмотра изображений в любой операционной системе. Тем не менее, если вы используете специальное программное обеспечение для аннотирования изображений, то это программное обеспечение будет обрабатывать все детали создания и экспорта аннотаций в предпочитаемом/требуемом формате. Полигональные аннотации чаще встречаются для наборов данных искусственных структур (например, зданий) и реже для естественных классов, например. огонь было бы очень неудобно представлять полигонами. Я расскажу о практических аспектах аннотирования данных позже в этом посте. И последнее замечание, что аннотация является требованием для контролируемой сегментации, но неконтролируемая сегментация также возможна там, где аннотация не требуется (например, кластеризация K-средних). Однако методы без присмотра приносят свои собственные проблемы и выходят за рамки этого поста. Если вы хотите узнать больше о неконтролируемых методах, см. этот раздел в моем репозитории. Давайте теперь перейдем к обзору аннотированных наборов данных с открытым исходным кодом.

Наборы данных

В Интернете доступно очень большое количество наборов данных семантической сегментации, различающихся по пространственному разрешению, модальности датчика и целевому классу (растительность, здание и т. д.). Несколько мест, которые я рекомендую проверить на наличие наборов данных, включают мой собственный репозиторий здесь (ищите сегментация), репозиторий Awesome_Satellite_Benchmark_Datasets (ищите SemSeg) и Базу данных наблюдения Земли. Для наборов данных, которые можно легко загрузить в Pytorch, проверьте наборы данных в torchgeo. Также есть пара исследовательских репозиториев, обеспечивающих хорошую интеграцию моделей с наборами данных, например GeoSeg и mmsegmentation. Если вам просто нужен небольшой набор данных для учебных целей, я рекомендую Dubai dataset. Дальнейшие ссылки на набор данных Дубая находятся здесь.

Выбор и обучение моделей

Очень успешной моделью семантической сегментации является Unet. Эта модель была опубликована в 2015 году, и многие современные модели по сути являются усовершенствованиями этой модели (например, Unet++ и RSUnet). Существует множество реализаций Unet, но та, с которой я обычно начинаю, доступна в fastai через unet_learnner. Fastai позволяет легко выполнять обучение переносу и экспериментировать с различными предварительно обученными кодировщиками, но также очень ограничен в доступных показателях сегментации (Dice & Jaccard). Если вы хотите перейти к более полнофункциональной библиотеке для сегментации, я предлагаю проверить segmentation_models.pytorch (также доступен в Keras здесь). Эта библиотека содержит набор современных моделей, а также имеет простой API, позволяющий быстро экспериментировать. Ограничение Unet заключается в том, что границы регионов, как правило, довольно зашумлены, поэтому полезно иметь возможность экспериментировать с широким спектром моделей через единый API. Это также возможно с помощью SemanticSegmentationTask в TorchGeo. Если вы хотите поэкспериментировать с очень современной моделью, проверьте SegNeXt, который был выпущен в 2022 году. В этом документе приводится сравнение производительности модели с набором данных дистанционного зондирования iSAID (показан ниже), подчеркивая важность выбора модели.

Паноптическая сегментация

Паноптическая сегментация сочетает в себе семантическую сегментацию и сегментацию экземпляров, так что все пиксели изображения помечаются, например, как объекты переднего плана или фона. Изображение ниже взято из статьи Паноптическая сегментация встречает дистанционное зондирование и сравнивает (A) исходное изображение, (B) семантическую сегментацию, © сегментацию экземпляра и (D) паноптическую сегментацию. Серьезной проблемой при использовании этого метода является то, что аннотирование будет очень трудоемким, и я подозреваю, что именно поэтому существует относительно мало публикаций по этому методу. Опять же, чтобы читать дальше, смотрите раздел Паноптическая сегментация моего репозитория.

Как подойти к вашему первому проекту сегментации

Для вашего первого проекта я предполагаю, что вы работаете с пользовательским набором данных, который вы создадите. Сначала вы должны решить, какой из методов сегментации вам нужен, но если вы сомневаетесь, сначала попробуйте семантическую сегментацию, так как она требует наименьшего времени на аннотацию. Хороший первый проект должен быть сосредоточен на простейшем случае бинарной сегментации (т. е. целевого класса по сравнению с фоном), так как это сведет к минимуму время аннотации. Стремитесь создать набор данных изображений с хорошим балансом цели и фона на изображениях, чтобы избежать работы с сильно несбалансированным набором данных. Если ваш целевой класс легко отличить от фона, то это, вероятно, будет относительно простой проблемой, и вы можете начать эксперименты с меньшим набором обучающих данных, скажем, из 50–75 изображений. Обратите внимание, что качество аннотаций очень важно, особенно для небольших наборов данных, поэтому не торопитесь делать точные аннотации. Аннотирование каждого пикселя изображения занимает очень много времени, и чаще всего аннотирование выполняется с помощью полигонов. Однако существует множество платформ для аннотаций, которые обеспечивают умную помощь для ускорения аннотирования. В них часто используется алгоритм увеличения области, позволяющий аннотировать на уровне пикселей, используя только несколько точек в качестве входных данных от аннотатора. Одна знакомая мне платформа для аннотаций, предлагающая такую ​​функциональность, — Roboflow. Вы также можете создать свой собственный инструмент аннотирования полигонов, используя Streamlit, и Я сделал это недавно, так как я обнаружил эвристику (в моем случае пороговое значение), которая особенно хорошо работала для определения целевого класса, который я аннотировал.

Когда у вас будет набор данных, создайте обучающий, проверочный и контрольный наборы тестов, а затем начните обучающие эксперименты с использованием Unet. Как я упоминал ранее, я часто использую фастай для этой начальной тренировки, и цель состоит в том, чтобы установить базовый уровень производительности, которого вы можете достичь. Важно оценивать не только выбранную вами метрику (например, пересечение по союзу/долговой расписке), но и визуализировать прогнозы модели. Вы можете обнаружить, что плохие показатели на самом деле являются результатом плохой и неточной аннотации, и это можно использовать для улучшения вашего подхода к аннотации. Как только вы установили достоверную базовую производительность, начните экспериментировать с типом модели, увеличением данных и настройкой гиперпараметров. Однако вы также должны регулярно оценивать, где ваша модель работает плохо, и добавлять дополнительные обучающие примеры для этих случаев. После того, как вы добились удовлетворительной производительности, вы можете рассмотреть возможность последующей обработки выходных данных модели, например, для создания полигональных контуров зданий или дорог, которые затем можно отобразить в системе ГИС. Для дальнейшего вдохновения смотрите раздел Сегментация моего репозитория.

Экосистема Doodleverse

В видео ниже Дэн Баскомб представляет экосистему Doodleverse, которая состоит из удобных инструментов для сегментации, аннотирования, обучения и оценки моделей. Если вы хотите взяться за дело, но не знаете, с чего начать, это отличный ресурс:

Заключительные мысли

Я надеюсь, что это было полезным введением в сегментацию спутниковых изображений и предоставило интересный и практический обзор этой очень универсальной техники. Действительно, сегментация может быть единственным методом, который вам нужен для решения проблем в вашей работе, а если нет, вы обычно можете создавать аннотации, например. обнаружение объектов из аннотаций сегментации. Если у вас есть какие-либо вопросы, пожалуйста, используйте комментарии ниже. Спасибо за прочтение!

Терминология

  • ГИС = географическая информационная система, обычно база данных с внешним интерфейсом, отображающим карты.
  • IOU = пересечение над объединением, общая метрика, используемая для оценки моделей сегментации.

Узнать больше

Чтобы узнать больше о применении глубокого обучения к спутниковым и аэрофотоснимкам, посетите страницу https://www.satellite-image-deep-learning.com/