YOLO-Inferenzergebnisse in einem VSCode-Terminal anzeigen#
Bild von der libsixel-Website.
Motivation#
Wenn du dich per SSH mit einem Remotecomputer verbindest, ist die normale Visualisierung von Bildergebnissen nicht möglich oder erfordert, dass du die Daten auf ein lokales Gerät mit grafischer Benutzeroberfläche überträgst. Das integrierte Terminal von VSCode kann Bilder direkt darstellen, sodass du Vorhersageergebnisse direkt dort prüfen kannst, wo du die Inferenz ausführst, ohne Dateien zurück auf deinen Laptop zu kopieren. Diese Anleitung zeigt dir, wie du die Einrichtung aktivierst, den Code einbindest und häufige Fragen beantwortet.
Nur mit Linux und macOS kompatibel. Informiere dich im VSCode-Repository, im Issue-Status oder in der Dokumentation über Aktualisierungen zur Windows-Unterstützung, um Bilder im Terminal mit sixel anzuzeigen.
Die mit VSCode kompatiblen Protokolle zum Anzeigen von Bildern über das integrierte Terminal sind sixel und iTerm. In dieser Anleitung wird die Verwendung des Protokolls sixel gezeigt.
Vorgehensweise#
-
Zuerst musst du in VSCode die Einstellungen
terminal.integrated.enableImagesundterminal.integrated.gpuAccelerationaktivieren."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Installiere die Bibliothek
python-sixelin deiner virtuellen Umgebung. Dabei handelt es sich um einen Fork der BibliothekPySixel, die nicht mehr gepflegt wird.pip install sixel -
Lade ein Modell und führe die Inferenz aus. Zeichne anschließend die Ergebnisse und speichere sie in einer Variablen. Weitere Informationen zu Inferenzargumenten und zur Arbeit mit Ergebnissen findest du auf der Seite zum Vorhersagemodus.
from ultralytics import YOLO # Load a model model = YOLO("yolo26n.pt") # Run inference on an image results = model.predict(source="ultralytics/assets/bus.jpg") # Plot inference results plot = results[0].plot() # (1)!- Unter Parametern der Plot-Methode findest du mögliche Argumente, die du verwenden kannst.
-
Verwende nun OpenCV, um
np.ndarrayinbytes-Daten umzuwandeln. Verwende anschließendio.BytesIO, um ein objektähnliches Dateiobjekt zu erstellen.import io import cv2 # Results image as bytes im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # Image bytes as a file-like object mem_file = io.BytesIO(im_bytes)- Du kannst auch andere Bildformate verwenden.
- Du benötigst nur das zurückgegebene Objekt am Index
1.
-
Erstelle eine Instanz von
SixelWriterund verwende anschließend die Methode.draw(), um das Bild im Terminal zu zeichnen.from sixel import SixelWriter # Create sixel writer object w = SixelWriter() # Draw the sixel image in the terminal w.draw(mem_file)
Beispiel für Inferenzergebnisse#
Die Verwendung dieses Beispiels mit Videos oder animierten GIF-Frames wurde nicht getestet. Die Verwendung erfolgt auf eigenes Risiko.
Vollständiges Codebeispiel#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n.pt")
# Run inference on an image
results = model.predict(source="ultralytics/assets/bus.jpg")
# Plot inference results
plot = results[0].plot() # (3)!
# Results image as bytes
im_bytes = cv2.imencode(
".png", # (1)!
plot,
)[1].tobytes() # (2)!
mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)- Du kannst auch andere Bildformate verwenden.
- Du benötigst nur das zurückgegebene Objekt am Index
1. - Unter Parametern der Plot-Methode findest du mögliche Argumente, die du verwenden kannst.
Möglicherweise musst du clear verwenden, um die Bildansicht im Terminal zu „löschen“.
FAQ#
Gehe folgendermaßen vor, um YOLO-Inferenzergebnisse in einem VSCode-Terminal unter macOS oder Linux anzuzeigen:
-
Aktiviere die erforderlichen VSCode-Einstellungen:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Installiere die sixel-Bibliothek:
pip install sixel -
Lade dein YOLO-Modell und führe die Inferenz aus:
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.predict(source="ultralytics/assets/bus.jpg") plot = results[0].plot() -
Wandle das Bild des Inferenzergebnisses in Bytes um und zeige es im Terminal an:
import io import cv2 from sixel import SixelWriter im_bytes = cv2.imencode(".png", plot)[1].tobytes() mem_file = io.BytesIO(im_bytes) SixelWriter().draw(mem_file)
Weitere Informationen findest du auf der Seite zum Vorhersagemodus.
-
Das sixel-Protokoll wird derzeit nur unter Linux und macOS unterstützt, da diese Plattformen native Terminalfunktionen bieten, die mit sixel-Grafiken kompatibel sind. Die Windows-Unterstützung für Terminalgrafiken mit sixel befindet sich noch in der Entwicklung. Informationen zur Windows-Kompatibilität findest du im VSCode-Issue-Status und in der Dokumentation.
Wenn nichts dargestellt wird, arbeite diese Prüfungen der Reihe nach durch:
- Vergewissere dich, dass sowohl
terminal.integrated.enableImagesals auchterminal.integrated.gpuAccelerationaktiviert sind, wie im Abschnitt Vorgehensweise beschrieben. Starte anschließend das integrierte Terminal neu, damit die Einstellungen wirksam werden. - Prüfe, ob
sixelin derselben virtuellen Umgebung installiert ist, in der dein Skript ausgeführt wird (pip install sixel). - Stelle sicher, dass
plotvor der Kodierung ein gültigesnp.ndarrayist, dacv2.imencodeeinen Fehler auslöst, wenn das Bild leer oder kein gültiges Array ist. Unter Parametern der Plot-Methode findest du die vonresults[0].plot()akzeptierten Werte.
Wenn die Probleme weiterhin bestehen, informiere dich im VSCode-Repository über den Status der Unterstützung für Bilder im Terminal.
- Vergewissere dich, dass sowohl
Die Anzeige von Videoinferenzergebnissen oder animierten GIF-Frames mit sixel im Terminal wurde bisher nicht getestet und wird möglicherweise nicht unterstützt. Wir empfehlen, mit statischen Bildern zu beginnen und die Kompatibilität zu überprüfen. Verwende Videobildergebnisse auf eigenes Risiko und beachte dabei die Leistungsgrenzen. Weitere Informationen zum Zeichnen von Inferenzergebnissen findest du auf der Seite zum Vorhersagemodus.
Das Paket
sixelist ein Fork der nicht mehr gepflegten BibliothekPySixelund ein schlanker Python-Wrapper für Pillow (PIL). Wennimport sixelfehlschlägt oderSixelWriter().draw()einen Fehler auslöst, prüfe, ob das Paket in deiner aktiven virtuellen Umgebung installiert ist, stelle sicher, dass Pillow verfügbar ist, und sieh im GitHub-Repository von python-sixel nach plattformspezifischen Hinweisen. Weitere Informationen zum Erzeugen des Bildes, das du andraw()übergibst, findest du in der Dokumentation zum Vorhersagemodus.