Vai al contenuto

Segmentazione e tracciamento delle istanze tramite Ultralytics YOLOv8 🚀

Cos'è la segmentazione delle istanze?

Ultralytics YOLOv8 La segmentazione delle istanze consiste nell'identificare e delineare i singoli oggetti in un'immagine, fornendo una comprensione dettagliata della distribuzione spaziale. A differenza della segmentazione semantica, essa etichetta in modo univoco e delinea con precisione ogni oggetto, un aspetto cruciale per compiti come il rilevamento di oggetti e l'imaging medico.

Ci sono due tipi di tracciamento della segmentazione delle istanze disponibili nel pacchetto Ultralytics :

  • Segmentazione delle istanze con gli oggetti di classe: A ogni oggetto di classe viene assegnato un colore unico per una chiara separazione visiva.

  • Segmentazione delle istanze con tracce di oggetti: Ogni traccia è rappresentata da un colore distinto che ne facilita l'identificazione e il tracciamento.



Guarda: Segmentazione delle istanze con tracciamento degli oggetti utilizzando Ultralytics YOLOv8

Campioni

Segmentazione dell'istanza Segmentazione dell'istanza + tracciamento dell'oggetto
Ultralytics Segmentazione dell'istanza Ultralytics Segmentazione dell'istanza con tracciamento dell'oggetto
Ultralytics Segmentazione dell'istanza 😍 Ultralytics Segmentazione delle istanze con tracciamento degli oggetti 🔥

Segmentazione e tracciamento delle istanze

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 Argomenti

Nome Tipo Predefinito Descrizione
mask array None Coordinate della maschera di segmentazione
mask_color RGB (255, 0, 255) Colore della maschera per ogni casella segmentata
label str None Etichetta per l'oggetto segmentato
txt_color RGB None Colore dell'etichetta per l'oggetto segmentato e tracciato

Nota

Per qualsiasi chiarimento, non esitare a postare le tue domande nella sezione Problemi diUltralytics o nella sezione di discussione indicata di seguito.

DOMANDE FREQUENTI

Come si esegue la segmentazione delle istanze utilizzando Ultralytics YOLOv8 ?

Per eseguire la segmentazione dell'istanza utilizzando Ultralytics YOLOv8 , inizializza il modello YOLO con una versione di segmentazione di YOLOv8 ed elabora i fotogrammi video attraverso di esso. Ecco un esempio di codice semplificato:

Esempio

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()

Per saperne di più sulla segmentazione delle istanze, consulta la guidaUltralytics YOLOv8 .

Qual è la differenza tra la segmentazione delle istanze e il tracciamento degli oggetti in Ultralytics YOLOv8 ?

La segmentazione delle istanze identifica e delinea i singoli oggetti all'interno di un'immagine, assegnando a ciascun oggetto un'etichetta e una maschera uniche. Il tracciamento degli oggetti estende questo concetto assegnando etichette coerenti agli oggetti nei vari fotogrammi del video, facilitando il tracciamento continuo degli stessi oggetti nel tempo. Per saperne di più sulle distinzioni, consulta la documentazione di Ultralytics YOLOv8 .

Perché dovrei utilizzare Ultralytics YOLOv8 per esempio per la segmentazione e il tracciamento rispetto ad altri modelli come Mask R-CNN o Faster R-CNN?

Ultralytics YOLOv8 offre prestazioni in tempo reale, accuratezza superiore e facilità d'uso rispetto ad altri modelli come Mask R-CNN o Faster R-CNN. YOLOv8 offre una perfetta integrazione con Ultralytics HUB, consentendo agli utenti di gestire in modo efficiente modelli, dataset e pipeline di addestramento. Scopri di più sui vantaggi di YOLOv8 nel blogUltralytics .

Come posso implementare il tracciamento degli oggetti utilizzando Ultralytics YOLOv8 ?

Per implementare il tracciamento degli oggetti, usa il metodo model.track e assicurati che l'ID di ogni oggetto sia assegnato in modo coerente in tutti i fotogrammi. Di seguito è riportato un semplice esempio:

Esempio

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()

Per saperne di più, consulta la sezione Segmentazione e tracciamento delle istanze.

Esistono set di dati forniti da Ultralytics adatti all'addestramento dei modelli di YOLOv8 , ad esempio per la segmentazione e il tracciamento?

Sì, Ultralytics offre diversi dataset adatti all'addestramento dei modelli di YOLOv8 , tra cui dataset di segmentazione e di tracciamento. Esempi di dataset, strutture e istruzioni per l'uso si trovano nella documentazione diUltralytics Datasets.



Creato 2023-12-18, Aggiornato 2024-07-14
Autori: RizwanMunawar (2), glenn-jocher (10), IvorZhu331 (1)

Commenti