So konvertieren Sie COCO in YOLO
Schulung Ultralytics YOLO Modelle erfordern Annotationen im YOLO , doch viele gängige Annotationstools exportieren stattdessen im COCO . Dieser Leitfaden zeigt Ihnen, wie Sie Ihre COCO in YOLO konvertieren und mit dem Training von Modellen für Objekterkennung, Instanzsegmentierung und Posenabschätzung beginnen können.
Warum von COCO YOLO wechseln?
Das COCO -Format speichert alle Annotationen in einer einzigen Datei, während YOLO verwendet eine Textdatei pro Bild mit normalisierten Koordinaten. Eine Konvertierung ist erforderlich, weil:
- YOLO erfordern
.txtDateien beschriften mit einer Datei pro Bild, die Folgendes enthält:class x_center y_center width heightin normierten Koordinaten. - COCO JSON verwendet Pixelkoordinaten in
[x_min, y_min, width, height]Format mit einer einzigen JSON-Datei für alle Bilder. - Klassen-IDs unterscheiden sich — COCO beliebige
category_idWerte, während YOLO null-indizierte Klassen-IDs YOLO .
| Merkmal | COCO JSON | YOLO |
|---|---|---|
| Aufbau | Eine einzige JSON-Datei für alle Bilder | Eins .txt eine Datei pro Bild |
| Bbox-Format | [x_min, y_min, width, height] in Pixeln | class x_center y_center width height normalisiert (0–1) |
| Klassen-IDs | category_id (kann bei jeder beliebigen Zahl beginnen) | Null-indiziert (beginnt bei 0) |
| Segmentation | Polygon-Arrays in segmentation Feld | Polygonkoordinaten nach Klassen-ID |
| Keypoints | [x, y, visibility, ...] in Pixeln | [x, y, visibility, ...] normalisiert |
Schnellstart
Der schnellste Weg, COCO zu konvertieren und mit dem Training zu beginnen:
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="path/to/annotations/", # directory containing your JSON files
save_dir="path/to/output/", # where to save converted labels
cls91to80=False, # IMPORTANT: set False for custom datasets
)
Nach der Konvertierung organisieren Sie Ihre Verzeichnisstruktur, erstellen Sie eine dataset.yaml und beginnen Sie mit dem Training. Eine vollständige Schritt-für-Schritt-Anleitung finden Sie weiter unten.
Benutzerdefinierte Datensätze: immer verwenden cls91to80=False
Die cls91to80=True Standard ist konzipiert nur für den Standard COCO-Datensatz mit 80 Objektklassen, wobei 91 nicht zusammenhängende Kategorie-IDs 80 zusammenhängenden Klassen-IDs zugeordnet werden. Für jeden benutzerdefinierten Datensatz muss festlegen cls91to80=False — andernfalls werden Ihre Klassen-IDs stillschweigend falsch zugeordnet, und Ihr Modell lernt falsche Klassen.
Schritt-für-Schritt-Anleitung zur Umstellung
1. Bereiten Sie Ihr COCO-Datensatz vor
Ein typischer Datensatz im COCO-Format, der aus Annotationswerkzeugen exportiert wurde, weist die folgende Struktur auf:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ ├── img_002.jpg
│ │ └── ...
│ └── val/
│ ├── img_100.jpg
│ └── ...
└── annotations/
├── instances_train.json
└── instances_val.json
Jede JSON-Datei entspricht dem COCO-Datenformat Spezifikation mit drei Pflichtfeldern — images, annotationsund categories:
{
"images": [{ "id": 1, "file_name": "img_001.jpg", "width": 640, "height": 480 }],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 50, 200, 150],
"area": 30000,
"iscrowd": 0
}
],
"categories": [
{ "id": 1, "name": "helmet" },
{ "id": 2, "name": "vest" }
]
}
2. Annotationen konvertieren
Verwenden Sie den convert_coco() Funktion zur Konvertierung Ihrer COCO -Annotationen in YOLO .txt Format:
COCO in das YOLO-Format konvertieren
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
cls91to80=False,
)
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
use_segments=True,
cls91to80=False,
)
from ultralytics.data.converter import convert_coco
convert_coco(
labels_dir="my_dataset/annotations/",
save_dir="my_dataset/converted/",
use_keypoints=True,
cls91to80=False,
)
3. Verzeichnisstruktur organisieren
Nach der Konvertierung müssen Beschriftungsdateien neben Ihren Bildern platziert werden. YOLO erwartet eine labels/ Verzeichnis, das das images/ Verzeichnis:
import shutil
from pathlib import Path
# Paths
converted_dir = Path("my_dataset/converted/labels")
dataset_dir = Path("my_dataset")
# Move labels next to images for each split
for split in ["train", "val"]:
src = converted_dir / split # convert_coco strips "instances_" prefix from JSON filename
dst = dataset_dir / "labels" / split
dst.mkdir(parents=True, exist_ok=True)
for f in src.glob("*.txt"):
shutil.move(str(f), str(dst / f.name))
Deine endgültige Datensatzstruktur sollte wie folgt aussehen:
my_dataset/
├── images/
│ ├── train/
│ │ ├── img_001.jpg
│ │ └── ...
│ └── val/
│ └── ...
├── labels/
│ ├── train/
│ │ ├── img_001.txt
│ │ └── ...
│ └── val/
│ └── ...
└── dataset.yaml
4. dataset.yaml erstellen
Erstellen Sie eine dataset.yaml Konfigurationsdatei, die Ihre COCO-Kategorien auf YOLO-Klassennamen abbildet. Diese Datei teilt YOLO mit, wo sich Ihre Daten befinden und welche Klassen zu detect sind:
import json
from pathlib import Path
import yaml
# Read categories from your COCO JSON
with open("my_dataset/annotations/instances_train.json") as f:
coco = json.load(f)
# Build class names matching convert_coco output (category_id - 1)
categories = sorted(coco["categories"], key=lambda x: x["id"])
names = {cat["id"] - 1: cat["name"] for cat in categories}
# NOTE: convert_coco maps class IDs as category_id - 1, so category_id must
# start from 1. If your categories start from 0, add 1 to each ID first.
# Create dataset.yaml
dataset = {
"path": str(Path("my_dataset").resolve()),
"train": "images/train",
"val": "images/val",
"names": names,
}
with open("my_dataset/dataset.yaml", "w") as f:
yaml.dump(dataset, f, default_flow_style=False)
Die resultierende YAML-Datei:
path: /absolute/path/to/my_dataset
train: images/train
val: images/val
names:
0: helmet
1: vest
Weitere Informationen zum YAML-Format des Datensatzes finden Sie im Leitfaden zur Datensatzkonfiguration.
5. Ihr YOLO-Modell trainieren
Sobald Ihr konvertierter Datensatz bereitsteht, trainieren Sie ein YOLO :
Trainieren Sie mit konvertierten COCO
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load a pretrained model
results = model.train(data="my_dataset/dataset.yaml", epochs=100, imgsz=640)
yolo detect train model=yolo26n.pt data=my_dataset/dataset.yaml epochs=100 imgsz=640
Tipps und bewährte Verfahren zum Training finden Sie im Leitfaden zum Modelltraining.
6. Überprüfen Sie Ihre Konvertierung
Vor dem Training überprüfen Sie stichprobenartig einige Label-Dateien, um zu bestätigen, dass Klassen-IDs und Koordinaten korrekt sind:
from pathlib import Path
label_file = Path("my_dataset/labels/train/img_001.txt")
for line in label_file.read_text().strip().splitlines():
parts = line.split()
cls_id = int(parts[0])
coords = [float(v) for v in parts[1:5]]
assert cls_id >= 0, f"Negative class ID {cls_id} — category_id in your JSON may start from 0"
assert all(0 <= v <= 1 for v in coords), f"Coordinates out of [0, 1] range: {coords}"
Tipp
Wenn du negative Klassen-IDs siehst, verwendet dein COCO wahrscheinlich category_id Beginnend bei 0. Zu allen 1 addieren category_id Werte in Ihrer JSON-Datei, bevor Sie das Programm ausführen convert_coco(), da es Klassen-IDs als category_id - 1.
Fehlerbehebung bei häufigen Problemen
Falsche Klassen-IDs nach der Konvertierung
Wenn Ihr Modell zwar trainiert wird, aber falsche Objektklassen erkennt, verwenden Sie wahrscheinlich cls91to80=True (Standard) auf einem benutzerdefinierten Datensatz. Dies ordnet Ihre category_id Werte über die COCO -Nachschlagetabelle COCO , die nur für den Standard gilt COCO-Datensatz.
Lösung: Immer verwenden cls91to80=False für benutzerdefinierte Datensätze.
Während des Trainings wurden keine Labels gefunden
Wenn das Training zeigt WARNING: No labels found oder 0 images, N backgrounds, Ihre Label-Dateien befinden sich nicht im erwarteten Verzeichnis. convert_coco() speichert die Etiketten in einem separaten Ausgabeverzeichnis (z. B. save_dir/labels/train/), aber YOLO erwartet labels/ parallel zu images/ in Ihrem Datensatzverzeichnis.
Lösung: Verschieben Sie Beschriftungsdateien, um der erwarteten Struktur zu entsprechen Verzeichnisstruktur. Stellen Sie sicher, labels/train/ ist ein Geschwisterteil von images/train/.
KeyError bei der Konvertierung
Wenn Sie KeyError: 'bbox' oder ähnliche Fehler beim Ausführen convert_coco(), Ihre labels_dir enthält wahrscheinlich JSON-Dateien, die keine Instanzen sind (z. B. captions_train2017.json) die eine andere Annotationsstruktur aufweisen.
Lösung: Platzieren Sie nur JSON-Dateien für Instanzannotationen (z.B., instances_train2017.json) in der labels_dir.
Leere Etikettendateien nach der Konvertierung
Wenn die Konvertierung abgeschlossen ist, aber .txt Wenn Dateien leer sind oder fehlen, können alle Anmerkungen iscrowd: 1 (üblich bei SAM-generierte Masken), oder Bounding Boxes haben keine Breite oder Höhe.
Lösung: Überprüfen Sie Ihre JSON-Annotationen auf iscrowd Werte. Bei Verwendung von SAM muss das JSON-Datenformat vorab aufbereitet werden, um iscrowd: 0.
Lücken in den Klassen-IDs bei konvertierten Labels
Wenn die Klassen-IDs in den Label-Dateien nicht fortlaufend sind (z. B. 0, 4, 9 statt 0, 1, 2), verwendet Ihr Annotationswerkzeug nicht fortlaufende category_id Werte.
Lösung: Überprüfen Sie die Klassen-IDs in Ihren .txt Dateien entsprechen dem names Wörterbuch in dataset.yaml. Ordnen Sie IDs bei Bedarf zusammenhängenden Werten neu zu.
Ausführliche Informationen zur API und Beschreibungen der Parameter finden Sie unter convert_coco API-Referenz.
FAQ
Wie konvertiere ich COCO -Annotationen in YOLO ?
Verwenden Sie den convert_coco() Funktion von Ultralytics Konvertierung von COCO -Annotationen in YOLO .txt Format. Einstellen cls91to80=False für benutzerdefinierte Datensätze:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/annotations/", save_dir="output/", cls91to80=False)
Nach der Konvertierung organisieren Sie Ihre Beschriftungsdateien neu, sodass labels/ spiegelt die images/ Verzeichnis, dann erstellen Sie ein dataset.yaml Datei. Siehe die Schritt-für-Schritt-Anleitung für den gesamten Arbeitsablauf.
Warum zeigt YOLO nach COCO die Meldung „Keine Labels gefunden“ an?
Das liegt daran, dass convert_coco() speichert Etiketten in einem Unterverzeichnis innerhalb von save_dir/labels/ (z. B. save_dir/labels/train/) anstatt direkt in den Datensatz Ihres labels/train/ zusammen mit images/train/. YOLO erwartet, dass Labels parallel zu Bildern liegen — zum Beispiel, images/train/img.jpg Bedürfnisse labels/train/img.txt. Verschieben Sie Ihre konvertierten Labels, um dieser Struktur zu entsprechen. Siehe Festlegen der Verzeichnisstruktur.
Was bedeutet cls91to80 tun in convert_coco()?
Die cls91to80 Der Parameter steuert, wie COCO category_id Die Werte werden den YOLO -IDs zugeordnet. Wenn True (Standard), es verwendet eine Nachschlagetabelle, die für den Standard entwickelt wurde COCO-Datensatz, das 80 Klassen mit nicht-zusammenhängenden IDs (1-90) aufweist. Für benutzerdefinierte Datensätze, immer gesetzt cls91to80=False — dabei wird einfach von jedem Wert 1 abgezogen category_id um Klassen-IDs mit Index 0 zu erstellen.
Kann ich YOLO direkt mit COCO JSON trainieren, ohne zu konvertieren?
Nicht mit der aktuellen YOLO – die Annotationen müssen im YOLO vorliegen .txt Format mit einer Datei pro Bild. Verwenden Sie convert_coco() Konvertieren Sie zunächst Ihre COCO und befolgen Sie dann diese Anleitung Leitfaden zu organisieren und zu schulen. Weitere Informationen zu den unterstützten Formaten finden Sie unter Datensatzformate.
Kann ich COCO-segment-Annotationen in das YOLO-Format konvertieren?
Ja, verwenden use_segments=True beim Aufruf convert_coco() um Polygonsegmentierungsmasken in die konvertierten YOLO einzubeziehen. Dadurch entstehen Label-Dateien, die kompatibel sind mit YOLO modelle:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_segments=True, cls91to80=False)
Wie konvertiere ich COCO -Annotationen in YOLO ?
Verwenden Sie use_keypoints=True um COCO -Annotationen für Pose-Schätzung Schulung:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="annotations/", save_dir="output/", use_keypoints=True, cls91to80=False)
Beachten Sie, dass, wenn beide use_segments und use_keypoints sind eingestellt auf True, nur Keypoints werden in die Label-Dateien geschrieben — segments werden stillschweigend ignoriert.