Ultralytics YOLO27:

Come visualizzare i risultati dell'inferenza di YOLO in un terminale VSCode#

Immagine dal sito web libsixel.

Motivazione#

Quando ti connetti a una macchina remota tramite SSH, normalmente non è possibile visualizzare le immagini o è necessario trasferire i dati su un dispositivo locale dotato di interfaccia grafica. Il terminale integrato di VSCode può eseguire il rendering diretto delle immagini, così puoi esaminare i risultati delle predizioni direttamente dove esegui l'inferenza, senza copiare i file sul tuo laptop. Questa guida illustra come abilitare la configurazione, collegare il codice e risponde alle domande frequenti.

Solo Linux e macOS

Compatibile solo con Linux e macOS. Consulta il repository di VSCode, verifica lo stato delle issue o la documentazione per aggiornamenti sul supporto a Windows per visualizzare le immagini nel terminale con sixel.

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

Procedura#

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

    "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. Si tratta di un fork della libreria PySixel, che non è più sottoposta a manutenzione.

    pip install sixel
  3. Carica un modello ed esegui l'inferenza, quindi traccia i risultati e salvali in una variabile. Per maggiori informazioni sugli argomenti dell'inferenza e sull'uso dei risultati, consulta la pagina della 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 gli argomenti disponibili.
  4. Ora usa OpenCV per convertire np.ndarray in dati bytes. Poi usa io.BytesIO per creare un oggetto simile a un file.

    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 usare anche altre estensioni per immagini.
    2. È necessario solo l'oggetto all'indice 1 tra quelli restituiti.
  5. Crea un'istanza di SixelWriter, quindi usa 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

Video e GIF non testati

L'uso di questo esempio con video o fotogrammi di GIF animate non è stato testato. Procedi a tuo rischio.

Esempio completo di codice#

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 usare anche altre estensioni per immagini.
  2. È necessario solo l'oggetto all'indice 1 tra quelli restituiti.
  3. Consulta i parametri del metodo plot per vedere gli argomenti disponibili.
Cancellazione dell'immagine

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

FAQ#

  • Per visualizzare i risultati dell'inferenza di 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="ultralytics/assets/bus.jpg")
      plot = results[0].plot()
    4. Converti l'immagine risultante dall'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 della modalità predict.

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

  • Se non viene visualizzato nulla, esegui questi controlli nell'ordine indicato:

    1. Verifica che terminal.integrated.enableImages e terminal.integrated.gpuAcceleration siano entrambi abilitati, come indicato nella sezione Procedura, quindi riavvia il terminale integrato affinché le impostazioni abbiano effetto.
    2. Verifica che sixel sia installato nello stesso ambiente virtuale in cui viene eseguito lo script (pip install sixel).
    3. Assicurati che plot sia un np.ndarray valido prima di codificarlo, poiché cv2.imencode genera un errore se l'immagine è vuota o non è un array valido. Consulta i parametri del metodo plot per i valori accettati da results[0].plot().

    Se i problemi persistono, consulta il repository di VSCode per verificare lo stato del supporto alle immagini nel terminale.

  • La visualizzazione dei risultati dell'inferenza video o dei fotogrammi di GIF animate tramite sixel nel terminale non è attualmente testata e potrebbe non essere supportata. Ti consigliamo di iniziare con immagini statiche e verificare la compatibilità. Prova a visualizzare risultati video a tuo rischio, tenendo conto dei limiti prestazionali. Per ulteriori informazioni sulla rappresentazione grafica dei risultati dell'inferenza, visita la pagina della modalità predict.

  • Il pacchetto sixel è un fork della libreria PySixel, non più sottoposta a manutenzione, e consiste in un sottile wrapper Python per Pillow (PIL). Se import sixel non funziona o SixelWriter().draw() genera un errore, verifica che il pacchetto sia installato nel tuo ambiente virtuale attivo, assicurati che Pillow sia disponibile e consulta il repository GitHub di python-sixel per note specifiche della piattaforma. Per maggiori informazioni sulla generazione dell'immagine da passare a draw(), consulta la documentazione della modalità predict.

Commenti