Comment afficher les résultats d'inférence YOLO dans un terminal VSCode#
Image provenant du site Web de libsixel.
Motivation#
Lors d'une connexion à une machine distante via SSH, la visualisation des résultats d'image n'est normalement pas possible ou nécessite le transfert de données vers un appareil local doté d'une interface graphique. Le terminal intégré de VSCode peut afficher les images directement, ce qui te permet d'inspecter les résultats de prédiction là même où tu exécutes l'inférence, sans avoir à copier les fichiers sur ton ordinateur portable. Ce guide détaille l'activation de la configuration, la mise en place du code, et répond aux questions fréquentes.
Compatible uniquement avec Linux et macOS. Consulte le dépôt VSCode, l'état des tickets, ou la documentation pour obtenir des mises à jour sur la prise en charge de Windows afin d'afficher des images dans le terminal avec sixel.
Les protocoles compatibles avec VSCode pour afficher des images à l'aide du terminal intégré sont sixel et iTerm. Ce guide démontrera l'utilisation du protocole sixel.
Processus#
-
Tout d'abord, tu dois activer les paramètres
terminal.integrated.enableImagesetterminal.integrated.gpuAccelerationdans VSCode."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Installe la bibliothèque
python-sixeldans ton environnement virtuel. Il s'agit d'un fork de la bibliothèquePySixel, qui n'est plus maintenue.pip install sixel -
Charge un modèle et exécute l'inférence, puis trace les résultats et stocke-les dans une variable. Apprends-en plus sur les arguments d'inférence et la manipulation des résultats sur la page du mode 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)!- Consulte les paramètres de la méthode plot pour voir les arguments possibles à utiliser.
-
Maintenant, utilise OpenCV pour convertir les données
np.ndarrayenbytes. Utilise ensuiteio.BytesIOpour créer un objet de type fichier (« 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)- Il est également possible d'utiliser d'autres extensions d'image.
- Seul l'objet à l'indice
1qui est renvoyé est nécessaire.
-
Crée une instance
SixelWriter, puis utilise la méthode.draw()pour dessiner l'image dans le terminal.from sixel import SixelWriter # Create sixel writer object w = SixelWriter() # Draw the sixel image in the terminal w.draw(mem_file)
Exemple de résultats d'inférence#
L'utilisation de cet exemple avec des vidéos ou des images GIF animées n'a pas été testée. Tente-le à tes risques et périls.
Exemple de code complet#
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)- Il est également possible d'utiliser d'autres extensions d'image.
- Seul l'objet à l'indice
1qui est renvoyé est nécessaire. - Consulte les paramètres de la méthode plot pour voir les arguments possibles à utiliser.
Tu pourrais avoir besoin d'utiliser clear pour « effacer » l'affichage de l'image dans le terminal.
FAQ#
Le protocole sixel n'est actuellement pris en charge que sur Linux et macOS car ces plateformes possèdent des fonctionnalités de terminal natives compatibles avec les graphiques sixel. La prise en charge de Windows pour les graphiques de terminal utilisant sixel est toujours en cours de développement. Pour les mises à jour concernant la compatibilité avec Windows, consulte l'état des tickets VSCode et la documentation.
Si rien ne s'affiche, effectue ces vérifications dans l'ordre :
- Confirme que
terminal.integrated.enableImagesetterminal.integrated.gpuAccelerationsont tous deux activés, comme indiqué dans la section Process, puis redémarre le terminal intégré pour que les paramètres prennent effet. - Vérifie que
sixelest installé dans le même environnement virtuel que celui dans lequel s'exécute ton script (pip install sixel). - Assure-toi que
plotest unnp.ndarrayvalide avant de l'encoder, carcv2.imencodelève une erreur si l'image est vide ou ne constitue pas un tableau valide. Consulte les paramètres de la méthode plot pour connaître les valeurs acceptées parresults[0].plot().
Si les problèmes persistent, consulte le dépôt VSCode pour connaître l'état de la prise en charge des images dans le terminal.
- Confirme que
L'affichage des résultats d'inférence vidéo ou de cadres GIF animés à l'aide de sixel dans le terminal n'est actuellement pas testé et peut ne pas être pris en charge. Nous te recommandons de commencer par des images statiques et de vérifier la compatibilité. Tente d'afficher des résultats vidéo à tes propres risques, en gardant à l'esprit les contraintes de performance. Pour plus d'informations sur le tracé des résultats d'inférence, visite la page du mode predict.
Le paquet
sixelest un fork de la bibliothèque non maintenuePySixelet constitue un mince wrapper Python au-dessus de Pillow (PIL). Siimport sixeléchoue ou siSixelWriter().draw()lève une erreur, confirme que le paquet a bien été installé dans ton environnement virtuel actif, assure-toi que Pillow est disponible et consulte le dépôt GitHub python-sixel pour les notes spécifiques à chaque plateforme. Pour en savoir plus sur la génération de l'image que tu passes àdraw(), consulte la documentation du mode predict.
Pour afficher les résultats d'inférence YOLO dans un terminal VSCode sur macOS ou Linux, suis ces étapes :
Active les paramètres VSCode nécessaires :
Installe la bibliothèque sixel :
Charge ton modèle YOLO et lance l'inférence :
Convertis l'image du résultat d'inférence en octets et affiche-la dans le terminal :
Pour plus de détails, visite la page du mode predict.