[Tutorial] Vom Bild zur Segmentierung mit Ultralytics YOLO

particle_gun

Aktives Mitglied
Hallo,

Aufgrund dieser Diskussion stelle ich hier ein kurzes Tutorial zusammen um Objekte in Bildern automatisch zu Segmentieren. Vielleicht ist das ja für den einen oder anderen nützlich. Als Beispiel werde ich SDR Meteor Bilder von @Wilm-52 nutzen, das geht natürlich aber auch mit jedem anderen Objekt (Galaxien o.ä.) Mit diesem Tutorial kann man ein Programm trainieren, astronomische Objekte wie Sterne, Nebel oder Galaxien automatisch zu erkennen – und später neue Bilder selbstständig vorhersagen und markieren zu lassen.

Voraussetzungen sind eine Python Umgebung und ein (kostenloses) Roboflow Konto. Roboflow nutzen wir, um die mühselige Annotation der Objekte zu vereinfachen. Außerdem bekommen wir unseren Trainingsdatensatz schon fertig serviert, um ihn direkt mit der Ultralytics Bibliothek zu nutzen.

Roboflow öffnen & Projekt anlegen

  1. Die Roboflow-Webseite öffnen und einloggen.
  2. Im Public Plan ein neues Project erstellen.
  3. Als Projekttyp Instance Segmentation auswählen.
01.PNG


2. Bilder hochladen

  1. Auf Upload klicken.
  2. Die gewünschten Bilder auswählen und hochladen.
  3. Danach Save & Continue drücken.
02.PNG
 

3. Bilder annotieren

  1. Rechts im Menü Label Myself wählen.
  2. Start Annotating anklicken.

Optionen zum Annotieren

  • Manuell segmentieren
    • Werkzeug „Polygon“ oder „Brush“ nutzen und das Objekt umranden.
  • Smart Select verwenden
    • Einfach in das Objekt hinein klicken.
    • Das System schlägt automatisch ein Segment vor, das meist sehr gut passt.
    • Mit der Zeit wird Smart Select immer präziser, da es aus deinen bisherigen Annotationen lernt.

Annotation anpassen

  • Falls nötig, das Polygon durch Verschieben der weißen Kontrollpunkte korrigieren.
  • Eine Klasse (Label) zuweisen.
  • Save klicken und das nächste Bild annotieren.

Hinweis: Die im Beispiel gezeigten guten Smart-Select-Masken entstanden bereits nach nur 3 Klicks – das Tool lernt wirklich schnell mit.

03.PNG


04.PNG


05.PNG
06.PNG
 

4. Datensatzversion erstellen

  1. Wenn alle Bilder annotiert sind, links im Menü auf Dataset klicken.
  2. + New Dataset Version auswählen.

Einstellungen

  • Preprocessing und Augmentation können angepasst werden.
  • Für den Anfang empfehle ich: ohne preprocessing / augmentation starten, um erstmal saubere Rohdaten zu nutzen.
  1. Auf Create klicken.

07.PNG


5. Datensatz herunterladen

  1. In der neuen Version auf Download Dataset klicken.
  2. Ein Format auswählen – Roboflow bietet viele an, z. B. COCO, YOLO, Mask R-CNN, usw.

Für dein Setup:

  • Du möchtest mit YOLOv5 PyTorch weitermachen → entsprechendes YOLO-Format auswählen.

Der heruntergeladene Ordner enthält:

  • train, test, valid Ordner (Roboflow erstellt die Splits automatisch)
  • die data.yaml Datei für YOLOv5

08.PNG

09.PNG
 

Ultralytics YOLO per Conda installieren (Python ist da)​

  1. Neues Conda-Env anlegen und aktivieren:

Code:
conda create -n yolo python=3.11 -y
conda activate yolo

  1. Ultralytics installieren (aus conda-forge):
Code:
conda install -c conda-forge ultralytics

Optional (GPU/CUDA): alles in einem Rutsch installieren, damit Conda sauber auflöst:

Code:
conda install -c pytorch -c nvidia -c conda-forge pytorch torchvision pytorch-cuda=11.8 ultralytics

Version ggf. an deine CUDA-Version anpassen.
 

Mini-Codebeispiel: Instance Segmentation trainieren mit deinem Roboflow-Datensatz​


Voraussetzung: Du hast den Roboflow-Download im YOLOv5 PyTorch Format. Darin liegt eine data.yaml und die Ordner train/valid/test.

Python:
from ultralytics import YOLO

# 1) vortrainiertes Segmentation-Modell laden (klein zum Start)
model = YOLO("yolov8n-seg.pt")   # geht auch: "yolo11n-seg.pt" falls du das hast

# 2) Training starten
results = model.train(
    data="PFAD/ZU/deinem/roboflow_dataset/data.yaml",
    imgsz=640,
    epochs=100,
    batch=8,
    task="segment"
)

# danach findest du Runs unter runs/segment/train*

Hinweis:
  • data.yaml muss auf deine train/valid/test Pfade zeigen (Roboflow macht das normalerweise korrekt).
  • Für einen ersten Test kannst du epochs=20 setzen und ggf. batch kleiner machen, wenn der GPU-Speicher knapp ist.
 
Hier ein minimaler Code, um ein neues Bild mit deinem trainierten Instance-Segmentation-Modell zu segmentieren:

Python:
from ultralytics import YOLO

# 1) Dein trainiertes Modell laden (Pfad aus runs/segment/.../weights/best.pt)
model = YOLO("runs/segment/train/weights/best.pt")

# 2) Ein neues Bild segmentieren
results = model.predict(
    source="pfad/zu/deinem/bild.jpg",   # Bilddatei
    imgsz=640,                          # gleiche Größe wie im Training
    conf=0.25                           # Konfidenz-Schwelle
)

# 3) Ergebnisse anzeigen oder speichern
for r in results:
    r.show()       # zeigt das segmentierte Bild im Fenster
    r.save()       # speichert Ausgabe unter runs/segment/predict

Was passiert?​

  • YOLO lädt dein trainiertes Modell
  • segmentiert das Bild
  • erzeugt automatisch Ordner wie:
    runs/segment/predict/
    Dort findest du:
    • das Bild mit Masken
    • die Masken als PNG
    • die Bounding Boxes / Polygon-Koordinaten in einer TXT-Datei

Für einen ersten Test reichen bereits sehr wenige annotierte Objekte (ca. 10–50). Danach empfehle ich, systematisch weiterzumachen: neue Bilder vom Modell vorhersagen lassen, prüfen, wo die Segmentierung noch nicht gut ist, diese Beispiele nachannotieren und erneut ins Training einbauen – so entsteht Schritt für Schritt ein immer besseres Modell.

Vielleicht hat ja jemand mal Lust es auszuprobieren.

Viele Spaß und liebe Grüße
Stefanie
 
Hallo Stefanie,
vielen herzlichen Dank für die Anleitung.
Ich werde es natürlich ausprobieren. Das Labeln von Hand ist ja äußerst mühsam.
Hier im ML/KI-Thread habe ich auch noch geantwortet. Dort werde ich dann meine Ergebnisse usw reinschreiben.
Liebe Grüße
Wilhelm
 
Zurück
Oben