Comment afficher les résultats d’inférence YOLO dans un terminal VSCode#
Image provenant du site web libsixel.
Motivation#
Lorsque tu te connectes à une machine distante via SSH, il n’est normalement pas possible de visualiser les résultats d’image, ou il faut transférer les données vers un appareil local doté d’une interface graphique. Le terminal intégré de VSCode peut afficher directement les images. Tu peux donc examiner les résultats des prédictions là où tu exécutes l’inférence, sans recopier les fichiers sur ton ordinateur portable. Ce guide explique comment activer la configuration, mettre en place le code et répond aux questions fréquentes.
Compatible uniquement avec Linux et macOS. Consulte le dépôt VSCode, vérifie l’état du problème ou consulte la documentation pour connaître les mises à jour concernant la prise en charge de Windows pour 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 montre comment utiliser le protocole sixel.
Processus#
-
Commence par 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. Pour en savoir plus sur les arguments d’inférence et l’utilisation des résultats, consulte 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 connaître les arguments utilisables.
-
Utilise maintenant OpenCV pour convertir
np.ndarrayen donnéesbytes. Utilise ensuiteio.BytesIOpour créer un objet de type « fichier ».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)- Tu peux également utiliser d’autres extensions d’image.
- Seul l’objet à l’index
1parmi ceux renvoyés est nécessaire.
-
Crée une instance de
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 de GIF animés n’a pas été testée. Essaie à tes propres risques.
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)- Tu peux également utiliser d’autres extensions d’image.
- Seul l’objet à l’index
1parmi ceux renvoyés est nécessaire. - Consulte les paramètres de la méthode plot pour connaître les arguments utilisables.
Tu devras peut-être utiliser clear pour « effacer » l’image affichée dans le terminal.
FAQ#
Le protocole sixel est actuellement pris en charge uniquement sous Linux et macOS, car ces plateformes disposent de fonctionnalités natives du terminal compatibles avec les graphiques sixel. La prise en charge des graphiques de terminal avec sixel sous Windows est encore en cours de développement. Pour suivre les mises à jour concernant la compatibilité avec Windows, consulte l’état du problème VSCode et la documentation.
Si rien ne s’affiche, effectue ces vérifications dans l’ordre :
- Vérifie que
terminal.integrated.enableImagesetterminal.integrated.gpuAccelerationsont tous deux activés, comme indiqué dans la section Processus, puis redémarre le terminal intégré pour que les paramètres soient pris en compte. - Vérifie que
sixelest installé dans le même environnement virtuel que celui dans lequel ton script s’exécute (pip install sixel). - Assure-toi que
plotest unnp.ndarrayvalide avant de l’encoder, carcv2.imencodegénère 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.
- Vérifie que
L’affichage de résultats d’inférence vidéo ou d’images de GIF animés avec sixel dans le terminal n’a actuellement pas été testé et pourrait ne pas être pris en charge. Nous te recommandons de commencer par des images statiques et de vérifier la compatibilité. Essaie d’afficher des résultats vidéo à tes propres risques, en tenant compte des contraintes de performances. Pour plus d’informations sur le traçage des résultats d’inférence, consulte la page du mode predict.
Le paquet
sixelest un fork de la bibliothèquePySixel, qui n’est plus maintenue, et constitue une fine couche Python au-dessus de Pillow (PIL). Siimport sixeléchoue ou siSixelWriter().draw()génère une erreur, vérifie que le paquet est installé dans ton environnement virtuel actif, assure-toi que Pillow est disponible et consulte le dépôt GitHub de python-sixel pour connaître les remarques spécifiques à chaque plateforme. Pour en savoir plus sur la génération de l’image que tu transmets à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 les étapes suivantes :
Active les paramètres nécessaires de VSCode :
Installe la bibliothèque sixel :
Charge ton modèle YOLO et exécute 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, consulte la page du mode predict.