Ultralytics YOLO27 :
Get Started

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.

Linux et macOS uniquement

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#

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

YOLO inference results displayed in terminal

Vidéos et GIF non testés

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)
  1. Tu peux également utiliser d’autres extensions d’image.
  2. Seul l’objet renvoyé à l’index 1 est nécessaire.
  3. Consulte les paramètres de la méthode plot pour découvrir les arguments disponibles.
Effacer 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 ces étapes :

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

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

      pip install sixel
    3. 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()
    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 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 :

    1. Vérifie que terminal.integrated.enableImages et terminal.integrated.gpuAcceleration sont tous deux activés, comme indiqué dans la section Procédure, puis redémarre le terminal intégré pour appliquer les paramètres.
    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. Vérifie que plot est un np.ndarray valide avant de l’encoder, car cv2.imencode renvoie 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 par results[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.

  • 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 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() 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.

Commentaires