Zum Inhalt springen

Segmentierung und Verfolgung von Instanzen mit Ultralytics YOLOv8 🚀

Was ist Instanzsegmentierung?

Ultralytics YOLOv8 Bei der Instanzsegmentierung geht es darum, einzelne Objekte in einem Bild zu identifizieren und abzugrenzen, um ein detailliertes Verständnis der räumlichen Verteilung zu erhalten. Anders als bei der semantischen Segmentierung wird dabei jedes Objekt eindeutig gekennzeichnet und genau abgegrenzt, was für Aufgaben wie die Objekterkennung und die medizinische Bildgebung entscheidend ist.

Es gibt zwei Arten der Instanzsegmentierung, die im Paket Ultralytics verfügbar sind:

  • Instanzsegmentierung mit Klassenobjekten: Jedem Klassenobjekt wird eine eindeutige Farbe zugewiesen, um eine klare visuelle Trennung zu ermöglichen.

  • Instanzsegmentierung mit Objektspuren: Jede Spur wird durch eine bestimmte Farbe dargestellt, was die Identifizierung und Verfolgung erleichtert.



Pass auf: Instanz-Segmentierung mit Objektverfolgung mit Ultralytics YOLOv8

Proben

Instanz-Segmentierung Instanz-Segmentierung + Objektverfolgung
Ultralytics Instanz-Segmentierung Ultralytics Instanz-Segmentierung mit Objektverfolgung
Ultralytics Instanz-Segmentierung 😍. Ultralytics Instanzsegmentierung mit Objektverfolgung 🔥

Segmentierung und Verfolgung von Instanzen

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

model = YOLO("yolov8n-seg.pt")  # segmentation model
names = model.model.names
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        print("Video frame is empty or video processing has been successfully completed.")
        break

    results = model.predict(im0)
    annotator = Annotator(im0, line_width=2)

    if results[0].masks is not None:
        clss = results[0].boxes.cls.cpu().tolist()
        masks = results[0].masks.xy
        for mask, cls in zip(masks, clss):
            color = colors(int(cls), True)
            txt_color = annotator.get_txt_color(color)
            annotator.seg_bbox(mask=mask, mask_color=color, label=names[int(cls)], txt_color=txt_color)

    out.write(im0)
    cv2.imshow("instance-segmentation", im0)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()
from collections import defaultdict

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

track_history = defaultdict(lambda: [])

model = YOLO("yolov8n-seg.pt")  # segmentation model
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation-object-tracking.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        print("Video frame is empty or video processing has been successfully completed.")
        break

    annotator = Annotator(im0, line_width=2)

    results = model.track(im0, persist=True)

    if results[0].boxes.id is not None and results[0].masks is not None:
        masks = results[0].masks.xy
        track_ids = results[0].boxes.id.int().cpu().tolist()

        for mask, track_id in zip(masks, track_ids):
            color = colors(int(track_id), True)
            txt_color = annotator.get_txt_color(color)
            annotator.seg_bbox(mask=mask, mask_color=color, label=str(track_id), txt_color=txt_color)

    out.write(im0)
    cv2.imshow("instance-segmentation-object-tracking", im0)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

seg_bbox Argumente

Name Typ Standard Beschreibung
mask array None Koordinaten der Segmentierungsmaske
mask_color RGB (255, 0, 255) Maskenfarbe für jede segmentierte Box
label str None Etikett für segmentiertes Objekt
txt_color RGB None Beschriftungsfarbe für segmentierte und verfolgte Objekte

Hinweis

Wenn du Fragen hast, kannst du sie im BereichUltralytics oder im unten stehenden Diskussionsbereich stellen.

FAQ

Wie führe ich eine Instanzsegmentierung mit Ultralytics YOLOv8 durch?

Um eine Instanzsegmentierung mit Ultralytics YOLOv8 durchzuführen, initialisiere das Modell YOLO mit einer Segmentierungsversion von YOLOv8 und verarbeite die Videobilder damit. Hier ist ein vereinfachtes Codebeispiel:

