Vai al contenuto

Visualizzare i risultati dell'inferenza in un terminale

Esempio di immagine Sixel nel terminale

Immagine tratta dal sito web di libsixel.

Motivazione

Quando ci si connette a un computer remoto, normalmente la visualizzazione dei risultati delle immagini non è possibile o richiede lo spostamento dei dati su un dispositivo locale dotato di interfaccia grafica. Il terminale integrato VSCode permette di visualizzare direttamente le immagini. Questa è una breve dimostrazione di come utilizzarlo insieme a ultralytics con Risultati delle previsioni.

Avvertenze

Compatibile solo con Linux e MacOS. Controlla il codice VSCode deposito, controlla Stato del problema, oppure documentazione per aggiornamenti sul supporto di Windows per la visualizzazione di immagini nel terminale con sixel.

I protocolli compatibili con il VSCode per la visualizzazione delle immagini tramite il terminale integrato sono sixel e iTerm. Questa guida illustra l'uso del programma sixel protocollo.

Processo

  1. Per prima cosa, devi attivare le impostazioni terminal.integrated.enableImages e terminal.integrated.gpuAcceleration in VSCode.

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

Impostazione delle immagini del terminale per l'abilitazione del VSCode

  1. Installa il programma python-sixel nel tuo ambiente virtuale. Si tratta di un forcella del PySixel che non viene più mantenuta.

    pip install sixel
    
  2. Importa le librerie pertinenti

    import io
    
    import cv2 as cv
    
    from ultralytics import YOLO
    from sixel import SixelWriter
    
  3. Carica un modello ed esegue l'inferenza, quindi traccia i risultati e li memorizza in una variabile. Per saperne di più sugli argomenti dell'inferenza e sulla gestione dei risultati, consulta la pagina della modalità di previsione.

    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. Vedi i parametri del metodo plot per vedere i possibili argomenti da utilizzare.
  4. Ora, usa OpenCV per convertire i dati numpy.ndarray a bytes dati. Quindi utilizza io.BytesIO per creare un oggetto "simile a un file".

    # 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. È possibile utilizzare anche altre estensioni di immagini.
    2. Solo l'oggetto all'indice 1 che viene restituito è necessario.
  5. Crea un SixelWriter e poi utilizzare l'istanza .draw() per disegnare l'immagine nel terminale.

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

Esempio di risultati dell'inferenza

Visualizza l'immagine nel terminale

Pericolo

L'utilizzo di questo esempio con video o fotogrammi GIF animati non è stato testato. Provaci a tuo rischio e pericolo.

Esempio di codice completo

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. È possibile utilizzare anche altre estensioni di immagini.
  2. Solo l'oggetto all'indice 1 che viene restituito è necessario.
  3. Vedi i parametri del metodo plot per vedere i possibili argomenti da utilizzare.

Suggerimento

Potrebbe essere necessario utilizzare clear per "cancellare" la vista dell'immagine nel terminale.



Creato 2024-03-09, Aggiornato 2024-03-09
Autori: Burhan-Q (1)

Commenti