1. Importieren der Bibliotheken
import os
from ultralytics import YOLO
import ultralytics
import cv2
import torch
import matplotlib.pyplot as plt
import random
import numpy as np
from PIL import Image, ImageDraw
import glob
Hier werden verschiedene Bibliotheken importiert, die für:
- Dateiverarbeitung (
os
,glob
) - Handhabung des YOLO-Modells (
ultralytics
) - Bildverarbeitung (
cv2
,PIL
) - Plotten (
matplotlib
) - Zufallswahl und Array-Verarbeitung (
random
,numpy
) - PyTorch für Tensoroperationen (
torch
) notwendig sind.
2. Laden des Modells und Vorhersagen
Sie Finden den Modell hier Yolov8m-seg.pt
Wir nutzen diese Foto:

model = YOLO("yolov8m-seg.pt")
results = model.predict(source = "people.jpg", save=True, classes = [0])
Ausgabe:
Ausgabe:
image 1/1 C:\programe\Instance Segmentattion\people.jpg: 640x448 8 persons, 842.9ms
Speed: 3.0ms preprocess, 842.9ms inference, 15.0ms postprocess per image at shape (1, 3, 640, 448)
Results saved to runs\segment\predict
yolov8m-seg.pt
) wird geladen.people.jpg
zu treffen und die Ergebnisse zu speichern.classes = [0]
gibt an, dass nur die Klasse "Person" von Interesse ist.Die Ausgabe zeigt:
- Den Pfad und die Abmessungen des Bildes.
- Anzahl der erkannten Personen (8 Personen).
- Zeit für Vorverarbeitung, Inferenz und Nachverarbeitung.
- Das Verzeichnis, in dem die Ergebnisse gespeichert sind (
runs\segment\predict
).
3. Anzeigen eines zufällig ausgewählten Ergebnisbildes
result_dir = 'runs\segment\predict'
plt.figure(figsize =(20,12))
image_names = glob.glob(os.path.join(result_dir,'*.jpg'))
image_name = random.choice(image_names)
image = Image.open(image_name)
image
Ausgabe:

- Das Verzeichnis mit den gespeicherten Ergebnissen wird angegeben.
- Eine Liste der Ergebnisbilder wird mit
glob
erhalten. - Ein zufälliges Bild aus den Ergebnissen wird ausgewählt und mit
PIL
angezeigt.
4. Überprüfen der Ergebnisse
len(results[:])
result = results[0]
len(result)
# Ausgabe
# 1
# 8
- Überprüft die Anzahl der Ergebnisse, was 1 ergibt (ein Bild wurde verarbeitet).
- Extrahiert das Ergebnis für das erste Bild.
- Die Länge des Ergebnisses zeigt die Anzahl der erkannten Objekte (8 Personen).
5. Zugriff auf Masken
masks = result.masks
len(masks)
# Ausgabe:
# 8
masks
enthält die Segmentierungsmasken für alle erkannten Objekte.len(masks)
bestätigt 8 Masken, entsprechend den 8 erkannten Personen.
5.1 Anzeigen einer Maske
mask1 = masks[0]
mask = mask1.data[0].numpy()
polygon = mask1.xy[0]
mask_img = Image.fromarray(mask, "I")
Mask_img
Ausgabe:

- Greift auf die erste Maske (
mask1
) zu. - Konvertiert die Maskendaten in ein NumPy-Array und erstellt ein Bild daraus.
polygon
enthält die Randkoordinaten der Maske.
5.2. Zeichnen des Polygons auf dem Originalbild
img = Image.open("people.jpg")
draw = ImageDraw.Draw(img)
draw.polygon(polygon, fill = (255,0,0), outline= (0,255,0),width=5)
Img
Ausgabe:

- Öffnet das Originalbild.
- Zeichnet das Polygon (Maske) auf das Bild mit den angegebenen Füll- und Umrissfarben.
5.3 Wiederholen für eine andere Maske
mask2 = masks[1]
mask2 = mask2.cpu()
mask = mask2.data[0].numpy()
polygon = mask2.xy[0]
mask_img = Image.fromarray(mask, "I")
mask_img
Ausgabe:

- Ähnliche Schritte werden für die zweite Maske wiederholt.
draw.polygon(polygon, fill = (0,255,0), outline= (255,0,0),width=5)
Img
Ausgabe:

- Zeichnet das zweite Polygon auf das Bild mit verschiedenen Farben.
Zusammenfassung
Dieses Projekt führt die Instanzsegmentierung auf einem Bild mit YOLOv8 durch, speichert die Ergebnisse und visualisiert die Segmentierungsmasken durch das Zeichnen von Polygonen auf dem Originalbild. Die Masken werden einzeln abgerufen und angezeigt, wodurch gezeigt wird, wie man mit den einzelnen Segmentierungsergebnissen umgeht und diese visualisiert.