Обзор наборов данных для семантической сегментации
Семантическая сегментация присваивает одну метку класса каждому пикселю изображения. В отличие от сегментации экземпляров, семантическая сегментация не разделяет отдельные объекты одного и того же класса. Цель обучения — плотная карта классов, где каждый пиксель хранит 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 🚀 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-маски
- Сохрани изображения в папках разделения, таких как
images/trainиimages/val. - Сохрани по одной одноканальной маске на изображение в зеркальных папках масок, таких как
masks/trainиmasks/val. - Убедись, что значения пикселей маски являются ID классов. Используй
255для пикселей, которые должны быть проигнорированы. - Создай YAML набора данных с
path,train,val,masks_dirиnames. - Добавь
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Вариант Б — Полигональные метки
- Размести изображения и
.txtфайлы полигонов точно так же, как для сегментации экземпляров. - Создай YAML набора данных с
path,train,valиnames— опустиmasks_dir. - Не добавляй запись "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.