Beispiel

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

model = YOLO("yolov8n-seg.pt")  # segmentation model
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        break

    results = model.predict(im0)
    annotator = Annotator(im0, line_width=2)

    if results[0].masks is not None:
        clss = results[0].boxes.cls.cpu().tolist()
        masks = results[0].masks.xy
        for mask, cls in zip(masks, clss):
            annotator.seg_bbox(mask=mask, mask_color=colors(int(cls), True), det_label=model.model.names[int(cls)])

    out.write(im0)
    cv2.imshow("instance-segmentation", im0)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

Erfahre mehr über die Segmentierung von Instanzen im Ultralytics YOLOv8 Leitfaden.

Was ist der Unterschied zwischen Instanzsegmentierung und Objektverfolgung in Ultralytics YOLOv8 ?

Die Instanzensegmentierung identifiziert und umreißt einzelne Objekte in einem Bild und gibt jedem Objekt eine eindeutige Kennzeichnung und Maske. Die Objektverfolgung erweitert dies, indem sie den Objekten über alle Videobilder hinweg einheitliche Beschriftungen zuweist und so eine kontinuierliche Verfolgung der gleichen Objekte über die Zeit hinweg ermöglicht. Weitere Informationen zu den Unterschieden findest du in der DokumentationUltralytics YOLOv8 .

Warum sollte ich Ultralytics YOLOv8 zum Beispiel für Segmentierung und Tracking gegenüber anderen Modellen wie Mask R-CNN oder Faster R-CNN verwenden?

Ultralytics YOLOv8 bietet im Vergleich zu anderen Modellen wie Mask R-CNN oder Faster R-CNN Leistung in Echtzeit, überragende Genauigkeit und Benutzerfreundlichkeit. YOLOv8 bietet eine nahtlose Integration mit Ultralytics HUB, so dass Benutzer Modelle, Datensätze und Trainingspipelines effizient verwalten können. Erfahre mehr über die Vorteile von YOLOv8 im Ultralytics Blog.

Wie kann ich die Objektverfolgung mit Ultralytics YOLOv8 implementieren?

Um die Objektverfolgung zu implementieren, verwendest du die model.track Methode und stelle sicher, dass die ID jedes Objekts in allen Frames einheitlich zugewiesen wird. Im Folgenden findest du ein einfaches Beispiel:

Beispiel

from collections import defaultdict

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

track_history = defaultdict(lambda: [])

model = YOLO("yolov8n-seg.pt")  # segmentation model
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation-object-tracking.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        break

    annotator = Annotator(im0, line_width=2)
    results = model.track(im0, persist=True)

    if results[0].boxes.id is not None and results[0].masks is not None:
        masks = results[0].masks.xy
        track_ids = results[0].boxes.id.int().cpu().tolist()

        for mask, track_id in zip(masks, track_ids):
            annotator.seg_bbox(mask=mask, mask_color=colors(track_id, True), track_label=str(track_id))

    out.write(im0)
    cv2.imshow("instance-segmentation-object-tracking", im0)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

Mehr dazu findest du im Abschnitt Instance-Segmentierung und Tracking.

Gibt es Datensätze, die von Ultralytics zur Verfügung gestellt werden und für das Training von YOLOv8 Modellen geeignet sind, z. B. für Segmentierung und Tracking?

Ja, Ultralytics bietet mehrere Datensätze, die sich für das Training von YOLOv8 Modellen eignen, darunter Segmentierungs- und Tracking-Datensätze. Beispiele für Datensätze, Strukturen und Anleitungen zur Verwendung findest du in der DokumentationUltralytics Datasets.



Erstellt 2023-12-18, Aktualisiert 2024-07-14
Autoren: RizwanMunawar (2), glenn-jocher (10), IvorZhu331 (1)

Kommentare