Modellvorhersage mit Ultralytics YOLO#
Einführung#
In der Welt des maschinellen Lernens und des maschinellen Sehens wird der Prozess, visuelle Daten zu interpretieren, oft Inferenz oder Vorhersage genannt. Ultralytics YOLO26 bietet eine leistungsstarke Funktion namens Vorhersagemodus, die für leistungsstarke Inferenz in Echtzeit mit einer Vielzahl von Datenquellen ausgelegt ist.
Geplante Inferenzbeispiele findest du in der Vorschau auf das noch nicht veröffentlichte YOLO27.
Ansehen: So extrahierst du Ergebnisse aus Ultralytics YOLO26-Aufgaben für eigene Projekte 🚀
Anwendungen in der Praxis#
| Fertigung | Sport | Sicherheit |
|---|---|---|
| Erkennung von Fahrzeugersatzteilen | Erkennung von Fußballspielern | Erkennung von Stürzen |
Warum Ultralytics YOLO für Inferenz verwenden?#
Darum solltest du den Vorhersagemodus von YOLO26 für deine verschiedenen Inferenzanforderungen in Betracht ziehen:
- Vielseitigkeit: Inferenz auf Bildern, Videos und sogar Live-Streams ausführen.
- Leistung: Für echtzeitfähige Verarbeitung mit hoher Geschwindigkeit entwickelt, ohne Abstriche bei der Genauigkeit.
- Einfache Bedienung: Intuitive Schnittstellen für Python und CLI ermöglichen eine schnelle Bereitstellung und Prüfung.
- Umfangreiche Anpassungsmöglichkeiten: Verschiedene Einstellungen und Parameter, mit denen du das Inferenzverhalten des Modells an deine konkreten Anforderungen anpassen kannst.
- Bereit für den Produktionseinsatz: Stelle Modelle als Inferenzendpunkte der Ultralytics Platform mit automatischer Skalierung und Überwachung bereit oder führe die Inferenz lokal aus.
Wichtige Funktionen des Vorhersagemodus#
Der Vorhersagemodus von YOLO26 ist auf Robustheit und Vielseitigkeit ausgelegt und bietet:
- Kompatibilität mit verschiedenen Datenquellen: Ganz gleich, ob deine Daten aus einzelnen Bildern, einer Bildersammlung, Videodateien oder Echtzeit-Videostreams bestehen – der Vorhersagemodus ist dafür geeignet.
- Streaming-Modus: Verwende die Streaming-Funktion, um einen speichereffizienten Generator von
Results-Objekten zu erstellen. Aktiviere diese Funktion, indem dustream=Truein der Aufrufmethode des Prädiktors setzt. Anders als beim Standardverhalten (stream=False), das eine Liste mit allen Ergebnissen zurückgibt, liefertstream=Truedie Ergebnisse einzeln. Das ist besonders bei langen Videos und Live-Streams nützlich. - Stapelverarbeitung: Verarbeite mehrere Bilder oder Videoframes in einem einzigen Stapel und verkürze so die gesamte Inferenzzeit.
- Einfache Integration: Dank der flexiblen API lässt sich das System problemlos in bestehende Datenpipelines und andere Softwarekomponenten integrieren.
Ultralytics YOLO-Modelle geben entweder eine Python-Liste mit Results-Objekten oder einen speichereffizienten Generator mit Results-Objekten zurück, wenn bei der Inferenz stream=True an das Modell übergeben wird:
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt") # vortrainiertes YOLO26n-Modell
# Stapelweise Inferenz auf einer Liste von Bildern ausführen
results = model(["image1.jpg", "image2.jpg"]) # eine Liste mit Results-Objekten zurückgeben
# Ergebnisliste verarbeiten
for result in results:
boxes = result.boxes # Boxes-Objekt für Begrenzungsrahmen-Ausgaben
masks = result.masks # Masks-Objekt für Segmentierungsmasken-Ausgaben
keypoints = result.keypoints # Keypoints-Objekt für Posenausgaben
probs = result.probs # Probs-Objekt für Klassifizierungsausgaben
obb = result.obb # Oriented-Boxes-Objekt für OBB-Ausgaben
result.show() # auf dem Bildschirm anzeigen
result.save(filename="result.jpg") # auf dem Datenträger speichernInferenzquellen#
YOLO26 kann für die Inferenz verschiedene Arten von Eingabequellen verarbeiten, wie in der folgenden Tabelle gezeigt. Zu den Quellen gehören statische Bilder, Videostreams und verschiedene Datenformate. Die Tabelle zeigt außerdem, ob sich die jeweilige Quelle mit dem Argument stream=True ✅ im Streaming-Modus verwenden lässt. Der Streaming-Modus eignet sich für die Verarbeitung von Videos oder Live-Streams, da er einen Ergebnisgenerator erstellt, anstatt alle Frames in den Arbeitsspeicher zu laden.
Verwende stream=True, um den Arbeitsspeicher bei der Verarbeitung langer Videos oder großer Datensätze effizient zu verwalten. Bei stream=False werden die Ergebnisse für alle Frames oder Datenpunkte im Arbeitsspeicher gespeichert. Bei großen Eingaben kann sich der Speicherbedarf schnell summieren und zu Fehlern wegen unzureichenden Arbeitsspeichers führen. stream=True verwendet dagegen einen Generator, der nur die Ergebnisse des aktuellen Frames oder Datenpunkts im Arbeitsspeicher hält. Dadurch sinkt der Speicherverbrauch deutlich und Probleme wegen unzureichenden Arbeitsspeichers werden vermieden.
| Quelle | Beispiel | Typ | Hinweise |
|---|---|---|---|
| Bild | 'image.jpg' | str oder Path | Einzelne Bilddatei. |
| URL | 'https://ultralytics.com/images/bus.jpg' | str | URL zu einem Bild. |
| Screenshot | 'screen' | str | Einen Screenshot aufnehmen. |
| PIL | Image.open('image.jpg') | PIL.Image | HWC-Format mit RGB-Kanälen. |
| OpenCV | cv2.imread('image.jpg') | np.ndarray | HWC-Format mit BGR-Kanälen uint8 (0-255). |
| NumPy | np.zeros((640,1280,3)) | np.ndarray | HWC-Format mit BGR-Kanälen uint8 (0-255). |
| torch | torch.zeros(16,3,320,640) | torch.Tensor | BCHW-Format mit RGB-Kanälen float32 (0.0-1.0). |
| CSV | 'sources.csv' | str oder Path | CSV-Datei mit Pfaden zu Bildern, Videos oder Verzeichnissen. |
| Video ✅ | 'video.mp4' | str oder Path | Videodatei in Formaten wie MP4, AVI usw. |
| Verzeichnis ✅ | 'path/' | str oder Path | Pfad zu einem Verzeichnis mit Bildern oder Videos. |
| Glob-Muster ✅ | 'path/*.jpg' | str | Glob-Muster zum Abgleichen mehrerer Dateien. Verwende das Zeichen * als Platzhalter. |
| YouTube ✅ | 'https://youtu.be/LNwODJXcvt4' | str | URL zu einem YouTube-Video. |
| Stream ✅ | 'rtsp://example.com/media.mp4' | str | URL für Streamingprotokolle wie RTSP, RTMP oder TCP oder eine IP-Adresse. |
| Mehrere Streams ✅ | 'list.streams' | str oder Path | *.streams-Textdatei mit einer Stream-URL pro Zeile. Bei 8 Streams wird beispielsweise die Stapelgröße 8 verwendet. |
| Webcam ✅ | 0 | int | Index des angeschlossenen Kamerageräts, für das die Inferenz ausgeführt werden soll. |
Nachfolgend findest du Codebeispiele zur Verwendung der einzelnen Quelltypen:
Inferenz auf einer Bilddatei ausführen.
from ultralytics import YOLO
# Ein vortrainiertes YOLO26n-Modell laden
model = YOLO("yolo26n.pt")
# Pfad zur Bilddatei festlegen
source = "path/to/image.jpg"
# Inferenz auf der Quelle ausführen
results = model(source) # Liste mit Results-ObjektenInferenzargumente#
model.predict() akzeptiert mehrere Argumente, die bei der Inferenz übergeben werden können, um Standardwerte zu überschreiben:
Feste Form im Vergleich zu kleinstmöglichem Rechteck (rect)#
Standardmäßig verwendet predict rect=True, wodurch nach Möglichkeit eine Auffüllung auf das kleinstmögliche Rechteck aktiviert wird. Das Bild wird so skaliert, dass es in imgsz passt, und nur bis zum nächsten Vielfachen des Strides aufgefüllt. Daher kann der endgültige Tensor kleiner als imgsz sein. Die Auffüllung auf das kleinstmögliche Rechteck wird nur verwendet, wenn alle Bilder im Batch dieselbe Form haben und das Backend dies unterstützt (PyTorch .pt oder ein Export mit dynamischer Form, etwa dynamisches ONNX). Andernfalls werden die Bilder auf die volle Zielgröße imgsz aufgefüllt.
Verwende rect=False, um immer auf die volle Zielgröße imgsz aufzufüllen. Dies wird empfohlen, wenn du eine feste Eingabegröße benötigst, die zu exportierten Modellen (ONNX, TensorRT usw.) passt.
Ganzzahl im Vergleich zu Tupel imgsz
- Eine Ganzzahl
imgsz=640ergibt nach der Rundung auf ein Stride-Vielfaches eine quadratische Zielgröße(640, 640). - Ein Tupel
imgsz=(384, 672)legt eine rechteckige Zielgröße fest. Beirect=Truekann der tatsächliche Tensor kleiner als diese Zielgröße sein.
Training im Vergleich zu predict/export
Beim Training wird nur eine einzelne Ganzzahl imgsz akzeptiert (eine Liste [h, w] wird auf den größten Wert reduziert). predict und export akzeptieren entweder eine Ganzzahl oder ein Tupel (height, width).
from ultralytics import YOLO
# Ein vortrainiertes YOLO26n-Modell laden
model = YOLO("yolo26n.pt")
# Inferenz auf „bus.jpg“ mit Argumenten ausführen
model.predict("https://ultralytics.com/images/bus.jpg", save=True, imgsz=320, conf=0.25)Inferenzargumente:
| Argument | Typ | Standard | Beschreibung |
|---|---|---|---|
source | str oder int oder None | None | Gibt die Datenquelle für die Inferenz an. Möglich sind ein Bildpfad, eine Videodatei, ein Verzeichnis, eine URL oder eine Geräte-ID für Live-Feeds. Wenn keine Quelle angegeben ist, wird eine Warnung protokolliert und das Modell greift auf die integrierten Demodateien zurück (ultralytics/assets oder bei OBB eine Demo-URL). Unterstützt eine Vielzahl von Formaten und Quellen und ermöglicht so den flexiblen Einsatz mit verschiedenen Eingabetypen. |
conf | float | 0.25 | Legt den minimalen Konfidenzschwellwert für Erkennungen fest. Objekte, deren Erkennung unter diesem Schwellwert liegt, werden verworfen. Durch Anpassen dieses Werts lassen sich falsch positive Ergebnisse reduzieren. |
iou | float | 0.7 | Schwellwert für Intersection over Union (IoU) bei Non-Maximum-Suppression (NMS). Niedrigere Werte führen zu weniger Erkennungen, da überlappende Boxen entfernt werden. Das ist nützlich, um Duplikate zu reduzieren. |
imgsz | int oder tuple | 640 | Zielgröße für Letterboxing. Eine Ganzzahl ergibt ein quadratisches N×N; ein Tupel ergibt (height, width). Bei rect=True kann der tatsächliche Tensor aufgrund der Auffüllung auf das minimale Rechteck kleiner als dieses Ziel sein. Verwende rect=False für eine feste Größe. Siehe Feste Form oder minimales Rechteck. |
rect | bool | True | Wenn True, wird, sofern möglich (bei Batches mit gleicher Form und unterstütztem Backend), auf das minimale Rechteck aufgefüllt. Wenn False, wird immer auf die volle Größe imgsz aufgefüllt. Siehe Feste Form oder minimales Rechteck. |
quantize | int oder str | None | Inferenzpräzision: 16/"fp16" und 32/"fp32"/unset wählen FP16- oder FP32-Berechnungen für PyTorch- und TorchScript-Modelle aus (FP32 auf der CPU); andere Formate verwenden die Präzision, die ihr Artefakt und ihre Laufzeitumgebung vorgeben. Bei 16 rundet OpenVINO die Eingabe auf dem Client weiterhin auf FP16 und erweitert sie anschließend wieder auf FP32, ohne die Präzision der Laufzeitumgebung zu ändern. Die INT8/PTQ-Quantisierung wird beim Export konfiguriert und anschließend durch Laden des exportierten Modells verwendet. Ersetzt das veraltete Flag half. |
device | str | None | Gibt das Gerät für die Inferenz an (z. B. cpu, cuda:0, 0, npu oder npu:0). Ermöglicht die Auswahl zwischen CPU, einer bestimmten GPU, einer Huawei-Ascend-NPU oder anderen Rechengeräten für die Modellausführung. |
dnn | bool | False | Wenn True verwendet wird, nutzt die Inferenz von ONNX-Modellen das DNN-Modul von OpenCV statt ONNX Runtime. |
data | str | None | Pfad zu einer Dataset-YAML-Datei (z. B. coco8.yaml), die nur für ihre names gelesen wird und nur dann, wenn das geladene Modell keine eigenen Klassennamen enthält: bei einem Export eines Drittanbieters oder bei einem Ultralytics-Export, der von den mitgelieferten Metadaten getrennt wurde. Andernfalls meldet ein solches Modell class0, class1 und so weiter. |
batch | int | 1 | Legt die Batchgröße für die Inferenz fest (funktioniert nur, wenn die Quelle ein Verzeichnis, eine Videodatei oder eine .txt-Datei ist). Eine größere Batchgröße kann den Durchsatz erhöhen und so die insgesamt benötigte Inferenzzeit verkürzen. |
max_det | int | 300 | Maximale Anzahl der pro Bild zulässigen Erkennungen. Begrenzt die Gesamtzahl der Objekte, die das Modell bei einer einzelnen Inferenz erkennen kann, und verhindert übermäßig viele Ausgaben in dicht besetzten Szenen. |
vid_stride | int | 1 | Bildabstand für Videoeingaben. Überspringt bei Videos Bilder, um die Verarbeitung zu beschleunigen, verringert dabei jedoch die zeitliche Auflösung. Der Wert 1 verarbeitet jedes Bild; höhere Werte überspringen Bilder. |
stream_buffer | bool | False | Legt fest, ob eingehende Bilder für Videostreams in eine Warteschlange gestellt werden. Bei False werden alte Bilder verworfen, um Platz für neue zu schaffen (optimiert für Echtzeitanwendungen). Bei True werden neue Bilder in einem Puffer zwischengespeichert, damit keine Bilder übersprungen werden; liegt die Inferenz-FPS jedoch unter der Stream-FPS, entsteht dadurch eine Verzögerung. |
visualize | bool | False | Speichert neben jeder Vorhersage eine Aktivierungskarte, die zeigt, welche Pixel die vorhergesagten Klassenwerte erhöht haben. Berücksichtigt conf und classes, sodass classes=[0] nur diese Klasse abbildet. Nur für Ultralytics-PyTorch-Modelle verfügbar. |
augment | bool | False | Aktiviert Testzeit-Augmentierung (TTA) für Vorhersagen. Dadurch kann sich die Robustheit der Erkennung verbessern, allerdings auf Kosten der Inferenzgeschwindigkeit. Nur für Ultralytics-PyTorch-Modelle verfügbar. |
agnostic_nms | bool | False | Aktiviert klassenunabhängige Nichtmaximalwertunterdrückung (NMS), bei der sich überlappende Boxen mit niedrigeren Konfidenzwerten klassenübergreifend unterdrückt werden, nicht nur innerhalb derselben Klasse. Nützlich bei Mehrklassenerkennungen, bei denen sich Klassen häufig überschneiden. Bei der NMS-freien Inferenz (nms=False mit YOLO26 oder YOLOv10) verhindert dies lediglich, dass dieselbe Erkennung mit mehreren Klassenbezeichnungen erscheint (Duplikate mit IoU=1.0), und unterdrückt keine unterschiedlichen Boxen anhand eines IoU-Schwellenwerts. |
classes | list[int] | None | Filtert Vorhersagen nach einer Auswahl von Klassen-IDs. Zurückgegeben werden nur Erkennungen, die zu den angegebenen Klassen gehören. Nützlich, um sich bei Mehrklassenerkennungsaufgaben auf relevante Objekte zu konzentrieren. |
retina_masks | bool | False | Gibt hochauflösende Segmentierungsmasken zurück. Wenn diese Option aktiviert ist, entsprechen die zurückgegebenen Masken (masks.data) der Originalbildgröße. Andernfalls haben sie die bei der Inferenz verwendete Bildgröße. |
embed | list[int] | None | Legt fest, aus welchen Schichten Feature-Vektoren oder Einbettungen extrahiert werden. Verwende model.embed(source) für Einbettungen aus der vorletzten Schicht oder model.predict(source, embed=[layer]), um bestimmte Schichten auszuwählen. Nützlich für nachgelagerte Aufgaben wie Clustering oder Ähnlichkeitssuche. Nur für Ultralytics-PyTorch-Modelle verfügbar. |
project | str | None | Name des Projektverzeichnisses, in dem die Vorhersageausgaben gespeichert werden, wenn save aktiviert ist. |
name | str | None | Name des Vorhersagelaufs. Dient zum Erstellen eines Unterverzeichnisses im Projektordner, in dem die Vorhersageausgaben gespeichert werden, wenn save aktiviert ist. |
stream | bool | False | Ermöglicht eine speichereffiziente Verarbeitung langer Videos oder vieler Bilder, indem ein Generator von Results-Objekten zurückgegeben wird, statt alle Bilder gleichzeitig in den Arbeitsspeicher zu laden. |
verbose | bool | True | Legt fest, ob ausführliche Inferenzprotokolle im Terminal angezeigt werden, die den Vorhersageprozess in Echtzeit sichtbar machen. |
compile | bool oder str | False | Aktiviert die PyTorch-2.x-Graphkompilierung torch.compile mit backend='inductor'. Akzeptiert True → "default", False → deaktiviert oder einen Zeichenfolgenmodus wie "default", "reduce-overhead", "max-autotune-no-cudagraphs". Bei Nichtunterstützung wird mit einer Warnung auf den Eager-Modus zurückgegriffen. |
channels_last | bool | None | Verwendet für die native PyTorch-Inferenz das Speicherformat channels_last (NHWC). None aktiviert es automatisch auf oneDNN-fähigen Linux- und Windows-x86-CPUs mit PyTorch 1.13 oder neuer, False deaktiviert es und True fordert es auf unterstützten x86-CPUs oder CUDA-Geräten an. ARM64, MPS, ältere PyTorch-Versionen, CPUs ohne oneDNN und exportierte Formate wie TensorRT und ONNX bleiben unverändert. |
nms | bool, optional | None | Führt standardmäßig eine Viele-zu-eins-Inferenz mit NMS aus (None oder True). Setze False, um den NMS-freien Eins-zu-eins-Kopf zu verwenden, sofern verfügbar. Weitere Informationen findest du in der Anleitung zur End-to-End-Erkennung. |
Argumente für die Visualisierung:
| Argument | Typ | Standard | Beschreibung |
|---|---|---|---|
show | bool | False | Wenn True aktiviert ist, werden die annotierten Bilder oder Videos in einem Fenster angezeigt. Nützlich für unmittelbares visuelles Feedback während der Entwicklung oder beim Testen. |
save | bool | False or True | Aktiviert das Speichern annotierter Bilder oder Videos in Dateien. Nützlich für Dokumentation, weiterführende Analysen oder zum Teilen der Ergebnisse. Bei Verwendung der CLI standardmäßig True, bei Verwendung in Python False. |
save_frames | bool | False | Speichert bei der Verarbeitung von Videos einzelne Bilder als Dateien. Nützlich, um bestimmte Bilder zu extrahieren oder einzelne Bilder detailliert zu analysieren. |
save_txt | bool | False | Speichert Erkennungsergebnisse in einer Textdatei im Format [class] [x_center] [y_center] [width] [height] [confidence]. Nützlich für die Einbindung in andere Analysewerkzeuge. |
save_conf | bool | False | Fügt den gespeicherten Textdateien Konfidenzwerte hinzu. Dadurch stehen mehr Details für die Nachbearbeitung und Analyse zur Verfügung. |
save_crop | bool | False | Speichert zugeschnittene Bilder der erkannten Objekte. Nützlich für die Datensatzerweiterung, Analysen oder zum Erstellen gezielter Datensätze für bestimmte Objekte. |
show_labels | bool | True | Zeigt für jede Erkennung eine Bezeichnung in der visuellen Ausgabe an. So lassen sich erkannte Objekte sofort erkennen. |
show_conf | bool | True | Zeigt neben der Bezeichnung den Konfidenzwert jeder Erkennung an. Gibt Aufschluss darüber, wie sicher sich das Modell bei der jeweiligen Erkennung ist. |
show_boxes | bool | True | Zeichnet Begrenzungsrahmen um erkannte Objekte. Unverzichtbar, um Objekte in Bildern oder Videobildern visuell zu identifizieren und zu lokalisieren. |
line_width | int or None | None | Legt die Linienstärke der Begrenzungsrahmen fest. Bei None wird die Linienstärke automatisch an die Bildgröße angepasst. Ermöglicht eine übersichtliche visuelle Anpassung. |
Bild- und Videoformate#
YOLO26 unterstützt verschiedene Bild- und Videoformate, wie in ultralytics/data/utils.py angegeben. In den folgenden Tabellen findest du die gültigen Dateiendungen und Beispiele für predict-Befehle.
Bilder#
Die folgende Tabelle enthält gültige Ultralytics-Bildformate.
Für HEIC-/HEIF-Formate wird pi-heif benötigt, das bei der ersten Verwendung automatisch installiert wird. AVIF wird nativ von Pillow unterstützt.
| Bilddateiendungen | Beispiel für einen predict-Befehl | Referenz |
|---|---|---|
.avif | yolo predict source=image.avif | AV1-Bilddateiformat |
.bmp | yolo predict source=image.bmp | Microsoft-BMP-Dateiformat |
.dng | yolo predict source=image.dng | Adobe DNG |
.heic | yolo predict source=image.heic | Hocheffizientes Bildformat |
.heif | yolo predict source=image.heif | Hocheffizientes Bildformat |
.jp2 | yolo predict source=image.jp2 | JPEG 2000 |
.jpeg | yolo predict source=image.jpeg | JPEG |
.jpg | yolo predict source=image.jpg | JPEG |
.mpo | yolo predict source=image.mpo | Mehrbildobjekt |
.png | yolo predict source=image.png | Portable Network Graphics |
.tif | yolo predict source=image.tif | Tag-Image-Dateiformat |
.tiff | yolo predict source=image.tiff | Tag-Image-Dateiformat |
.webp | yolo predict source=image.webp | WebP |
Videos#
Die folgende Tabelle enthält gültige Ultralytics-Videoformate.
| Videodateiendungen | Beispiel für einen predict-Befehl | Referenz |
|---|---|---|
.asf | yolo predict source=video.asf | Advanced Systems Format |
.avi | yolo predict source=video.avi | Audio-Video-Interleave |
.gif | yolo predict source=video.gif | Graphics Interchange Format |
.m4v | yolo predict source=video.m4v | MPEG-4 Teil 14 |
.mkv | yolo predict source=video.mkv | Matroska |
.mov | yolo predict source=video.mov | QuickTime-Dateiformat |
.mp4 | yolo predict source=video.mp4 | MPEG-4 Teil 14 – Wikipedia |
.mpeg | yolo predict source=video.mpeg | MPEG-1 Teil 2 |
.mpg | yolo predict source=video.mpg | MPEG-1 Teil 2 |
.ts | yolo predict source=video.ts | MPEG-Transportstream |
.wmv | yolo predict source=video.wmv | Windows Media Video |
.webm | yolo predict source=video.webm | WebM-Projekt |
Mit Results arbeiten#
Alle Aufrufe von Ultralytics predict() geben eine Liste von Results-Objekten zurück:
from ultralytics import YOLO
# Ein vortrainiertes YOLO26n-Modell laden
model = YOLO("yolo26n.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/bus.jpg")
results = model(
[
"https://ultralytics.com/images/bus.jpg",
"https://ultralytics.com/images/zidane.jpg",
]
) # gebündelte InferenzResults-Objekte haben die folgenden Attribute:
| Attribut | Typ | Beschreibung |
|---|---|---|
orig_img | np.ndarray | Das ursprüngliche Bild als NumPy-Array. |
orig_shape | tuple | Die Form des ursprünglichen Bildes im Format (Höhe, Breite). |
boxes | Boxes, optional | Ein Boxes-Objekt mit den Begrenzungsrahmen der erkannten Objekte. |
masks | Masks, optional | Ein Masks-Objekt mit den Masken der erkannten Objekte. |
probs | Probs, optional | Ein Probs-Objekt mit den Wahrscheinlichkeiten der einzelnen Klassen für die Klassifizierungsaufgabe. |
keypoints | Keypoints, optional | Ein Keypoints-Objekt mit den erkannten Schlüsselpunkten jedes Objekts. |
obb | OBB, optional | Ein OBB-Objekt mit orientierten Begrenzungsrahmen. |
semantic_mask | SemanticMask, optional | Ein SemanticMask-Objekt mit einer dichten Klassenkarte für jedes Pixel. |
depth | DepthMap, optional | Ein DepthMap-Objekt mit einer dichten Tiefenkarte für jedes Pixel. |
speed | dict | Ein Wörterbuch mit den Geschwindigkeiten für Vorverarbeitung, Inferenz und Nachverarbeitung in Millisekunden pro Bild. |
names | dict | Ein Wörterbuch, das Klassenindizes den Klassennamen zuordnet. |
path | str | Der Pfad zur Bilddatei. |
save_dir | str, optional | Verzeichnis zum Speichern der Ergebnisse. |
Ergebnisse nach Aufgabe#
Welche der folgenden Felder befüllt werden, hängt von der Aufgabe deines Modells ab — vergleiche Objekterkennung, Segmentierung, semantische Segmentierung, Tiefenschätzung, Klassifizierung, Posenschätzung und OBB, falls du noch keine Aufgabe ausgewählt hast. Für jedes Bild oder jeden Frame gibt jede Vorhersage ein Results-Objekt zurück. Die oben genannten gemeinsamen Felder sind immer verfügbar, während die aufgabenspezifischen Vorhersagedaten in den unten aufgeführten Feldern gespeichert werden. YOLO-Koordinaten- und Konfidenztensoren sind torch.float32; Wahrscheinlichkeitstensoren sind torch.float32, sofern keine FP16-Inferenz (quantize=16) verwendet wird. In diesem Fall sind sie torch.float16. Nach result.numpy() werden Tensoren zu NumPy-Arrays mit den entsprechenden NumPy-Datentypen. Instanzmasken sind binäre torch.uint8-Tensoren, während semantische Masken den kleinstmöglichen geeigneten Ganzzahl-Datentyp für Klassen-IDs verwenden: torch.uint8, torch.int16 oder torch.int32, je nach Anzahl der Klassen.
| Attribut | Typ | Form | Beschreibung |
|---|---|---|---|
result.boxes | Boxes | (N) | Erkennungsrahmen. |
result.boxes.data | torch.float32 | (N,6/7) | Rohe [x1,y1,x2,y2,conf,cls] sowie optionale Tracking-ID. |
result.boxes.xyxy | torch.float32 | (N,4) | Pixelrahmen xyxy. |
result.boxes.conf | torch.float32 | (N,) | Konfidenzwerte. |
result.boxes.cls | torch.float32 | (N,) | Klassen-IDs; wandle sie für die Namen in int um. |
Objekte vom Typ Results verfügen über folgende Methoden:
| Methode | Rückgabetyp | Beschreibung |
|---|---|---|
update() | None | Aktualisiert das Results-Objekt mit neuen Daten wie Boxen, Masken, Wahrscheinlichkeiten, OBB, Schlüsselpunkten, semantischen Masken oder Tiefeninformationen. |
cpu() | Results | Gibt eine Kopie des Results-Objekts zurück, bei der sich alle Tensoren im CPU-Speicher befinden. |
numpy() | Results | Gibt eine Kopie des Results-Objekts zurück, bei der alle Tensoren in NumPy-Arrays umgewandelt wurden. |
cuda() | Results | Gibt eine Kopie des Results-Objekts zurück, bei der sich alle Tensoren im GPU-Speicher befinden. |
to() | Results | Gibt eine Kopie des Results-Objekts zurück, bei der die Tensoren auf das angegebene Gerät verschoben und in den angegebenen Datentyp umgewandelt wurden. |
new() | Results | Erstellt ein neues Results-Objekt mit denselben Attributen für Bild, Pfad, Namen und Geschwindigkeit. |
plot() | np.ndarray | Zeichnet Erkennungsergebnisse auf ein BGR-Eingabebild und gibt das annotierte Bild zurück. |
show() | None | Zeigt das Bild mit annotierten Inferenz-Ergebnissen an. |
save() | str | Speichert ein Bild mit annotierten Inferenz-Ergebnissen in einer Datei und gibt den Dateinamen zurück. |
verbose() | str | Gibt für jede Aufgabe eine Protokollzeichenfolge mit Einzelheiten zu den Erkennungs- und Klassifikationsergebnissen zurück. |
save_txt() | str | Speichert Erkennungsergebnisse in einer Textdatei und gibt den Pfad zur gespeicherten Datei zurück. |
save_crop() | None | Speichert zugeschnittene Erkennungsbilder im angegebenen Verzeichnis. |
summary() | List[Dict[str, Any]] | Wandelt Inferenz-Ergebnisse mit optionaler Normalisierung in ein zusammengefasstes Wörterbuch um. |
to_df() | DataFrame | Wandelt Erkennungsergebnisse in einen Polars DataFrame um. |
to_csv() | str | Wandelt Erkennungsergebnisse in das CSV-Format um. |
to_json() | str | Wandelt Erkennungsergebnisse in das JSON-Format um. |
Weitere Informationen findest du in der Dokumentation zur Klasse Results.
Boxen#
Das Objekt Boxes kann verwendet werden, um Begrenzungsboxen zu indizieren, zu bearbeiten und in verschiedene Formate umzuwandeln.
from ultralytics import YOLO
# Ein vortrainiertes YOLO26n-Modell laden
model = YOLO("yolo26n.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/bus.jpg") # Ergebnisliste
# Ergebnisse anzeigen
for r in results:
print(r.boxes) # Gib das Boxes-Objekt mit den erkannten Begrenzungsboxen ausHier findest du eine Tabelle mit den Methoden und Eigenschaften der Klasse Boxes, einschließlich Name, Typ und Beschreibung:
| Name | Typ | Beschreibung |
|---|---|---|
cpu() | Methode | Verschiebt das Objekt in den CPU-Speicher. |
numpy() | Methode | Wandelt das Objekt in ein NumPy-Array um. |
cuda() | Methode | Verschiebt das Objekt in den CUDA-Speicher. |
to() | Methode | Verschiebt das Objekt auf das angegebene Gerät. |
xyxy | Eigenschaft (torch.Tensor) | Gibt die Boxen im xyxy-Format zurück. |
conf | Eigenschaft (torch.Tensor) | Gibt die Konfidenzwerte der Boxen zurück. |
cls | Eigenschaft (torch.Tensor) | Gibt die Klassenwerte der Boxen zurück. |
id | Eigenschaft (torch.Tensor) | Gibt die Track-IDs der Boxen zurück (falls verfügbar). |
xywh | Eigenschaft (torch.Tensor) | Gibt die Boxen im xywh-Format zurück. |
xyxyn | Eigenschaft (torch.Tensor) | Gibt die Boxen im xyxy-Format zurück, normalisiert anhand der Originalbildgröße. |
xywhn | Eigenschaft (torch.Tensor) | Gibt die Boxen im xywh-Format zurück, normalisiert anhand der Originalbildgröße. |
Weitere Informationen findest du in der Dokumentation zur Klasse Boxes.
Masken#
Das Objekt Masks kann verwendet werden, um Masken zu indizieren, zu bearbeiten und in Segmente umzuwandeln.
from ultralytics import YOLO
# Lade ein vortrainiertes YOLO26n-seg-Segmentierungsmodell
model = YOLO("yolo26n-seg.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/bus.jpg") # Ergebnisliste
# Ergebnisse anzeigen
for r in results:
print(r.masks) # Gib das Masks-Objekt mit den erkannten Instanzmasken ausHier findest du eine Tabelle mit den Methoden und Eigenschaften der Klasse Masks, einschließlich Name, Typ und Beschreibung:
| Name | Typ | Beschreibung |
|---|---|---|
data | Eigenschaft (torch.Tensor) | Binärer Maskentensor torch.uint8 mit der Form (N,H,W) und den Werten 0 oder 1. |
cpu() | Methode | Gibt den Maskentensor im CPU-Speicher zurück. |
numpy() | Methode | Gibt den Maskentensor als NumPy-Array zurück. |
cuda() | Methode | Gibt den Maskentensor im GPU-Speicher zurück. |
to() | Methode | Gibt den Maskentensor mit dem angegebenen Gerät und Datentyp zurück. |
xyn | Eigenschaft (list[np.ndarray]) | Eine Liste normalisierter Maskenpolygone. |
xy | Eigenschaft (list[np.ndarray]) | Eine Liste von Maskenpolygonen in Pixelkoordinaten. |
Weitere Informationen findest du in der Dokumentation zur Klasse Masks.
SemanticMask#
SemanticMask speichert eine dichte Klassenkarte für die Ergebnisse der semantischen Segmentierung. Anders als Masks enthält es keine binäre Maske pro Objekt und bietet keine Hilfsfunktionen für Polygone.
from ultralytics import YOLO
# Lade ein vortrainiertes YOLO26n-sem-Semantikmodell
model = YOLO("yolo26n-sem.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/bus.jpg") # Ergebnisliste
# Ergebnisse anzeigen
for r in results:
print(r.semantic_mask.data) # Gib die Klassen-ID-Karte mit den Dimensionen H × W aus| Name | Typ | Beschreibung |
|---|---|---|
data | Eigenschaft (torch.Tensor) | Klassen-ID-Karte mit der Form (H,W). Der Datentyp ist torch.uint8, torch.int16 oder torch.int32, abhängig von der Anzahl der Klassen. |
shape | Eigenschaft (tuple) | Form der Klassenkarte, die normalerweise result.orig_shape entspricht. |
cpu() | Methode | Gibt den Tensor der semantischen Maske im CPU-Speicher zurück. |
numpy() | Methode | Gibt den Tensor der semantischen Maske als NumPy-Array zurück. |
cuda() | Methode | Gibt den Tensor der semantischen Maske im GPU-Speicher zurück. |
to() | Methode | Gibt den Tensor der semantischen Maske mit dem angegebenen Gerät und Datentyp zurück. |
Schlüsselpunkte#
Das Objekt Keypoints kann verwendet werden, um Koordinaten zu indizieren, zu bearbeiten und zu normalisieren.
from ultralytics import YOLO
# Lade ein vortrainiertes YOLO26n-pose-Posemodell
model = YOLO("yolo26n-pose.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/bus.jpg") # Ergebnisliste
# Ergebnisse anzeigen
for r in results:
print(r.keypoints) # Gib das Keypoints-Objekt mit den erkannten Schlüsselpunkten ausHier findest du eine Tabelle mit den Methoden und Eigenschaften der Klasse Keypoints, einschließlich Name, Typ und Beschreibung:
| Name | Typ | Beschreibung |
|---|---|---|
cpu() | Methode | Gibt den Schlüsselpunkttensor im CPU-Speicher zurück. |
numpy() | Methode | Gibt den Schlüsselpunkttensor als NumPy-Array zurück. |
cuda() | Methode | Gibt den Schlüsselpunkttensor im GPU-Speicher zurück. |
to() | Methode | Gibt den Schlüsselpunkttensor mit dem angegebenen Gerät und Datentyp zurück. |
xyn | Eigenschaft (torch.Tensor) | Normalisierte Koordinaten der Schlüsselpunkte mit der Form (N,K,2). |
xy | Eigenschaft (torch.Tensor) | Koordinaten der Schlüsselpunkte in Pixeln mit der Form (N,K,2). |
conf | Eigenschaft (torch.Tensor) | Gibt die Konfidenzwerte der Schlüsselpunkte zurück, falls verfügbar; andernfalls None. |
Weitere Informationen findest du in der Dokumentation zur Klasse Keypoints.
Wahrscheinlichkeiten#
Das Objekt Probs kann verwendet werden, um Klassifikationsindizes und -werte top1 und top5 abzurufen.
from ultralytics import YOLO
# Lade ein vortrainiertes YOLO26n-cls-Klassifikationsmodell
model = YOLO("yolo26n-cls.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/bus.jpg") # Ergebnisliste
# Ergebnisse anzeigen
for r in results:
print(r.probs) # Gib das Probs-Objekt mit den erkannten Klassenwahrscheinlichkeiten ausHier findest du eine Tabelle mit einer Zusammenfassung der Methoden und Eigenschaften der Klasse Probs:
| Name | Typ | Beschreibung |
|---|---|---|
cpu() | Methode | Gibt eine Kopie des probs-Tensors im CPU-Speicher zurück. |
numpy() | Methode | Gibt eine Kopie des probs-Tensors als NumPy-Array zurück. |
cuda() | Methode | Gibt eine Kopie des probs-Tensors im GPU-Speicher zurück. |
to() | Methode | Gibt eine Kopie des probs-Tensors mit dem angegebenen Gerät und Datentyp zurück. |
top1 | Eigenschaft (int) | Index der obersten Klasse. |
top5 | Eigenschaft (list[int]) | Indizes der fünf obersten Klassen. |
top1conf | Eigenschaft (torch.Tensor) | Konfidenz der obersten Klasse. |
top5conf | Eigenschaft (torch.Tensor) | Konfidenzen der fünf obersten Klassen. |
Weitere Informationen findest du in der Dokumentation zur Klasse Probs.
OBB#
Das Objekt OBB kann verwendet werden, um orientierte Begrenzungsrahmen zu indizieren, zu bearbeiten und in verschiedene Formate umzuwandeln.
from ultralytics import YOLO
# Ein vortrainiertes YOLO26n-Modell laden
model = YOLO("yolo26n-obb.pt")
# Eine Inferenz auf einem Bild ausführen
results = model("https://ultralytics.com/images/boats.jpg") # Ergebnisliste
# Ergebnisse anzeigen
for r in results:
print(r.obb) # Gibt das OBB-Objekt mit den orientierten Erkennungsbegrenzungsrahmen ausHier findest du eine Tabelle mit den Methoden und Eigenschaften der Klasse OBB, einschließlich Name, Typ und Beschreibung:
| Name | Typ | Beschreibung |
|---|---|---|
cpu() | Methode | Verschiebt das Objekt in den CPU-Speicher. |
numpy() | Methode | Wandelt das Objekt in ein NumPy-Array um. |
cuda() | Methode | Verschiebt das Objekt in den CUDA-Speicher. |
to() | Methode | Verschiebt das Objekt auf das angegebene Gerät. |
conf | Eigenschaft (torch.Tensor) | Gibt die Konfidenzwerte der Boxen zurück. |
cls | Eigenschaft (torch.Tensor) | Gibt die Klassenwerte der Boxen zurück. |
id | Eigenschaft (torch.Tensor) | Gibt die Track-IDs der Boxen zurück (falls verfügbar). |
xyxy | Eigenschaft (torch.Tensor) | Gibt die horizontalen Begrenzungsrahmen im xyxy-Format zurück. |
xywhr | Eigenschaft (torch.Tensor) | Gibt die gedrehten Begrenzungsrahmen im xywhr-Format zurück. |
xyxyxyxy | Eigenschaft (torch.Tensor) | Gibt die gedrehten Begrenzungsrahmen im xyxyxyxy-Format zurück. |
xyxyxyxyn | Eigenschaft (torch.Tensor) | Gibt die gedrehten Begrenzungsrahmen im xyxyxyxy-Format zurück, normalisiert anhand der Bildgröße. |
Weitere Informationen findest du in der Dokumentation zur Klasse OBB.
Ergebnisse visualisieren#
Die Methode plot() in Objekten vom Typ Results erleichtert die Visualisierung von Vorhersagen, indem erkannte Objekte (z. B. Begrenzungsrahmen, Masken, Schlüsselpunkte und Wahrscheinlichkeiten) über das Originalbild gelegt werden. Diese Methode gibt das annotierte Bild als NumPy-Array zurück, das sich einfach anzeigen oder speichern lässt.
from PIL import Image
from ultralytics import YOLO
# Load a pretrained YOLO26n model
model = YOLO("yolo26n.pt")
# Run inference on 'bus.jpg'
results = model(["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]) # results list
# Visualize the results
for i, r in enumerate(results):
# Plot results image
im_bgr = r.plot() # BGR-order numpy array
im_rgb = Image.fromarray(im_bgr[..., ::-1]) # RGB-order PIL image
# Show results to screen (in supported environments)
r.show()
# Save results to disk
r.save(filename=f"results{i}.jpg")Parameter der Methode plot()#
Die Methode plot() unterstützt verschiedene Argumente, mit denen du die Ausgabe anpassen kannst:
| Argument | Typ | Beschreibung | Standard |
|---|---|---|---|
conf | bool | Erkennungs-Konfidenzwerte einblenden. | True |
line_width | float | Linienbreite der Begrenzungsrahmen. Wird an die Bildgröße angepasst, wenn None. | None |
font_size | float | Schriftgröße des Texts. Wird an die Bildgröße angepasst, wenn None. | None |
font | str | Schriftart für Textannotationen. | 'Arial.ttf' |
pil | bool | Bild als PIL-Image-Objekt zurückgeben. | False |
img | np.ndarray | torch.Tensor | Alternatives Bild. Tensoren müssen zusammenhängend und im HWC-BGR-uint8-Format vorliegen. | None |
kpt_radius | int | Radius der eingezeichneten Schlüsselpunkte. | 5 |
kpt_line | bool | Schlüsselpunkte mit Linien verbinden. | True |
labels | bool | Klassenbezeichnungen in den Annotationen einblenden. | True |
boxes | bool | Begrenzungsrahmen über das Bild legen. | True |
masks | bool | Masken über das Bild legen. | True |
probs | bool | Klassifizierungswahrscheinlichkeiten einblenden. | True |
show | bool | Das annotierte Bild direkt mit dem standardmäßigen Bildbetrachter anzeigen. | False |
save | bool | Das annotierte Bild in der durch filename angegebenen Datei speichern. | False |
filename | str | Pfad und Name der Datei, in der das annotierte Bild gespeichert wird, wenn save den Wert True hat. | None |
color_mode | str | Farbmodus angeben, z. B. „instance“ oder „class“. | 'class' |
txt_color | tuple[int, int, int] | BGR-Textfarbe für Klassifizierungsbezeichnungen. | (255, 255, 255) |
Threadsichere Inferenz#
Threadsicherheit während der Inferenz ist entscheidend, wenn du mehrere YOLO-Modelle parallel in verschiedenen Threads ausführst. Threadsichere Inferenz stellt sicher, dass die Vorhersagen jedes Threads isoliert bleiben und sich nicht gegenseitig beeinflussen. So werden Race Conditions vermieden und konsistente, zuverlässige Ausgaben gewährleistet.
Wenn du YOLO-Modelle in einer Multithread-Anwendung verwendest, solltest du für jeden Thread ein eigenes Modellobjekt instanziieren oder threadlokalen Speicher nutzen, um Konflikte zu vermeiden:
Instanziiere für threadsichere Inferenz ein einzelnes Modell in jedem Thread:
from threading import Thread
from ultralytics import YOLO
def thread_safe_predict(model, image_path):
"""Performs thread-safe prediction on an image using a locally instantiated YOLO model."""
model = YOLO(model)
results = model.predict(image_path)
# Ergebnisse verarbeiten
# Threads starten, die jeweils eine eigene Modellinstanz haben
Thread(target=thread_safe_predict, args=("yolo26n.pt", "image1.jpg")).start()
Thread(target=thread_safe_predict, args=("yolo26n.pt", "image2.jpg")).start()Eine ausführliche Erläuterung zur threadsicheren Inferenz mit YOLO-Modellen und schrittweise Anleitungen findest du in unserem Leitfaden zur threadsicheren YOLO-Inferenz. Dieser Leitfaden enthält alle nötigen Informationen, um häufige Fehler zu vermeiden und einen reibungslosen Ablauf deiner Multithread-Inferenz sicherzustellen.
Streaming-for-Schleife#
Hier findest du ein Python-Skript, das OpenCV (cv2) und YOLO verwendet, um Videobildern Inferenz auszuführen. Das Skript setzt voraus, dass du die erforderlichen Pakete (opencv-python und ultralytics) bereits installiert hast.
import cv2
from ultralytics import YOLO
# Das YOLO-Modell laden
model = YOLO("yolo26n.pt")
# Videodatei öffnen
video_path = "path/to/your/video/file.mp4"
cap = cv2.VideoCapture(video_path)
# Videobilder durchlaufen
while cap.isOpened():
# Ein Videobild einlesen
success, frame = cap.read()
if success:
# YOLO-Inferenz auf dem Bild ausführen
results = model(frame)
# Ergebnisse auf dem Bild visualisieren
annotated_frame = results[0].plot()
# Annotiertes Bild anzeigen
cv2.imshow("YOLO Inference", annotated_frame)
# Schleife beenden, wenn „q“ gedrückt wird
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# Schleife beenden, wenn das Video zu Ende ist
break
# Videoaufnahmeobjekt freigeben und Anzeigefenster schließen
cap.release()
cv2.destroyAllWindows()Dieses Skript führt für jedes Videobild Vorhersagen aus, visualisiert die Ergebnisse und zeigt sie in einem Fenster an. Durch Drücken von „q“ kannst du die Schleife beenden.
Wie geht es weiter?#
Möchtest du über ein vortrainiertes Modell hinausgehen? Prüfe, ob deine Aufgabe zu deinem Problem passt, formatiere deine Daten mithilfe des Leitfadens zu Datensätzen und trainiere anschließend damit.
Häufig gestellte Fragen#
Ultralytics YOLO ist ein hochmodernes Modell für Objekterkennung, Instanzsegmentierung, semantische Segmentierung, Tiefenschätzung, Klassifizierung, Posenschätzung und die Erkennung orientierter Begrenzungsrahmen (OBB) in Echtzeit. Im Vorhersagemodus können Nutzer mit hoher Geschwindigkeit Inferenz auf verschiedenen Datenquellen wie Bildern, Videos und Live-Streams ausführen. Der auf Leistung und Vielseitigkeit ausgelegte Modus bietet außerdem Stapelverarbeitung und Streaming. Weitere Einzelheiten zu den Funktionen findest du im Ultralytics-YOLO-Vorhersagemodus.
Ultralytics YOLO kann eine Vielzahl von Datenquellen verarbeiten, darunter einzelne Bilder, Videos, Verzeichnisse, URLs und Streams. Du kannst die Datenquelle im Aufruf
model.predict()angeben. Verwende zum Beispiel'image.jpg'für ein lokales Bild oder'https://ultralytics.com/images/bus.jpg'für eine URL. Ausführliche Beispiele für verschiedene Inferenzquellen findest du in der Dokumentation.Um die Inferenzgeschwindigkeit zu optimieren und den Speicher effizient zu verwalten, kannst du den Streaming-Modus verwenden, indem du
stream=Truein der Aufrufmethode des Prädiktors setzt. Im Streaming-Modus wird ein speichereffizienter Generator vonResults-Objekten erstellt, anstatt alle Bilder in den Arbeitsspeicher zu laden. Der Streaming-Modus eignet sich besonders für die Verarbeitung langer Videos oder großer Datensätze. Erfahre mehr über den Streaming-Modus.Die Methode
model.predict()in YOLO unterstützt verschiedene Argumente wieconf,iou,imgsz,deviceund weitere. Mit diesen Argumenten kannst du den Inferenzprozess anpassen und Parameter wie Konfidenzschwellenwerte, Bildgröße und das für die Berechnung verwendete Gerät festlegen. Ausführliche Beschreibungen dieser Argumente findest du im Abschnitt Inferenzargumente.Verwende
model.embed(source), um Merkmalseinbettungen aus der vorletzten Schicht zu extrahieren, oder übergibembed=[layer_index]anmodel.predict(), um bestimmte Schichten auszuwählen.from ultralytics import YOLO model = YOLO("yolo26n.pt") source = "https://ultralytics.com/images/bus.jpg" results = model.predict(source) # Ergebnisobjekte embeddings = model.embed(source) # Liste von torch.Tensor-EinbettungenNach der Inferenz mit YOLO enthalten die
Results-Objekte Methoden zum Anzeigen und Speichern annotierter Bilder. Mit Methoden wieresult.show()undresult.save(filename="result.jpg")kannst du die Ergebnisse visualisieren und speichern. Fehlende übergeordnete Verzeichnisse im Dateipfad werden automatisch erstellt (z. B.result.save("path/to/result.jpg")). Eine vollständige Liste dieser Methoden findest du im Abschnitt Arbeiten mit Ergebnissen.