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):
            annotator.seg_bbox(mask=mask,
                               mask_color=colors(int(cls), True),
                               det_label=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()
import cv2
from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

from collections import defaultdict

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

seg_bbox Arguments

Nom Type Défaut Description
mask array None Coordonnées du masque de segmentation
mask_color tuple (255, 0, 255) Couleur du masque pour chaque boîte segmentée
det_label str None Étiquette pour l'objet segmenté
track_label str None É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.



Créé le 2023-12-18, Mis à jour le 2024-03-03
Auteurs : glenn-jocher (6), RizwanMunawar (2)

Commentaires