Isolierung von Segmentierungsobjekten
Nach der Durchführung der Segmentaufgabe ist es manchmal wünschenswert, die isolierten Objekte aus den Schlussfolgerungsergebnissen zu extrahieren. In diesem Leitfaden findest du ein allgemeines Rezept, wie du dies mit dem Ultralytics Predict Mode erreichen kannst.
Rezeptdurchlauf
-
Im AbschnittUltralytics Schnellstart-Installation findest du eine kurze Anleitung für die Installation der benötigten Bibliotheken.
-
Ein Modell laden und ausführen
predict()
Methode auf eine Quelle.from ultralytics import YOLO # Load a model model = YOLO("yolo11n-seg.pt") # Run inference results = model.predict()
Keine Vorhersage-Argumente?
Wenn du keine Quelle angibst, werden die Beispielbilder aus der Bibliothek verwendet:
Dies ist hilfreich für schnelle Tests mit dem
predict()
Methode.Weitere Informationen über Segmentierungsmodelle findest du auf der Segment Aufgabe Seite. Um mehr zu erfahren über
predict()
Methode, siehe Modus vorhersagen Abschnitt der Dokumentation.
-
Iteriere nun über die Ergebnisse und die Konturen. Für Workflows, die ein Bild in einer Datei speichern wollen, muss das Quellbild
base-name
und die Erkennungclass-label
zur späteren Verwendung abgerufen werden (optional).from pathlib import Path import numpy as np # (2) Iterate detection results (helpful for multiple images) for r in res: img = np.copy(r.orig_img) img_name = Path(r.path).stem # source image base-name # Iterate each object contour (multiple detections) for ci, c in enumerate(r): # (1) Get detection class name label = c.names[c.boxes.cls.tolist().pop()]
- Mehr über die Arbeit mit den Erkennungsergebnissen erfährst du im Abschnitt Boxen für den Vorhersagemodus.
- Um mehr zu erfahren über
predict()
Ergebnisse siehe Arbeiten mit Ergebnissen für den Vorhersagemodus
For-Schleife
Bei einem einzelnen Bild wird die erste Schleife nur einmal durchlaufen. Bei einem einzelnen Bild mit nur einer Erkennung wird jede Schleife nur einmal durchlaufen.
-
Beginne mit der Erstellung einer binären Maske aus dem Quellbild und zeichne dann eine gefüllte Kontur auf die Maske. So kann das Objekt von den anderen Teilen des Bildes isoliert werden. Ein Beispiel aus
bus.jpg
für eine der erkanntenperson
Klassenobjekte ist rechts abgebildet.import cv2 # Create binary mask b_mask = np.zeros(img.shape[:2], np.uint8) # (1) Extract contour result contour = c.masks.xy.pop() # (2) Changing the type contour = contour.astype(np.int32) # (3) Reshaping contour = contour.reshape(-1, 1, 2) # Draw contour onto mask _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
-
Für weitere Informationen über
c.masks.xy
siehe Masken Abschnitt aus dem Vorhersagemodus. -
Hier werden die Werte in
np.int32
für die Kompatibilität mitdrawContours()
function from OpenCV. -
Die OpenCV
drawContours()
Funktion erwartet, dass die Konturen eine Form von[N, 1, 2]
Abschnitt unten für weitere Details erweitern.
Erweitern Sie, um zu verstehen, was passiert, wenn Sie die
contour
variabel.-
c.masks.xy
:: Liefert die Koordinaten der Maskenkonturpunkte im Format(x, y)
. Weitere Einzelheiten findest du in der Masken Abschnitt aus dem Vorhersagemodus. -
.pop()
:: Asmasks.xy
eine Liste ist, die ein einzelnes Element enthält, wird dieses Element mit der Methodepop()
Methode. -
.astype(np.int32)
:: Verwendung vonmasks.xy
wird mit einem Datentyp vonfloat32
aber das ist nicht kompatibel mit der OpenCVdrawContours()
Funktion, also wird der Datentyp inint32
für Kompatibilität. -
.reshape(-1, 1, 2)
:: Formatiert die Daten in die gewünschte Form von[N, 1, 2]
woN
ist die Anzahl der Konturpunkte, wobei jeder Punkt durch einen einzelnen Eintrag repräsentiert wird1
und der Eintrag besteht aus2
Werte. Die-1
bedeutet, dass die Anzahl der Werte entlang dieser Dimension flexibel ist.
Erweitern Sie für eine Erklärung der
drawContours()
Konfiguration.-
Die Verkapselung der
contour
Variable in eckigen Klammern,[contour]
wurde bei den Tests festgestellt, dass sie die gewünschte Konturenmaske effektiv erzeugt. -
Der Wert
-1
angegeben für diedrawContours()
Parameter weist die Funktion an, alle im Bild vorhandenen Konturen zu zeichnen. -
Die
tuple
(255, 255, 255)
steht für die Farbe Weiß, die die gewünschte Farbe zum Zeichnen der Kontur in dieser binären Maske ist. -
Der Zusatz von
cv2.FILLED
färbt alle von der Konturbegrenzung eingeschlossenen Pixel gleich, in diesem Fall sind alle eingeschlossenen Pixel weiß. -
Siehe OpenCV Dokumentation auf
drawContours()
für weitere Informationen.
-
-
Als Nächstes gibt es 2 Optionen, wie du mit dem Bild von diesem Punkt aus weitermachen kannst, und eine weitere Option für jede.
Optionen zur Objektisolierung
Beispiel
# Create 3-channel mask mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) # Isolate object with binary mask isolated = cv2.bitwise_and(mask3ch, img)
Wie funktioniert das?
-
Zunächst wird die binäre Maske von einem einkanaligen Bild in ein dreikanaliges Bild umgewandelt. Diese Umwandlung ist für den nachfolgenden Schritt notwendig, bei dem die Maske und das Originalbild kombiniert werden. Beide Bilder müssen die gleiche Anzahl von Kanälen haben, damit sie mit dem Überblendvorgang kompatibel sind.
-
Das Originalbild und die Dreikanal-Binärmaske werden mit der OpenCV-Funktion zusammengeführt
bitwise_and()
. Bei diesem Vorgang bleiben die nur Pixelwerte, die größer als Null sind(> 0)
aus beiden Bildern. Da die Pixel der Maske größer als Null sind(> 0)
nur Innerhalb der Konturregion bleiben die Pixel des Originalbildes übrig, die sich mit der Kontur überschneiden.
Mit schwarzen Pixeln isolieren: Unteroptionen
Bild in voller Größe
Es sind keine weiteren Schritte erforderlich, wenn du das Bild in voller Größe behältst.
Ausgeschnittenes Objekt Bild
Zusätzliche Schritte sind erforderlich, um das Bild so zuzuschneiden, dass es nur die Objektregion enthält.
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- For more information on bounding box results, see Boxes Section from Predict Mode
Was bewirkt dieser Code?
-
Die
c.boxes.xyxy.cpu().numpy()
Aufruf ruft die Bounding Boxes als NumPy-Array in derxyxy
Format, wobeixmin
,ymin
,xmax
, undymax
stehen für die Koordinaten des Begrenzungsrahmen-Rechtecks. Siehe Kästchen Abschnitt aus dem Vorhersagemodus für weitere Details. -
Die
squeeze()
Operation entfernt alle unnötigen Dimensionen aus dem NumPy-Array und stellt sicher, dass es die erwartete Form hat. -
Umrechnung der Koordinatenwerte mit
.astype(np.int32)
ändert den Datentyp der Feldkoordinaten vonfloat32
zuint32
Dadurch sind sie für das Zuschneiden von Bildern mit Indexscheiben geeignet. -
Schließlich wird die Bounding-Box-Region mithilfe von Index-Slicing aus dem Bild ausgeschnitten. Die Begrenzungen werden durch den
[ymin:ymax, xmin:xmax]
Koordinaten des Begrenzungsrahmens der Erkennung.
# Isolate object with transparent background (when saved as PNG) isolated = np.dstack([img, b_mask])
Wie funktioniert das?
- Die Verwendung der NumPy
dstack()
(Array-Stapelung entlang der Tiefenachse) in Verbindung mit der erzeugten binären Maske ein Bild mit vier Kanälen. Dadurch werden alle Pixel außerhalb der Objektkontur transparent, wenn das Bild alsPNG
Datei.
Mit transparenten Pixeln isolieren: Unteroptionen
Bild in voller Größe
Es sind keine weiteren Schritte erforderlich, wenn du das Bild in voller Größe behältst.
Ausgeschnittenes Objekt Bild
Zusätzliche Schritte sind erforderlich, um das Bild so zuzuschneiden, dass es nur die Objektregion enthält.
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- Weitere Informationen zu Bounding-Box-Ergebnissen findest du unter Boxen-Abschnitt im Vorhersagemodus
Was bewirkt dieser Code?
-
Bei der Verwendung von
c.boxes.xyxy.cpu().numpy()
werden die Bounding Boxes als NumPy-Array zurückgegeben, indem diexyxy
Box-Koordinatenformat, die den Punkten entsprechenxmin, ymin, xmax, ymax
für den Begrenzungsrahmen (Rechteck), siehe Kästchen Abschnitt aus dem Vorhersagemodus für weitere Informationen. -
Hinzufügen von
squeeze()
sorgt dafür, dass alle überflüssigen Dimensionen aus dem NumPy-Array entfernt werden. -
Umrechnung der Koordinatenwerte mit
.astype(np.int32)
ändert den Datentyp der Feldkoordinaten vonfloat32
zuint32
die beim Zuschneiden des Bildes mit Hilfe von Index-Slices kompatibel sein werden. -
Schließlich wird die Bildregion für die Bounding Box mithilfe von Index-Slicing zugeschnitten, wobei die Grenzen mit der Funktion
[ymin:ymax, xmin:xmax]
Koordinaten des Begrenzungsrahmens der Erkennung.
Was ist, wenn ich das ausgeschnittene Objekt einschließlich des Hintergrunds haben möchte?
Dies ist eine eingebaute Funktion der Bibliothek Ultralytics . Siehe die
save_crop
Argument für Predict Mode Inference Argumente für Details.
-
-
Was als Nächstes zu tun ist, bleibt ganz dir als Entwickler überlassen. Ein einfaches Beispiel für einen möglichen nächsten Schritt (Speichern des Bildes in einer Datei zur späteren Verwendung) wird hier gezeigt.
- HINWEIS: Dieser Schritt ist optional und kann übersprungen werden, wenn er für deinen speziellen Anwendungsfall nicht erforderlich ist.
Beispiel Letzter Schritt
- In diesem Beispiel wird die
img_name
ist der Basisname der Quellbilddatei,label
ist der erkannte Klassenname, undci
is the index of the object detection (in case of multiple instances with the same class name).
Vollständiger Beispielcode
Hier werden alle Schritte aus dem vorherigen Abschnitt in einem einzigen Codeblock zusammengefasst. Bei wiederholter Verwendung wäre es optimal, eine Funktion zu definieren, die einige oder alle Befehle aus dem for
-Schleifen, aber das ist eine Übung, die dem Leser überlassen bleibt.
from pathlib import Path
import cv2
import numpy as np
from ultralytics import YOLO
m = YOLO("yolo11n-seg.pt") # (4)!
res = m.predict() # (3)!
# Iterate detection results (5)
for r in res:
img = np.copy(r.orig_img)
img_name = Path(r.path).stem
# Iterate each object contour (6)
for ci, c in enumerate(r):
label = c.names[c.boxes.cls.tolist().pop()]
b_mask = np.zeros(img.shape[:2], np.uint8)
# Create contour mask (1)
contour = c.masks.xy.pop().astype(np.int32).reshape(-1, 1, 2)
_ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
# Choose one:
# OPTION-1: Isolate object with black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
# OPTION-2: Isolate object with transparent background (when saved as PNG)
isolated = np.dstack([img, b_mask])
# OPTIONAL: detection crop (from either OPT1 or OPT2)
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]
# TODO your actions go here (2)
- Die Zeile, die
contour
wird hier in einer einzigen Zeile zusammengefasst, wo sie oben auf mehrere Zeilen aufgeteilt war. - Was hier hingehört, entscheidest du!
- Weitere Informationen findest du unter Vorhersagemodus.
- Siehe Segmentaufgabe für weitere Informationen.
- Erfahre mehr über das Arbeiten mit Ergebnissen
- Erfahre mehr über die Ergebnisse der Segmentierungsmaske
FAQ
How do I isolate objects using Ultralytics YOLO11 for segmentation tasks?
To isolate objects using Ultralytics YOLO11, follow these steps:
-
Lade das Modell und führe die Inferenz durch:
-
Erstelle eine binäre Maske und zeichne Konturen:
-
Isoliere das Objekt mithilfe der binären Maske:
Weitere Informationen findest du in der Anleitung zum Vorhersagemodus und zur Segmentaufgabe.
Welche Optionen gibt es, um die isolierten Objekte nach der Segmentierung zu speichern?
Ultralytics YOLO11 offers two main options for saving isolated objects:
-
Mit schwarzem Hintergrund:
-
Mit einem transparenten Hintergrund:
Weitere Informationen findest du im Abschnitt Vorhersagemodus.
How can I crop isolated objects to their bounding boxes using Ultralytics YOLO11?
Um isolierte Objekte auf ihre Boundingboxen zuzuschneiden:
-
Abrufen von Bounding-Box-Koordinaten:
-
Schneide das isolierte Bild zu:
Erfahre mehr über Bounding-Box-Ergebnisse in der Dokumentation zum Vorhersagemodus.
Why should I use Ultralytics YOLO11 for object isolation in segmentation tasks?
Ultralytics YOLO11 provides:
- Hochgeschwindigkeits-Objekterkennung und -segmentierung in Echtzeit.
- Genaue Bounding Box und Maskengenerierung für eine präzise Objektisolierung.
- Umfassende Dokumentation und benutzerfreundliche API für eine effiziente Entwicklung.
Erkunde die Vorteile der Verwendung von YOLO in der Dokumentation zu den Segmentaufgaben.
Can I save isolated objects including the background using Ultralytics YOLO11?
Yes, this is a built-in feature in Ultralytics YOLO11. Use the save_crop
Argument in der predict()
Methode. Zum Beispiel:
Lies mehr über die save_crop
Argument in der Predict Mode Inference Argumente Abschnitt.