Comment afficher les résultats d’inférence YOLO dans un terminal VSCode#
Image provenant du site Web libsixel.
Motivation#
Lorsqu’on se connecte à une machine distante via SSH, il est généralement impossible de visualiser des images, 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 de prédiction 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 la documentation pour suivre les mises à jour concernant la prise en charge de Windows et l’affichage d’images dans le terminal avec sixel.
Les protocoles compatibles avec VSCode pour afficher des images dans le terminal intégré sont sixel et iTerm. Ce guide montre comment utiliser le protocole sixel.
Procédure#
-
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 sur le mode predict.
from ultralytics import YOLO # Charger un modèle model = YOLO("yolo26n.pt") # Effectuer une inférence sur une image results = model.predict(source="https://ultralytics.com/images/bus.jpg") # Tracer les résultats d’inférence plot = results[0].plot() # (1)!- Consulte les paramètres de la méthode plot pour découvrir les arguments disponibles.
-
Utilise maintenant OpenCV pour convertir les données
np.ndarrayen donnéesbytes. Utilise ensuiteio.BytesIOpour créer un objet « de type fichier ».import io import cv2 # Image des résultats sous forme d’octets im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # Octets de l’image sous forme d’objet de type fichier mem_file = io.BytesIO(im_bytes)- Tu peux également utiliser d’autres extensions d’image.
- Seul l’objet renvoyé à l’index
1est nécessaire.
-
Crée une instance
SixelWriter, puis utilise la méthode.draw()pour afficher l’image dans le terminal.from sixel import SixelWriter # Créer un objet d’écriture sixel w = SixelWriter() # Afficher l’image sixel dans le terminal w.draw(mem_file)
Exemple de résultats d’inférence#
Cet exemple n’a pas été testé avec des vidéos ou des images de GIF animés. Utilise-le à tes risques et périls.
Exemple de code complet#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# Charger un modèle
model = YOLO("yolo26n.pt")
# Effectuer une inférence sur une image
results = model.predict(source="https://ultralytics.com/images/bus.jpg")
# Tracer les résultats d’inférence
plot = results[0].plot() # (3)!
# Image des résultats sous forme d’octets
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 renvoyé à l’index
1est nécessaire. - Consulte les paramètres de la méthode plot pour découvrir les arguments disponibles.
Tu devras peut-être utiliser clear pour « effacer » l’image affichée dans le terminal.
FAQ#
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 :
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Installe la bibliothèque sixel :
pip install sixel -
Charge ton modèle YOLO et lance l’inférence :
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.predict(source="https://ultralytics.com/images/bus.jpg") plot = results[0].plot() -
Convertis l’image du résultat d’inférence en octets et affiche-la dans le terminal :
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)
Pour plus de détails, consulte la page sur le mode predict.
-
Le protocole sixel est actuellement pris en charge uniquement sous Linux et macOS, car ces plateformes disposent de capacités natives de terminal compatibles avec les graphiques sixel. La prise en charge des graphiques sixel dans les terminaux 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 Procédure, puis redémarre le terminal intégré pour appliquer les paramètres. - Vérifie que
sixelest installé dans le même environnement virtuel que celui dans lequel ton script s’exécute (pip install sixel). - Vérifie que
plotest unnp.ndarrayvalide avant de l’encoder, carcv2.imencoderenvoie une erreur si l’image est vide ou si le tableau n’est pas valide. Consulte les paramètres de la méthode plot pour connaître les valeurs acceptées parresults[0].plot().
Si le problème persiste, 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 des résultats d’inférence vidéo ou des images de GIF animés dans le terminal avec sixel n’a pas été testé et pourrait ne pas être pris en charge. Nous te recommandons de commencer par des images fixes et de vérifier la compatibilité. Essaie les résultats vidéo à tes risques et périls, en tenant compte des contraintes de performances. Pour en savoir plus sur le tracé des résultats d’inférence, consulte la page sur le 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()renvoie 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 python-sixel pour obtenir des informations propres à ta plateforme. Pour en savoir plus sur la génération de l’image que tu transmets àdraw(), consulte la documentation du mode predict.