So zeigst du YOLO-Inferenzergebnisse in einem VSCode-Terminal an#
Bild von der libsixel Website.
Motivation#
Wenn du dich über SSH mit einer Remotemaschine verbindest, ist die Visualisierung von Bildergebnissen normalerweise nicht möglich oder erfordert das Verschieben von Daten auf ein lokales Gerät mit einer Benutzeroberfläche. Das integrierte Terminal von VSCode kann Bilder direkt rendern, sodass du Vorhersageergebnisse direkt dort untersuchen kannst, wo du die Inferenz ausführst, ohne Dateien zurück auf deinen Laptop kopieren zu müssen. Diese Anleitung führt dich durch die Aktivierung der Einrichtung, das Verknüpfen des Codes und beantwortet häufig gestellte Fragen.
Nur kompatibel mit Linux und macOS. Überprüfe das VSCode Repository, den Issue-Status oder die Dokumentation auf 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. Diese Anleitung demonstriert die Verwendung des sixel Protokolls.
Prozess#
-
Zuerst musst du die Einstellungen
terminal.integrated.enableImagesundterminal.integrated.gpuAccelerationin VSCode aktivieren."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Installiere die
python-sixelBibliothek in deiner virtuellen Umgebung. Dies ist ein Fork derPySixelBibliothek, die nicht mehr gepflegt wird.pip install sixel -
Lade ein Modell und führe die Inferenz aus, plotte dann die Ergebnisse und speichere sie in einer Variablen. Erfahre mehr über Inferenzargumente und das Arbeiten mit Ergebnissen 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)!- Siehe Parameter der Plot-Methode, um mögliche Argumente zu sehen, die du verwenden kannst.
-
Verwende nun OpenCV, um die
np.ndarrayinbytesDaten zu konvertieren. Verwende dannio.BytesIO, um ein "dateidähnliches" Objekt 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)- Es ist auch möglich, andere Bildformate zu verwenden.
- Es wird nur das zurückgegebene Objekt am Index
1benötigt.
-
Erstelle eine
SixelWriterInstanz und verwende dann die.draw()Methode, 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 eigene Gefahr.
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)- Es ist auch möglich, andere Bildformate zu verwenden.
- Es wird nur das zurückgegebene Objekt am Index
1benötigt. - Siehe Parameter der Plot-Methode, um mögliche Argumente zu sehen, die du verwenden kannst.
Möglicherweise musst du clear verwenden, um die Ansicht des Bildes im Terminal zu "löschen".
FAQ#
Um YOLO-Inferenzergebnisse in einem VSCode-Terminal unter macOS oder Linux anzuzeigen, befolge diese Schritte:
-
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() -
Konvertiere das Inferenzergebnisbild in Bytes 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 Details 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 Windows-Unterstützung für Terminalgrafiken mit Sixel befindet sich noch in der Entwicklung. Aktuelle Informationen zur Windows-Kompatibilität findest du im VSCode Issue-Status und in der Dokumentation.
Wenn nichts gerendert wird, gehe diese Prüfungen der Reihe nach durch:
- Bestätige, dass sowohl
terminal.integrated.enableImagesals auchterminal.integrated.gpuAccelerationaktiviert sind, wie im Abschnitt Prozess gezeigt, und starte dann das integrierte Terminal neu, damit die Einstellungen wirksam werden. - Stelle sicher, dass
sixelin derselben virtuellen Umgebung installiert ist, in der dein Skript ausgeführt wird (pip install sixel). - Stelle sicher, dass
plotein gültigesnp.ndarrayist, bevor du es kodierst, dacv2.imencodeeinen Fehler auslöst, wenn das Bild leer oder kein gültiges Array ist. Siehe die Parameter der Plot-Methode für die Werte, dieresults[0].plot()akzeptiert.
Wenn die Probleme weiterhin bestehen, konsultiere das VSCode Repository bezüglich des Status der Unterstützung für Terminalbilder.
- Bestätige, dass sowohl
Das Anzeigen von Video-Inferenzergebnissen oder animierten GIF-Frames mit Sixel im Terminal ist derzeit nicht getestet und wird möglicherweise nicht unterstützt. Wir empfehlen, mit statischen Bildern zu beginnen und die Kompatibilität zu überprüfen. Versuche Videoergebnisse auf eigene Gefahr unter Berücksichtigung von Leistungseinschränkungen. Weitere Informationen zum Plotten von Inferenzergebnissen findest du auf der Seite zum Vorhersagemodus.
Das
sixelPaket ist ein Fork der nicht mehr gepflegtenPySixelBibliothek und ist ein schlanker Python-Wrapper über Pillow (PIL). Wennimport sixelfehlschlägt oderSixelWriter().draw()einen Fehler auslöst, vergewissere dich, dass das Paket in deiner aktiven virtuellen Umgebung installiert ist, stelle sicher, dass Pillow verfügbar ist, und überprüfe das python-sixel GitHub Repository auf plattformspezifische Hinweise. Weitere Informationen zum Generieren des Bildes, das du andraw()übergibst, findest du in der Dokumentation zum Vorhersagemodus.