Обзор наборов данных для семантической сегментации

Семантическая сегментация присваивает одну метку класса каждому пикселю изображения. В отличие от сегментации экземпляров, семантическая сегментация не разделяет отдельные объекты одного и того же класса. Цель обучения — плотная карта классов, где каждый пиксель хранит ID класса.

Это руководство объясняет формат набора данных, используемый моделями семантической сегментации Ultralytics YOLO, и перечисляет встроенные конфигурации наборов данных, доступные для обучения и валидации.

Поддерживаемые форматы наборов данных

Поддерживаются два формата меток. Загрузчик набора данных выбирает путь в зависимости от того, определяет ли YAML-файл набора данных ключ masks_dir.

Формат масок PNG

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

  • Значения пикселей 0, 1, 2, ... представляют ID классов из сопоставления names набора данных.
  • Значение пикселя 255 рассматривается как метка игнорирования и исключается из вычислений функции потерь и метрик.
  • Файлы масок должны иметь то же имя файла (stem), что и соответствующие им файлы изображений, например frankfurt_000000_000294.png.
  • Поддерживаемые расширения масок: .png, .PNG, .bmp и .tif.

Макет по умолчанию хранит изображения и маски в параллельных папках. Значение masks_dir из YAML набора данных заменяет компонент пути images для поиска масок.

dataset/
├── images/
│   ├── train/
│   └── val/
└── masks/
    ├── train/
    └── val/

Например, изображение по адресу images/train/aachen_000000_000019.png сопоставляется с маской по адресу masks/train/aachen_000000_000019.png, когда masks_dir: masks.

Формат полигональных меток YOLO

Если у твоего набора данных уже есть полигональные метки Ultralytics YOLO (один .txt на изображение со строками <class-index> <x1> <y1> <x2> <y2> ...), ты можешь проводить семантическую сегментацию напрямую по ним — конвертация в PNG-маски не требуется. Смотри формат набора данных для сегментации экземпляров для ознакомления с построчным макетом.

Этот путь выбирается автоматически, если в YAML набора данных отсутствует masks_dir. Поведение:

  • Полигоны преобразуются в семантическую маску для каждого изображения во время загрузки, отсортированные по площади, чтобы меньшие объекты перекрывали большие в областях наложения.
  • Мультиклассовость (N > 1 в names): дополнительный класс background добавляется после твоих объявленных классов для пикселей, не покрытых ни одним полигоном. Модель строится с N + 1 выходными каналами, и последний канал является фоном.
  • Один класс (N == 1 в names): всё равно обучается как 1 класс. Маска бинарная, где твой объявленный класс отображается как 1, а пиксели, не покрытые полигоном, как 0. Никакой дополнительный класс фона не добавляется в names.
  • Пиксели, добавленные аугментационным заполнением (например, случайная обрезка), по-прежнему используют 255 в качестве метки игнорирования.

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

Формат YAML набора данных

Наборы данных для семантической сегментации настраиваются с помощью файлов YAML. Основные поля:

КлючОписание
pathКорневой каталог набора данных.
trainПуть к обучающим изображениям относительно path или абсолютный путь.
valПуть к изображениям валидации относительно path или абсолютный путь.
testДополнительный путь к тестовым изображениям.
masks_dirИмя директории, используемой для семантических масок. Опусти этот ключ, чтобы переключиться на формат полигональных меток YOLO.
namesСопоставление ID класса с именем класса.
label_mappingОпциональное сопоставление ID исходного набора данных с ID для обучения или ignore_label.
ultralytics/cfg/datasets/cityscapes8.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# Cityscapes semantic segmentation dataset (19 classes)
# Documentation: https://docs.ultralytics.com/datasets/semantic/cityscapes8/
# Example usage: yolo semantic train data=cityscapes8.yaml model=yolo26n-sem.pt
# parent
# ├── ultralytics
# └── datasets
#     └── cityscapes8 ← downloads here (small subset)
#         └── images
#         └── masks

# Dataset root directory
path: cityscapes8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images

masks_dir: masks # semantic mask directory

# Cityscapes 19-class labels
names:
  0: road
  1: sidewalk
  2: building
  3: wall
  4: fence
  5: pole
  6: traffic light
  7: traffic sign
  8: vegetation
  9: terrain
  10: sky
  11: person
  12: rider
  13: car
  14: truck
  15: bus
  16: train
  17: motorcycle
  18: bicycle

