Présentation des jeux de données de segmentation sémantique
La segmentation sémantique attribue une étiquette de classe à chaque pixel d'une image. Contrairement à la segmentation d'instance, la segmentation sémantique ne sépare pas les objets individuels d'une même classe. La cible d'entraînement est une carte de classe dense où chaque pixel stocke un ID de classe.
Ce guide explique le format de jeu de données utilisé par les modèles de segmentation sémantique Ultralytics YOLO et liste les configurations de jeux de données intégrées disponibles pour l'entraînement et la validation.
Formats de jeu de données pris en charge
Deux formats d'étiquettes sont pris en charge. Le chargeur de jeu de données choisit le chemin selon que le YAML du jeu de données définit ou non une clé masks_dir.
Format de masque PNG
Les jeux de données de segmentation sémantique utilisent un fichier image et un fichier masque par échantillon. Le masque est une image à canal unique, généralement PNG, où chaque valeur de pixel est l'index de classe pour le pixel de l'image correspondant.
- Les valeurs de pixel
0,1,2, ... représentent les ID de classe issus du mappagenamesdu jeu de données. - La valeur de pixel
255est traitée comme l'étiquette d'ignorance et est exclue du calcul de la perte et des métriques. - Les fichiers de masque doivent utiliser le même nom de base que leur fichier image correspondant, par exemple
frankfurt_000000_000294.png. - Les extensions de masque prises en charge sont
.png,.PNG,.bmpet.tif.
La disposition par défaut conserve les images et les masques dans des dossiers parallèles. La valeur masks_dir du YAML du jeu de données remplace le composant de chemin images pour trouver les masques.
dataset/
├── images/
│ ├── train/
│ └── val/
└── masks/
├── train/
└── val/Par exemple, une image située à images/train/aachen_000000_000019.png est associée à un masque situé à masks/train/aachen_000000_000019.png lorsque masks_dir: masks.
Format d'étiquette de polygone YOLO
Si ton jeu de données possède déjà des étiquettes de polygone Ultralytics YOLO (un .txt par image avec des lignes <class-index> <x1> <y1> <x2> <y2> ...), tu peux effectuer l'entraînement de segmentation sémantique directement à partir de celles-ci — aucune conversion de masque PNG n'est nécessaire. Voir le format de jeu de données de segmentation d'instance pour la disposition ligne par ligne.
Ce chemin est sélectionné automatiquement lorsque le YAML du jeu de données omet masks_dir. Comportement :
- Les polygones sont convertis en un masque sémantique par image au moment du chargement, triés par zone afin que les petits objets remplacent les plus grands dans les régions de chevauchement.
- Multi-classe (
N > 1dansnames) : une classebackgroundsupplémentaire est ajoutée après tes classes déclarées pour les pixels non couverts par un polygone. Le modèle est construit avecN + 1canaux de sortie et le dernier canal est l'arrière-plan. - Classe unique (
N == 1dansnames) : toujours entraîné comme 1 classe. Le masque est binaire, avec ta classe déclarée affichée comme1et les pixels non couverts par un polygone comme0. Aucune classe d'arrière-plan supplémentaire n'est ajoutée ànames. - Les pixels ajoutés par le remplissage d'augmentation (par exemple, recadrage aléatoire) utilisent toujours
255comme étiquette d'ignorance.
Utilise ce chemin lorsque tes données sont déjà étiquetées en tant que polygones d'instance et que tu souhaites obtenir un modèle de segmentation sémantique à partir des mêmes fichiers.
Format YAML du jeu de données
Les jeux de données de segmentation sémantique sont configurés avec des fichiers YAML. Les champs principaux sont :
| Clé | Description |
|---|---|
path | Répertoire racine du jeu de données. |
train | Chemin de l'image d'entraînement relatif à path, ou un chemin absolu. |
val | Chemin de l'image de validation relatif à path, ou un chemin absolu. |
test | Chemin de l'image de test optionnel. |
masks_dir | Nom du répertoire utilisé pour les masques sémantiques. Omet cette clé pour passer au format d'étiquette de polygone YOLO. |
names | Mappage de l'ID de classe vers le nom de classe. |
label_mapping | Mappage optionnel des ID du jeu de données source vers les ID d'entraînement ou 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.zipUtilise label_mapping lorsque les ID de masque source ne correspondent pas déjà aux ID de classe d'entraînement contigus. Cityscapes et ADE20K incluent des mappages qui convertissent les ID d'étiquette originaux en ID d'entraînement de segmentation sémantique YOLO et ignorent les étiquettes inutilisées.
Utilisation
Entraîne un modèle de segmentation sémantique YOLO26 avec Python ou 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)Jeux de données pris en charge
Ultralytics fournit des fichiers YAML de jeux de données de segmentation sémantique pour ces jeux de données :
- Cityscapes : Jeu de données de segmentation sémantique de scènes de rue urbaines avec 19 classes d'entraînement.
- Cityscapes8 : Un sous-ensemble de 8 images Cityscapes pour des tests rapides et des vérifications CI.
- ADE20K : Jeu de données d'analyse de scène avec 150 classes sémantiques.
Ajouter ton propre jeu de données
Option A — Masques PNG
- Enregistre tes images sous des dossiers de répartition tels que
images/trainetimages/val. - Enregistre un masque à canal unique par image sous les dossiers de masques en miroir, tels que
masks/trainetmasks/val. - Assure-toi que les valeurs de pixel du masque sont des ID de classe. Utilise
255pour les pixels qui doivent être ignorés. - Crée un YAML de jeu de données avec
path,train,val,masks_diretnames. - Ajoute
label_mappinguniquement lorsque tes ID de masque ont besoin d'une conversion en ID d'entraînement contigus.
path: path/to/my-semantic-dataset
train: images/train
val: images/val
masks_dir: masks
names:
0: background
1: road
2: buildingOption B — Étiquettes de polygone
- Dispose les images et les fichiers de polygone
.txtexactement comme pour la segmentation d'instance. - Crée un YAML de jeu de données avec
path,train,valetnames— ometmasks_dir. - N'ajoute pas d'entrée "background" à
names. Pour les jeux de données multi-classes, le chargeur en ajoute une automatiquement ; pour les jeux de données à classe unique, l'entraînement reste à 1 classe — ta classe déclarée devient1dans le masque et les pixels non couverts deviennent0.
path: path/to/my-polygon-dataset
train: images/train
val: images/val
names:
0: person
1: carFAQ
Quelle est la différence entre les masques de segmentation sémantique et les étiquettes de segmentation d'instance ?
Les masques de segmentation sémantique sont des cartes de pixels denses. Chaque pixel stocke un ID de classe, et il y a une image de masque par image d'entraînement. Les étiquettes de segmentation d'instance dans Ultralytics YOLO utilisent des fichiers texte avec des coordonnées de polygone, une ligne par instance d'objet.
Quelle valeur de pixel est ignorée pendant l'entraînement ?
La valeur de pixel 255 est utilisée comme étiquette d'ignorance. Ces pixels sont sautés pendant le calcul de la perte et des métriques, ce qui est utile pour les régions vides, les pixels non étiquetés ou les classes en dehors de l'ensemble d'étiquettes d'entraînement.
Les noms de fichiers de masque doivent-ils correspondre aux noms de fichiers image ?
Oui. Chaque masque sémantique doit avoir le même nom de base que l'image correspondante. Le chargeur de jeu de données remplace le composant de répertoire images par masks_dir et recherche les fichiers de masque correspondants.
Puis-je utiliser directement les ID d'étiquette du jeu de données original ?
Oui, s'ils correspondent déjà aux ID de classe de tes names. Si le jeu de données source utilise des ID non contigus ou inclut des étiquettes qui doivent être ignorées, ajoute une section label_mapping pour convertir les valeurs de pixel sources en ID d'entraînement.
Puis-je utiliser mon jeu de données de segmentation d'instance pour entraîner la segmentation sémantique ?
Oui. Les jeux de données de segmentation d'instance utilisent des étiquettes de polygone Ultralytics YOLO (un .txt par image avec des lignes <class-index> <x1> <y1> <x2> <y2> ...), et les mêmes fichiers peuvent être réutilisés pour la segmentation sémantique — il suffit d'omettre masks_dir du YAML du jeu de données. Le chargeur convertit les polygones en masques par image à la volée. Pour les jeux de données multi-classes (N > 1), une classe background supplémentaire est ajoutée et le modèle est construit avec N + 1 canaux de sortie. Pour les jeux de données à classe unique (N == 1), l'entraînement reste à 1 classe — le masque affiche ta classe déclarée comme 1 et les pixels non couverts comme 0.