Come visualizzare i risultati dell'inferenza YOLO nel terminale di VSCode#
Immagine tratta dal sito web di libsixel.
Motivazione#
Quando ti connetti a una macchina remota tramite SSH, di solito non è possibile visualizzare i risultati delle immagini o è necessario trasferire i dati a un dispositivo locale dotato di interfaccia grafica. Il terminale integrato di VSCode può eseguire il rendering diretto delle immagini, consentendoti di ispezionare i risultati della predizione direttamente nel punto in cui esegui l'inferenza, senza dover copiare i file sul tuo portatile. Questa guida illustra come abilitare la configurazione, collegare il codice e risponde alle domande frequenti.
Compatibile solo con Linux e macOS. Controlla il repository di VSCode, verifica lo stato delle segnalazioni o consulta la documentazione per gli aggiornamenti sul supporto a Windows per la visualizzazione delle immagini nel terminale con sixel.
I protocolli compatibili con VSCode per la visualizzazione delle immagini tramite il terminale integrato sono sixel e iTerm. Questa guida mostrerà l'uso del protocollo sixel.
Processo#
-
Per prima cosa, devi abilitare le impostazioni
terminal.integrated.enableImageseterminal.integrated.gpuAccelerationin VSCode."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Installa la libreria
python-sixelnel tuo ambiente virtuale. Questo è un fork della libreriaPySixel, che non è più mantenuta.pip install sixel -
Carica un modello ed esegui l'inferenza, quindi traccia i risultati e salvalin in una variabile. Scopri di più sugli argomenti di inferenza e su come lavorare con i risultati nella 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)!- Consulta i parametri del metodo plot per visualizzare i possibili argomenti utilizzabili.
-
Ora usa OpenCV per convertire i dati da
np.ndarrayabytes. Dopodiché, usaio.BytesIOper 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)- È possibile utilizzare anche altre estensioni di immagine.
- È necessario solo l'oggetto restituito all'indice
1.
-
Crea un'istanza di
SixelWritere 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#
L'uso di questo esempio con video o fotogrammi GIF animati non è stato testato. Procedi a tuo rischio.
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)- È possibile utilizzare anche altre estensioni di immagine.
- È necessario solo l'oggetto restituito all'indice
1. - Consulta i parametri del metodo plot per visualizzare i possibili argomenti utilizzabili.
Potrebbe essere necessario utilizzare clear per "cancellare" la visualizzazione dell'immagine nel terminale.
FAQ#
Per visualizzare i risultati dell'inferenza YOLO in un terminale VSCode su macOS o Linux, segui questi passaggi:
-
Abilita le impostazioni di VSCode necessarie:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Installa la libreria sixel:
pip install sixel -
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() -
Converti l'immagine del risultato 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 della modalità predict.
-
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 di Windows per la grafica del terminale tramite sixel è ancora in fase di sviluppo. Per gli aggiornamenti sulla compatibilità con Windows, controlla lo stato delle segnalazioni di VSCode e la documentazione.
Se non viene visualizzato nulla, esegui questi controlli in ordine:
- Conferma che sia
terminal.integrated.enableImagescheterminal.integrated.gpuAccelerationsiano abilitati, come mostrato nella sezione Processo, quindi riavvia il terminale integrato affinché le impostazioni abbiano effetto. - Verifica che
sixelsia installato nello stesso ambiente virtuale in cui viene eseguito il tuo script (pip install sixel). - Assicurati che
plotsia unnp.ndarrayvalido prima di codificarlo, poichécv2.imencodegenera un errore se l'immagine è vuota o non è un array valido. Consulta i parametri del metodo plot per i valori accettati daresults[0].plot().
Se i problemi persistono, consulta il repository di VSCode per lo stato del supporto delle immagini nel terminale.
- Conferma che sia
La visualizzazione dei risultati di inferenza video o di fotogrammi GIF animati tramite sixel nel terminale non è attualmente testata e potrebbe non essere supportata. Consigliamo di iniziare con immagini statiche e di verificarne la compatibilità. Tentare di visualizzare i risultati video è a tuo rischio e pericolo, tenendo conto dei vincoli di prestazioni. Per ulteriori informazioni sulla rappresentazione grafica dei risultati di inferenza, visita la pagina della modalità predict.
Il pacchetto
sixelè un fork della libreria non più mantenutaPySixeled è un sottile wrapper Python su Pillow (PIL). Seimport sixelfallisce oSixelWriter().draw()genera un errore, verifica che il pacchetto sia stato installato nel tuo ambiente virtuale attivo, assicurati che Pillow sia disponibile e controlla il repository GitHub di python-sixel per note specifiche sulla piattaforma. Per ulteriori informazioni sulla generazione dell'immagine da passare adraw(), consulta la documentazione della modalità predict.