Overslaan naar inhoud

Inferentieresultaten bekijken in een terminal

Sixel voorbeeld van afbeelding in Terminal

Afbeelding van de libsixel website.

Motivatie

Wanneer je verbinding maakt met een machine op afstand, is het visualiseren van beeldresultaten normaal gesproken niet mogelijk of moet je gegevens verplaatsen naar een lokaal apparaat met een GUI. Met de geïntegreerde terminal van VSCode kunnen afbeeldingen direct worden weergegeven. Dit is een korte demonstratie van hoe je dit kunt gebruiken in combinatie met ultralytics met voorspellingsresultaten.

Waarschuwing

Alleen compatibel met Linux en MacOS. Controleer de VSCode archiefcontroleer Statusof documentatie voor updates over Windows-ondersteuning om afbeeldingen te bekijken in terminal met sixel.

De VSCode-compatibele protocollen voor het bekijken van afbeeldingen met de geïntegreerde terminal zijn sixel en iTerm. Deze handleiding demonstreert het gebruik van de sixel protocol.

Proces

  1. Eerst moet je de instellingen inschakelen terminal.integrated.enableImages en terminal.integrated.gpuAcceleration in VSCode.

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

VSCode inschakelen instelling terminalafbeeldingen

  1. Installeer de python-sixel bibliotheek in je virtuele omgeving. Dit is een vork van de PySixel bibliotheek, die niet langer wordt onderhouden.

    pip install sixel
    
  2. Importeer de relevante bibliotheken

    import io
    
    import cv2 as cv
    
    from ultralytics import YOLO
    from sixel import SixelWriter
    
  3. Een model laden en inferentie uitvoeren, dan de resultaten plotten en opslaan in een variabele. Lees meer over inferentieargumenten en het werken met resultaten op de voorspellingsmodus pagina.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolov8n.pt")
    
    # Run inference on an image
    results = model.predict(source="ultralytics/assets/bus.jpg")
    
    # Plot inference results
    plot = results[0].plot() #(1)!
    
    1. Zie de parameters van de plotmethode om te zien welke argumenten je kunt gebruiken.
  4. Gebruik nu OpenCV om de numpy.ndarray naar bytes gegevens. Gebruik dan io.BytesIO om een "bestandsachtig" object te maken.

    # Results image as bytes
    im_bytes = cv.imencode(
        ".png", #(1)!
        plot,
        )[1].tobytes() #(2)!
    
    # Image bytes as a file-like object
    mem_file = io.BytesIO(im_bytes)
    
    1. Het is ook mogelijk om andere afbeeldingsextensies te gebruiken.
    2. Alleen het object op index 1 die wordt geretourneerd nodig is.
  5. Maak een SixelWriter instantie en gebruik dan de .draw() methode om de afbeelding in de terminal te tekenen.

    # Create sixel writer object
    w = SixelWriter()
    
    # Draw the sixel image in the terminal
    w.draw(mem_file)
    

Voorbeeld inferentie resultaten

Afbeelding weergeven in terminal

Gevaar

Het gebruik van dit voorbeeld met video's of geanimeerde GIF-frames is niet getest. Probeer het op eigen risico.

Volledig codevoorbeeld

import io

import cv2 as cv

from ultralytics import YOLO
from sixel import SixelWriter

# Load a model
model = YOLO("yolov8n.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 = cv.imencode(
    ".png", #(1)!
    plot,
    )[1].tobytes() #(2)!

mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)
  1. Het is ook mogelijk om andere afbeeldingsextensies te gebruiken.
  2. Alleen het object op index 1 die wordt geretourneerd nodig is.
  3. Zie de parameters van de plotmethode om te zien welke argumenten je kunt gebruiken.

Tip

Mogelijk moet je clear om het beeld in de terminal te "wissen".



Aangemaakt 2024-03-09, Bijgewerkt 2024-04-27
Auteurs: glenn-jocher (1), Burhan-Q (1)

Reacties