Skip to content

Segmentation et suivi des instances à l'aide de Ultralytics YOLOv8 🚀

Qu'est-ce que la segmentation des instances ?

Ultralytics YOLOv8 La segmentation d'instance consiste à identifier et à délimiter des objets individuels dans une image, ce qui permet de comprendre en détail la distribution spatiale. Contrairement à la segmentation sémantique, elle étiquette de façon unique et délimite précisément chaque objet, ce qui est crucial pour des tâches telles que la détection d'objets et l'imagerie médicale.

Il existe deux types de suivi de la segmentation des instances disponibles sur le site Ultralytics :

  • Segmentation des instances à l'aide d'objets de classe : Chaque objet de classe se voit attribuer une couleur unique pour une séparation visuelle claire.

  • Segmentation des instances avec des traces d'objets : Chaque trace est représentée par une couleur distincte, ce qui facilite l'identification et le suivi.



Regarde : Segmentation d'instances avec suivi d'objets à l'aide de Ultralytics YOLOv8

Échantillons

Segmentation des instances Segmentation des instances + suivi des objets
Ultralytics Segmentation des instances Ultralytics Segmentation des instances avec suivi des objets
Ultralytics Segmentation des instances 😍 Ultralytics Segmentation d'instances avec suivi d'objets 🔥

Segmentation et suivi des instances

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 Arguments

Nom Type Défaut Description
mask array None Coordonnées du masque de segmentation
mask_color RGB (255, 0, 255) Couleur du masque pour chaque boîte segmentée
label str None Étiquette pour l'objet segmenté
txt_color RGB None Couleur de l'étiquette pour l'objet segmenté et suivi

Note

Pour toute demande de renseignements, n'hésite pas à poster tes questions dans la section des problèmes deUltralytics ou dans la section de discussion mentionnée ci-dessous.

FAQ

Comment effectuer une segmentation des instances à l'aide de Ultralytics YOLOv8 ?

Pour effectuer une segmentation d'instance à l'aide de Ultralytics YOLOv8 , initialise le modèle YOLO avec une version de segmentation de YOLOv8 et traite les images vidéo à travers lui. Voici un exemple de code simplifié :

Exemple

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

Pour en savoir plus sur la segmentation des instances, consulte le guideUltralytics YOLOv8 .

Quelle est la différence entre la segmentation des instances et le suivi des objets dans Ultralytics YOLOv8 ?

La segmentation d'instance identifie et délimite les objets individuels dans une image, en donnant à chaque objet une étiquette et un masque uniques. Le suivi d'objet étend ce principe en attribuant des étiquettes cohérentes aux objets sur l'ensemble des images vidéo, ce qui facilite le suivi continu des mêmes objets au fil du temps. Pour en savoir plus sur ces distinctions, consulte la documentation deUltralytics YOLOv8 .

Pourquoi devrais-je utiliser Ultralytics YOLOv8 pour la segmentation et le suivi par exemple, plutôt que d'autres modèles comme Mask R-CNN ou Faster R-CNN ?

Ultralytics YOLOv8 offre des performances en temps réel, une précision supérieure et une facilité d'utilisation par rapport à d'autres modèles comme Mask R-CNN ou Faster R-CNN. YOLOv8 offre une intégration transparente avec Ultralytics HUB, ce qui permet aux utilisateurs de gérer efficacement les modèles, les ensembles de données et les pipelines de formation. Découvre plus en détail les avantages de YOLOv8 dans le blogUltralytics .

Comment puis-je mettre en œuvre le suivi d'objets à l'aide de Ultralytics YOLOv8 ?

Pour mettre en œuvre le suivi des objets, utilise le model.track et s'assurer que l'ID de chaque objet est attribué de manière cohérente d'une image à l'autre. Voici un exemple simple :

Exemple

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

Tu trouveras plus d'informations dans la section Segmentation et suivi des instances.

Existe-t-il des ensembles de données fournis par Ultralytics qui conviennent à l'entraînement des modèles YOLOv8 , par exemple pour la segmentation et le suivi ?

Oui, Ultralytics propose plusieurs ensembles de données adaptés à l'entraînement des modèles YOLOv8 , y compris des ensembles de données de segmentation et de suivi. Des exemples de jeux de données, des structures et des instructions d'utilisation sont disponibles dans la documentationUltralytics Datasets.



Créé le 2023-12-18, Mis à jour le 2024-07-14
Auteurs : RizwanMunawar (2), glenn-jocher (10), IvorZhu331 (1)

Commentaires