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 i risultati delle immagini oppure è necessario trasferire i dati su un dispositivo locale con interfaccia grafica. Il terminale integrato di VSCode può visualizzare direttamente le immagini, così puoi esaminare i risultati delle previsioni proprio dove esegui l'inferenza, senza copiare i file sul tuo laptop. Questa guida ti accompagna nell'attivazione della configurazione, nell'integrazione del codice e risponde alle domande frequenti.
Compatibile solo con Linux e macOS. Consulta il repository di VSCode, controlla lo stato delle issue o la documentazione per gli aggiornamenti sul supporto di Windows alla visualizzazione delle immagini nel terminale con sixel.
I protocolli compatibili con VSCode per visualizzare immagini usando il terminale integrato sono sixel e iTerm. Questa guida mostrerà come usare il protocollo sixel.
Procedura#
-
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. Si tratta di un fork della libreriaPySixel, che non è più mantenuta.pip install sixel -
Carica un modello ed esegui l'inferenza, poi traccia i risultati e memorizzali in una variabile. Scopri di più sugli argomenti di inferenza e su come lavorare con i risultati nella pagina della modalità di previsione.
from ultralytics import YOLO # Carica un modello model = YOLO("yolo26n.pt") # Esegui l'inferenza su un'immagine results = model.predict(source="https://ultralytics.com/images/bus.jpg") # Traccia i risultati dell'inferenza plot = results[0].plot() # (1)!- Consulta i parametri del metodo plot per vedere gli argomenti disponibili.
-
Ora usa OpenCV per convertire i dati
np.ndarrayinbytes. Poi usaio.BytesIOper creare un oggetto simile a un file.import io import cv2 # Immagine dei risultati come byte im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # Byte dell'immagine come oggetto simile a un file mem_file = io.BytesIO(im_bytes)- È possibile usare anche altre estensioni di immagine.
- Serve solo l'oggetto restituito all'indice
1.
-
Crea un'istanza di
SixelWriter, quindi usa il metodo.draw()per disegnare l'immagine nel terminale.from sixel import SixelWriter # Crea un oggetto writer sixel w = SixelWriter() # Disegna l'immagine sixel nel terminale w.draw(mem_file)
Esempi di risultati dell'inferenza#
Questo esempio non è stato testato con video o fotogrammi GIF animati. Procedi a tuo rischio.
Esempio completo di codice#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# Carica un modello
model = YOLO("yolo26n.pt")
# Esegui l'inferenza su un'immagine
results = model.predict(source="https://ultralytics.com/images/bus.jpg")
# Traccia i risultati dell'inferenza
plot = results[0].plot() # (3)!
# Immagine dei risultati come byte
im_bytes = cv2.imencode(
".png", # (1)!
plot,
)[1].tobytes() # (2)!
mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)- È possibile usare anche altre estensioni di immagine.
- Serve solo l'oggetto restituito all'indice
1. - Consulta i parametri del metodo plot per vedere gli argomenti disponibili.
Potrebbe essere necessario usare clear per "cancellare" la visualizzazione dell'immagine nel terminale.
Domande frequenti#
Per visualizzare i risultati dell'inferenza di YOLO in un terminale VSCode su macOS o Linux, segui questi passaggi:
-
Abilita le impostazioni necessarie di VSCode:
"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="https://ultralytics.com/images/bus.jpg") plot = results[0].plot() -
Converti in byte l'immagine risultante dall'inferenza 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à di previsione.
-
Attualmente il protocollo sixel è 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 nel terminale tramite sixel è ancora in fase di sviluppo. Per gli 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:
- Verifica che
terminal.integrated.enableImageseterminal.integrated.gpuAccelerationsiano entrambi abilitati, come mostrato nella sezione Procedura, quindi riavvia il terminale integrato affinché le impostazioni abbiano effetto. - Verifica che
sixelsia installato nello stesso ambiente virtuale in cui viene eseguito lo 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 verificare lo stato del supporto delle immagini nel terminale.
- Verifica che
La visualizzazione dei risultati dell'inferenza video o dei fotogrammi GIF animati tramite sixel nel terminale non è attualmente stata testata e potrebbe non essere supportata. Ti consigliamo di iniziare con immagini statiche e verificare la compatibilità. Prova a visualizzare i risultati video a tuo rischio, tenendo conto dei vincoli prestazionali. Per ulteriori informazioni su come tracciare i risultati dell'inferenza, visita la pagina della modalità di previsione.
Il pacchetto
sixelè un fork della libreriaPySixel, non più mantenuta, ed è un semplice wrapper Python per Pillow (PIL). Seimport sixelnon funziona oSixelWriter().draw()genera un errore, verifica che il pacchetto sia installato nell'ambiente virtuale attivo, assicurati che Pillow sia disponibile e consulta il repository GitHub di python-sixel per le note specifiche della piattaforma. Per ulteriori informazioni sulla generazione dell'immagine da passare adraw(), consulta la documentazione della modalità di previsione.