Ultralytics YOLO27:

YOLO-Inferenz­ergebnisse 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 Linux und macOS

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#

  1. Zuerst musst du in VSCode die Einstellungen terminal.integrated.enableImages und terminal.integrated.gpuAcceleration aktivieren.

    "terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on"
    "terminal.integrated.enableImages": true

    VSCode enable terminal images setting

  2. Installiere die Bibliothek python-sixel in deiner virtuellen Umgebung. Dabei handelt es sich um einen Fork der Bibliothek PySixel, die nicht mehr gepflegt wird.

    pip install sixel
  3. 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)!
    1. Unter Parametern der Plot-Methode findest du mögliche Argumente, die du verwenden kannst.
  4. Verwende nun OpenCV, um np.ndarray in bytes-Daten umzuwandeln. Verwende anschließend io.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)
    1. Du kannst auch andere Bildformate verwenden.
    2. Du benötigst nur das zurückgegebene Objekt am Index 1.
  5. Erstelle eine Instanz von SixelWriter und 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#

YOLO inference results displayed in terminal

Videos und GIFs wurden nicht getestet

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)
  1. Du kannst auch andere Bildformate verwenden.
  2. Du benötigst nur das zurückgegebene Objekt am Index 1.
  3. Unter Parametern der Plot-Methode findest du mögliche Argumente, die du verwenden kannst.
Bild löschen

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:

    1. Aktiviere die erforderlichen VSCode-Einstellungen:

      "terminal.integrated.enableImages": true
      "terminal.integrated.gpuAcceleration": "auto"
    2. Installiere die sixel-Bibliothek:

      pip install sixel
    3. 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()
    4. 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:

    1. Vergewissere dich, dass sowohl terminal.integrated.enableImages als auch terminal.integrated.gpuAcceleration aktiviert sind, wie im Abschnitt Vorgehensweise beschrieben. Starte anschließend das integrierte Terminal neu, damit die Einstellungen wirksam werden.
    2. Prüfe, ob sixel in derselben virtuellen Umgebung installiert ist, in der dein Skript ausgeführt wird (pip install sixel).
    3. Stelle sicher, dass plot vor der Kodierung ein gültiges np.ndarray ist, da cv2.imencode einen Fehler auslöst, wenn das Bild leer oder kein gültiges Array ist. Unter Parametern der Plot-Methode findest du die von results[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.

  • 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 sixel ist ein Fork der nicht mehr gepflegten Bibliothek PySixel und ein schlanker Python-Wrapper für Pillow (PIL). Wenn import sixel fehlschlägt oder SixelWriter().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 an draw() übergibst, findest du in der Dokumentation zum Vorhersagemodus.

Kommentare