YOLO-Inferenz-Ergebnisse im VSCode-Terminal anzeigen#
Bild von der Website libsixel.
Motivation#
Wenn du dich per SSH mit einem entfernten Rechner verbindest, lassen sich Bildergebnisse normalerweise nicht anzeigen. Oft musst du dafür Daten auf ein lokales Gerät mit grafischer Benutzeroberfläche übertragen. Das integrierte Terminal von VSCode kann Bilder direkt darstellen. So kannst du Vorhersageergebnisse genau dort prüfen, wo du die Inferenz ausführst, ohne Dateien zurück auf deinen Laptop zu kopieren. Diese Anleitung zeigt dir, wie du die Einrichtung aktivierst und den Code einrichtest, und beantwortet häufige Fragen.
Nur mit Linux und macOS kompatibel. Informiere dich im VSCode-Repository, prüfe den Status des Issues oder sieh in der Dokumentation nach Updates zur Windows-Unterstützung für die Bildanzeige im Terminal mit sixel.
Die mit VSCode kompatiblen Protokolle zum Anzeigen von Bildern im integrierten Terminal sind sixel und iTerm. In dieser Anleitung zeigen wir dir die Verwendung des Protokolls sixel.
Vorgehensweise#
-
Aktiviere zunächst in VSCode die Einstellungen
terminal.integrated.enableImagesundterminal.integrated.gpuAcceleration."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Installiere die Bibliothek
python-sixelin deiner virtuellen Umgebung. Sie ist ein Fork der BibliothekPySixel, die nicht mehr gewartet wird.pip install sixel -
Lade ein Modell und führe die Inferenz aus. Erstelle anschließend eine Darstellung der Ergebnisse und speichere sie in einer Variablen. Weitere Informationen zu Inferenz-Argumenten und zur Arbeit mit Ergebnissen findest du auf der Seite zum Vorhersagemodus.
from ultralytics import YOLO # Ein Modell laden model = YOLO("yolo26n.pt") # Eine Inferenz auf einem Bild ausführen results = model.predict(source="https://ultralytics.com/images/bus.jpg") # Inferenz-Ergebnisse darstellen plot = results[0].plot() # (1)!- Unter Parameter der plot-Methode findest du mögliche Argumente.
-
Verwende nun OpenCV, um
np.ndarrayinbytes-Daten umzuwandeln. Erstelle anschließend mitio.BytesIOein dateiähnliches Objekt.import io import cv2 # Ergebnisbild als Bytes im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # Bild-Bytes als dateiähnliches Objekt mem_file = io.BytesIO(im_bytes)- Du kannst auch andere Bilddateiendungen verwenden.
- Benötigt wird nur das zurückgegebene Objekt am Index
1.
-
Erstelle eine Instanz von
SixelWriterund verwende anschließend die Methode.draw(), um das Bild im Terminal darzustellen.from sixel import SixelWriter # Sixel-Writer-Objekt erstellen w = SixelWriter() # Das Sixel-Bild im Terminal darstellen w.draw(mem_file)
Beispiele für Inferenz-Ergebnisse#
Dieses Beispiel wurde nicht mit Videos oder animierten GIF-Frames getestet. Die Verwendung erfolgt auf eigene Gefahr.
Vollständiges Codebeispiel#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt")
# Eine Inferenz auf einem Bild ausführen
results = model.predict(source="https://ultralytics.com/images/bus.jpg")
# Inferenz-Ergebnisse darstellen
plot = results[0].plot() # (3)!
# Ergebnisbild als 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 Bilddateiendungen verwenden.
- Benötigt wird nur das zurückgegebene Objekt am Index
1. - Unter Parameter der plot-Methode findest du mögliche Argumente.
Möglicherweise musst du clear verwenden, um die Bildansicht im Terminal zu „löschen“.
Häufig gestellte Fragen#
Gehe wie folgt vor, um YOLO-Inferenz-Ergebnisse 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="https://ultralytics.com/images/bus.jpg") plot = results[0].plot() -
Wandle das Bild aus dem Inferenz-Ergebnis 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 über native Terminalfunktionen verfügen, die mit Sixel-Grafiken kompatibel sind. Die Unterstützung von Terminalgrafiken mit Sixel unter Windows befindet sich noch in der Entwicklung. Aktuelle Informationen zur Windows-Kompatibilität findest du im VSCode-Issue-Status und in der Dokumentation.
Wenn nichts angezeigt wird, gehe 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 vor dem Kodieren sicher, dass
plotein gültigesnp.ndarrayist, denncv2.imencodegibt einen Fehler aus, wenn das Bild leer oder kein gültiges Array ist. Unter Parameter der plot-Methode findest du die Werte, dieresults[0].plot()akzeptiert.
Wenn das Problem weiterhin besteht, informiere dich im VSCode-Repository über den Status der Unterstützung für Terminalbilder.
- Vergewissere dich, dass sowohl
Die Anzeige von Inferenz-Ergebnissen aus Videos 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. Das Ausprobieren mit Video-Ergebnissen erfolgt auf eigene Gefahr; beachte dabei mögliche Leistungseinschränkungen. Weitere Informationen zum Darstellen von Inferenz-Ergebnissen findest du auf der Seite zum Vorhersagemodus.
Das Paket
sixelist ein Fork der nicht mehr gewarteten BibliothekPySixelund eine schlanke Python-Hülle für Pillow (PIL). Fallsimport sixelfehlschlägt oderSixelWriter().draw()einen Fehler ausgibt, prüfe, ob das Paket in deiner aktiven virtuellen Umgebung installiert ist, stelle sicher, dass Pillow verfügbar ist, und informiere dich im python-sixel-GitHub-Repository über plattformspezifische Hinweise. Wie du das Bild erzeugst, das du andraw()übergibst, erfährst du in der Dokumentation zum Vorhersagemodus.