Visualizzare i risultati dell'inferenza in un terminale

Sixel example of image in Terminal

Immagine dal sito web libsixel.

Motivazione

Quando ti connetti a una macchina remota, di solito visualizzare i risultati delle immagini non è possibile o richiede lo spostamento dei dati su un dispositivo locale con una GUI. Il terminale integrato di VSCode consente di eseguire il rendering diretto delle immagini. Questa è una breve dimostrazione su come utilizzarlo insieme a ultralytics con i risultati della previsione.

Avviso

Compatibile solo con Linux e MacOS. Controlla il repository di VSCode, lo stato del problema o la documentazione per aggiornamenti sul supporto Windows per visualizzare immagini nel terminale con sixel.

I protocolli compatibili con VSCode per visualizzare le immagini utilizzando il terminale integrato sono sixel e iTerm. Questa guida dimostrerà l'uso del protocollo sixel.

Procedura

  1. Per prima cosa, devi abilitare 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": true

    VSCode enable terminal images setting

  2. Installa la libreria python-sixel nel tuo ambiente virtuale. Questo è un fork della libreria PySixel, che non è più mantenuta.

    pip install sixel
  3. Carica un modello ed esegui l'inferenza, quindi traccia i risultati e salvali in una variabile. Vedi di più sugli argomenti di inferenza e sul lavoro con i risultati nella pagina modalità predict.

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

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

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

Esempio di risultati dell'inferenza

YOLO inference results displayed in terminal

Pericolo

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

Esempio di codice completo

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

Suggerimento

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

FAQ

Come posso visualizzare i risultati dell'inferenza YOLO in un terminale VSCode su macOS o Linux?

Per visualizzare i risultati dell'inferenza YOLO in un terminale VSCode su macOS o Linux, segui questi passaggi:

  1. Abilita le impostazioni necessarie di VSCode:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Installa la libreria sixel:

    pip install sixel
  3. Carica il tuo modello YOLO ed esegui l'inferenza:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
  4. Converti l'immagine dei risultati dell'inferenza in byte e visualizzala nel terminale:

    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)

Per ulteriori dettagli, visita la pagina modalità predict.

Perché il protocollo sixel funziona solo su Linux e macOS?

Il protocollo sixel è attualmente supportato solo su Linux e macOS perché queste piattaforme dispongono di funzionalità di terminale native compatibili con la grafica sixel. Il supporto Windows per la grafica del terminale utilizzando sixel è ancora in fase di sviluppo. Per aggiornamenti sulla compatibilità con Windows, controlla lo stato del problema di VSCode e la documentazione.

Cosa succede se riscontro problemi nella visualizzazione delle immagini nel terminale VSCode?

Se riscontri problemi nella visualizzazione delle immagini nel terminale VSCode utilizzando sixel:

  1. Assicurati che le impostazioni necessarie in VSCode siano abilitate:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Verifica l'installazione della libreria sixel:

    pip install sixel
  3. Controlla il tuo codice di conversione dei dati immagine e di tracciamento per errori. Ad esempio:

    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)

Se i problemi persistono, consulta il repository di VSCode e visita la sezione parametri del metodo plot per ulteriori indicazioni.

YOLO può visualizzare i risultati dell'inferenza video nel terminale utilizzando sixel?

La visualizzazione dei risultati dell'inferenza video o dei frame GIF animati utilizzando sixel nel terminale non è attualmente testata e potrebbe non essere supportata. Ti consigliamo di iniziare con immagini statiche e verificare la compatibilità. Procedi con i risultati video a tuo rischio e pericolo, tenendo presente i vincoli di prestazioni. Per ulteriori informazioni sul tracciamento dei risultati dell'inferenza, visita la pagina modalità predict.

Come posso risolvere i problemi con la libreria python-sixel?

Per risolvere i problemi con la libreria python-sixel:

  1. Assicurati che la libreria sia installata correttamente nel tuo ambiente virtuale:

    pip install sixel
  2. Verifica di avere le dipendenze Python e di sistema necessarie.

  3. Fai riferimento al repository GitHub di python-sixel per ulteriore documentazione e supporto della community.

  4. Controlla due volte il tuo codice per potenziali errori, in particolare l'utilizzo di SixelWriter e i passaggi di conversione dei dati dell'immagine.

Per ulteriore assistenza sul lavoro con i modelli YOLO e l'integrazione sixel, consulta le pagine di documentazione export e modalità predict.

Commenti