Ultralytics YOLO27 :

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.

Linux et macOS uniquement

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#

  1. Commence par activer les paramètres terminal.integrated.enableImages et terminal.integrated.gpuAcceleration dans VSCode.

    "terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on"
    "terminal.integrated.enableImages": true

    VSCode enable terminal images setting

  2. Installe la bibliothèque python-sixel dans ton environnement virtuel. Il s’agit d’un fork de la bibliothèque PySixel, qui n’est plus maintenue.

    pip install sixel
  3. 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)!
    1. Consulte les paramètres de la méthode plot pour connaître les arguments utilisables.
  4. Utilise maintenant OpenCV pour convertir np.ndarray en données bytes. Utilise ensuite io.BytesIO pour 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)
    1. Tu peux également utiliser d’autres extensions d’image.
    2. Seul l’objet à l’index 1 parmi ceux renvoyés est nécessaire.
  5. 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#

YOLO inference results displayed in terminal

Vidéos et GIF non testés

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)
  1. Tu peux également utiliser d’autres extensions d’image.
  2. Seul l’objet à l’index 1 parmi ceux renvoyés est nécessaire.
  3. Consulte les paramètres de la méthode plot pour connaître les arguments utilisables.
Effacement de l’image

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 les étapes suivantes :

    1. Active les paramètres nécessaires de VSCode :

      "terminal.integrated.enableImages": true
      "terminal.integrated.gpuAcceleration": "auto"
    2. Installe la bibliothèque sixel :

      pip install sixel
    3. Charge ton modèle YOLO et exécute l’inférence :

      from ultralytics import YOLO
      
      model = YOLO("yolo26n.pt")
      results = model.predict(source="ultralytics/assets/bus.jpg")
      plot = results[0].plot()
    4. 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 du mode predict.

  • 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 :

    1. Vérifie que terminal.integrated.enableImages et terminal.integrated.gpuAcceleration sont 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.
    2. Vérifie que sixel est installé dans le même environnement virtuel que celui dans lequel ton script s’exécute (pip install sixel).
    3. Assure-toi que plot est un np.ndarray valide avant de l’encoder, car cv2.imencode gé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 par results[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.

  • 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 sixel est un fork de la bibliothèque PySixel, qui n’est plus maintenue, et constitue une fine couche Python au-dessus de Pillow (PIL). Si import sixel échoue ou si SixelWriter().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.

Commentaires