# Map source label IDs to train IDs; ignore_label is converted to 255.
label_mapping:
  -1: ignore_label
  0: ignore_label
  1: ignore_label
  2: ignore_label
  3: ignore_label
  4: ignore_label
  5: ignore_label
  6: ignore_label
  7: 0
  8: 1
  9: ignore_label
  10: ignore_label
  11: 2
  12: 3
  13: 4
  14: ignore_label
  15: ignore_label
  16: ignore_label
  17: 5
  18: ignore_label
  19: 6
  20: 7
  21: 8
  22: 9
  23: 10
  24: 11
  25: 12
  26: 13
  27: 14
  28: 15
  29: ignore_label
  30: ignore_label
  31: 16
  32: 17
  33: 18

# Download URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/cityscapes8.zip

Используй label_mapping, когда ID исходных масок еще не соответствуют последовательным ID классов для обучения. Cityscapes и ADE20K включают отображения, которые преобразуют оригинальные ID меток в ID обучения семантической сегментации YOLO и игнорируют неиспользуемые метки.

Использование

Обучи модель семантической сегментации YOLO26 с помощью Python или CLI:

Пример
from ultralytics import YOLO

# Load a pretrained semantic segmentation model
model = YOLO("yolo26n-sem.pt")

# Train on the Cityscapes8 semantic segmentation dataset
results = model.train(data="cityscapes8.yaml", epochs=100, imgsz=1024)

Поддерживаемые наборы данных

Ultralytics предоставляет YAML-файлы наборов данных для семантической сегментации для этих датасетов:

  • Cityscapes: Набор данных для семантической сегментации городских уличных сцен с 19 классами обучения.
  • Cityscapes8: Подмножество Cityscapes из 8 изображений для быстрых тестов и проверок CI.
  • ADE20K: Набор данных для парсинга сцен со 150 семантическими классами.

Добавление собственного набора данных

Вариант А — PNG-маски

  1. Сохрани изображения в папках разделения, таких как images/train и images/val.
  2. Сохрани по одной одноканальной маске на изображение в зеркальных папках масок, таких как masks/train и masks/val.
  3. Убедись, что значения пикселей маски являются ID классов. Используй 255 для пикселей, которые должны быть проигнорированы.
  4. Создай YAML набора данных с path, train, val, masks_dir и names.
  5. Добавь label_mapping только если ID твоих масок нуждаются в преобразовании в последовательные ID для обучения.
path: path/to/my-semantic-dataset
train: images/train
val: images/val
masks_dir: masks

names:
    0: background
    1: road
    2: building

Вариант Б — Полигональные метки

  1. Размести изображения и .txt файлы полигонов точно так же, как для сегментации экземпляров.
  2. Создай YAML набора данных с path, train, val и namesопусти masks_dir.
  3. Не добавляй запись "background" в names. Для мультиклассовых наборов данных загрузчик добавляет её автоматически; для одноклассовых наборов обучение остается на 1 классе — твой объявленный класс становится 1 в маске, а непокрытые пиксели становятся 0.
path: path/to/my-polygon-dataset
train: images/train
val: images/val

names:
    0: person
    1: car

Часто задаваемые вопросы (FAQ)

В чем разница между масками семантической сегментации и метками сегментации экземпляров?

Маски семантической сегментации — это плотные карты пикселей. Каждый пиксель хранит ID класса, и на каждое обучающее изображение приходится одно изображение маски. Метки сегментации экземпляров в Ultralytics YOLO используют текстовые файлы с координатами полигонов, по одной строке на экземпляр объекта.

Какое значение пикселя игнорируется во время обучения?

Значение пикселя 255 используется как метка игнорирования. Эти пиксели пропускаются при вычислении функции потерь и метрик, что полезно для пустот, неразмеченных пикселей или классов вне набора меток обучения.

Должны ли имена файлов масок совпадать с именами файлов изображений?

Да. Каждая семантическая маска должна иметь тот же корень имени файла, что и соответствующее изображение. Загрузчик набора данных заменяет компонент каталога images на masks_dir и ищет соответствующие файлы масок.

Могу ли я использовать исходные ID меток набора данных напрямую?

Да, если они уже соответствуют твоим ID классов в names. Если исходный набор данных использует непоследовательные ID или включает метки, которые нужно игнорировать, добавь раздел label_mapping для преобразования значений исходных пикселей в ID для обучения.

Могу ли я использовать свой набор данных сегментации экземпляров для обучения семантической сегментации?

Да. Наборы данных для сегментации экземпляров используют полигональные метки Ultralytics YOLO (один .txt на изображение со строками <class-index> <x1> <y1> <x2> <y2> ...), и те же файлы можно повторно использовать для семантической сегментации — просто опусти masks_dir в YAML набора данных. Загрузчик преобразует полигоны в маски для каждого изображения «на лету». Для мультиклассовых наборов (N > 1) добавляется дополнительный класс background, и модель строится с N + 1 выходными каналами. Для одноклассовых наборов (N == 1) обучение остается на 1 классе — маска показывает твой объявленный класс как 1, а непокрытые пиксели как 0.

Комментарии