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.
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#
-
Per prima cosa, devi abilitare in VSCode le impostazioni
terminal.integrated.enableImageseterminal.integrated.gpuAcceleration."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ù sottoposta a manutenzione.pip install sixel -
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)!- Consulta i parametri del metodo plot per vedere gli argomenti disponibili.
-
Ora usa OpenCV per convertire
np.ndarrayin datibytes. Poi 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 usare anche altre estensioni per immagini.
- È necessario solo l'oggetto all'indice
1tra quelli restituiti.
-
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#
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)- È possibile usare anche altre estensioni per immagini.
- È necessario solo l'oggetto all'indice
1tra quelli restituiti. - Consulta i parametri del metodo plot per vedere gli argomenti disponibili.
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:
-
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="ultralytics/assets/bus.jpg") plot = results[0].plot() -
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:
- Verifica che
terminal.integrated.enableImageseterminal.integrated.gpuAccelerationsiano entrambi abilitati, come indicato 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 alle immagini nel terminale.
- Verifica che
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 libreriaPySixel, non più sottoposta a manutenzione, e consiste in un sottile wrapper Python per Pillow (PIL). Seimport sixelnon funziona oSixelWriter().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 adraw(), consulta la documentazione della modalità predict.