Inferenz-Ergebnisse im Terminal anzeigen

Sixel example of image in Terminal

Bild von der libsixel Website.

Motivation

Wenn du mit einer Remote-Maschine verbunden bist, ist die Visualisierung von Bild-Ergebnissen normalerweise nicht möglich oder erfordert das Verschieben von Daten auf ein lokales Gerät mit GUI. Das integrierte Terminal von VSCode ermöglicht das direkte Rendern von Bildern. Dies ist eine kurze Demonstration, wie du dies in Verbindung mit ultralytics und Vorhersage-Ergebnissen verwendest.

Warnung

Nur kompatibel mit Linux und MacOS. Überprüfe das VSCode-Repository, den Issue-Status oder die Dokumentation für Updates zur Windows-Unterstützung, um Bilder im Terminal mit sixel anzuzeigen.

Die VSCode-kompatiblen Protokolle für die Anzeige von Bildern im integrierten Terminal sind sixel und iTerm. Diese Anleitung demonstriert die Verwendung des sixel-Protokolls.

Prozess

  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 python-sixel-Bibliothek in deiner virtuellen Umgebung. Dies ist ein Fork der PySixel-Bibliothek, die nicht mehr gewartet wird.

    pip install sixel
  3. Lade ein Modell, führe die Inferenz aus, plotte die Ergebnisse und speichere sie in einer Variablen. Mehr Informationen zu Inferenz-Argumenten und zur Arbeit mit Ergebnissen findest du auf der Seite zum Vorhersage-Modus.

    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. Siehe Parameter der Plot-Methode, um die möglichen Argumente zu sehen.
  4. Verwende nun OpenCV, um das np.ndarray in bytes-Daten umzuwandeln. Nutze dann io.BytesIO, um ein "dateiä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)
    1. Es ist auch möglich, andere Bildformate zu verwenden.
    2. Es wird nur das Objekt am Index 1 benötigt, das zurückgegeben wird.
  5. Erstelle eine SixelWriter-Instanz 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 Inferenz-Ergebnisse

YOLO inference results displayed in terminal

Gefahr

Die Verwendung dieses Beispiels mit Videos oder animierten GIF-Frames wurde nicht getestet. Versuche es auf eigenes Risiko.

Vollständiges Code-Beispiel

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. Es ist auch möglich, andere Bildformate zu verwenden.
  2. Es wird nur das Objekt am Index 1 benötigt, das zurückgegeben wird.
  3. Siehe Parameter der Plot-Methode, um die möglichen Argumente zu sehen.

Tipp

Du musst eventuell clear verwenden, um die Bildansicht im Terminal zu "löschen".

FAQ

Wie kann ich YOLO-Inferenz-Ergebnisse in einem VSCode-Terminal unter macOS oder Linux anzeigen?

Um YOLO-Inferenz-Ergebnisse in einem VSCode-Terminal unter macOS oder Linux anzuzeigen, folge diesen Schritten:

  1. Aktiviere die notwendigen 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="path_to_image")
    plot = results[0].plot()
  4. Konvertiere das Inferenz-Ergebnisbild 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 Vorhersage-Modus.

Warum funktioniert das sixel-Protokoll nur unter Linux und macOS?

Das sixel-Protokoll wird derzeit nur unter Linux und macOS unterstützt, da diese Plattformen native Terminal-Funktionen haben, die mit sixel-Grafiken kompatibel sind. Die Windows-Unterstützung für Terminal-Grafiken mittels sixel befindet sich noch in der Entwicklung. Für Updates zur Windows-Kompatibilität, prüfe den VSCode Issue-Status und die Dokumentation.

Was ist, wenn ich Probleme bei der Anzeige von Bildern im VSCode-Terminal habe?

Wenn du Probleme bei der Anzeige von Bildern im VSCode-Terminal mit sixel hast:

  1. Stelle sicher, dass die notwendigen Einstellungen in VSCode aktiviert sind:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Überprüfe die Installation der sixel-Bibliothek:

    pip install sixel
  3. Prüfe deinen Code zur Bilddatenkonvertierung und zum Plotten auf Fehler. Zum Beispiel:

    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)

Falls die Probleme weiterhin bestehen, konsultiere das VSCode-Repository und besuche den Abschnitt Parameter der Plot-Methode für weitere Anleitungen.

Kann YOLO Video-Inferenz-Ergebnisse im Terminal mittels sixel anzeigen?

Die Anzeige von Video-Inferenz-Ergebnissen oder animierten GIF-Frames mittels sixel im Terminal ist derzeit ungetestet und wird möglicherweise nicht unterstützt. Wir empfehlen, mit statischen Bildern zu beginnen und die Kompatibilität zu prüfen. Versuche Video-Ergebnisse auf eigenes Risiko und bedenke dabei die Leistungsbeschränkungen. Für weitere Informationen zum Plotten von Inferenz-Ergebnissen besuche die Seite zum Vorhersage-Modus.

Wie kann ich Probleme mit der python-sixel-Bibliothek beheben?

Um Probleme mit der python-sixel-Bibliothek zu beheben:

  1. Stelle sicher, dass die Bibliothek korrekt in deiner virtuellen Umgebung installiert ist:

    pip install sixel
  2. Überprüfe, ob du die notwendigen Python- und System-Abhängigkeiten hast.

  3. Weitere Dokumentation und Community-Support findest du im python-sixel GitHub-Repository.

  4. Überprüfe deinen Code auf potenzielle Fehler, insbesondere die Verwendung von SixelWriter und die Schritte zur Konvertierung der Bilddaten.

Für weitere Unterstützung bei der Arbeit mit YOLO-Modellen und der sixel-Integration, siehe die Dokumentationsseiten zu Export und Vorhersage-Modus.

Kommentare