Visualiser les résultats d'inférence dans un terminal

Sixel example of image in Terminal

Image issue du site web libsixel.

Motivation

Lorsque tu te connectes à une machine distante, il n'est généralement pas possible de visualiser les résultats sous forme d'images, ou cela nécessite de transférer les données vers un appareil local doté d'une interface graphique. Le terminal intégré de VSCode permet un rendu direct des images. Voici une courte démonstration de la façon de l'utiliser avec ultralytics et les résultats de prédiction.

Avertissement

Compatible uniquement avec Linux et MacOS. Consulte le dépôt VSCode, vérifie l'état du ticket ou la documentation pour obtenir des mises à jour sur la prise en charge de Windows pour l'affichage d'images dans le terminal avec sixel.

Les protocoles compatibles avec VSCode pour visualiser des images via le terminal intégré sont sixel et iTerm. Ce guide démontrera l'utilisation du protocole sixel.

Processus

  1. Tout d'abord, tu dois 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. Apprends-en plus sur les arguments d'inférence et le travail avec les 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)!
    1. Consulte les paramètres de la méthode plot pour voir les arguments possibles à utiliser.
  4. Maintenant, utilise OpenCV pour convertir le np.ndarray en données bytes. Utilise ensuite io.BytesIO pour créer un objet "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. Il est également possible d'utiliser d'autres extensions d'image.
    2. Seul l'objet à l'index 1 renvoyé est nécessaire.
  5. 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

YOLO inference results displayed in terminal

Danger

L'utilisation de cet exemple avec des vidéos ou des images GIF animées n'a pas été testée. Tente l'expérience à 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. Il est également possible d'utiliser d'autres extensions d'image.
  2. Seul l'objet à l'index 1 renvoyé est nécessaire.
  3. Consulte les paramètres de la méthode plot pour voir les arguments possibles à utiliser.

Astuce

Tu devras peut-être utiliser clear pour "effacer" la vue de l'image dans le terminal.

FAQ

Comment puis-je visualiser les résultats d'inférence YOLO dans un terminal VSCode sur macOS ou Linux ?

Pour visualiser 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="path_to_image")
    plot = results[0].plot()
  4. Convertis l'image des résultats 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, visite la page du mode predict.

Pourquoi le protocole sixel ne fonctionne-t-il que sur Linux et macOS ?

Le protocole sixel n'est actuellement pris en charge que sur Linux et macOS car ces plateformes disposent de capacité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 développement. Pour des mises à jour sur la compatibilité Windows, vérifie l'état du ticket VSCode et la documentation.

Que faire si je rencontre des problèmes lors de l'affichage d'images dans le terminal VSCode ?

Si tu rencontres des problèmes pour afficher des images dans le terminal VSCode en utilisant sixel :

  1. Assure-toi que les paramètres nécessaires dans VSCode sont activés :

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Vérifie l'installation de la bibliothèque sixel :

    pip install sixel
  3. Vérifie les erreurs dans ton code de conversion et de traçage des données d'image. Par exemple :

    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)

Si les problèmes persistent, consulte le dépôt VSCode et visite la section paramètres de la méthode plot pour des conseils supplémentaires.

YOLO peut-il afficher des résultats d'inférence vidéo dans le terminal en utilisant sixel ?

L'affichage des résultats d'inférence vidéo ou des images GIF animées en utilisant sixel dans le terminal n'est actuellement pas testé et pourrait ne pas être pris en charge. Nous te recommandons de commencer par des images statiques et de vérifier la compatibilité. Tente l'affichage de résultats vidéo à tes propres risques, en gardant à l'esprit les contraintes de performance. Pour plus d'informations sur le traçage des résultats d'inférence, visite la page du mode predict.

Comment puis-je résoudre les problèmes liés à la bibliothèque python-sixel ?

Pour résoudre les problèmes liés à la bibliothèque python-sixel :

  1. Assure-toi que la bibliothèque est correctement installée dans ton environnement virtuel :

    pip install sixel
  2. Vérifie que tu disposes des dépendances Python et système nécessaires.

  3. Reporte-toi au dépôt GitHub python-sixel pour une documentation supplémentaire et le support de la communauté.

  4. Vérifie ton code pour détecter d'éventuelles erreurs, en particulier l'utilisation de SixelWriter et les étapes de conversion des données d'image.

Pour une assistance supplémentaire sur le travail avec les modèles YOLO et l'intégration sixel, consulte les pages de documentation sur l'export et le mode predict.

Commentaires