Skip to content

Afficher les résultats de l'inférence dans un terminal

Sixième exemple d'image dans le terminal

Image tirée du site web de libsixel.

Motivation

Lors de la connexion à une machine distante, normalement la visualisation des résultats des images n'est pas possible ou nécessite de déplacer les données vers un appareil local doté d'une interface graphique. Le terminal intégré VSCode permet de rendre directement les images. Voici une courte démonstration de l'utilisation de ce terminal en conjonction avec ultralytics avec résultats des prédictions.

Avertissement

Compatible uniquement avec Linux et MacOS. Vérifie les Référentiel VSCode, vérifie Statut de la questionou documentation pour des mises à jour sur la prise en charge par Windows de l'affichage des images dans le terminal avec sixel.

Les protocoles compatibles avec le VSCode pour la visualisation des images à l'aide du terminal intégré sont les suivants sixel et iTerm. Ce guide présente l'utilisation de l'outil sixel protocole.

Processus

  1. Tout d'abord, tu dois activer les paramètres terminal.integrated.enableImages et terminal.integrated.gpuAcceleration dans le VSCode.

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

    VSCode enable terminal images setting

  2. Installe le python-sixel dans ton environnement virtuel. Il s'agit d'une fourchette de la 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 les stocke dans une variable. Pour en savoir plus sur les arguments d'inférence et l'utilisation des résultats, consulte la page du mode prédire.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolov8n.pt")
    
    # Run inference on an image
    results = model.predict(source="ultralytics/assets/bus.jpg")
    
    # Plot inference results
    plot = results[0].plot()  # (1)!
    
    1. Voir les paramètres de la méthode de traçage pour connaître les arguments possibles à utiliser.
  4. Maintenant, utilise OpenCV pour convertir le numpy.ndarray à bytes données. Utilise ensuite io.BytesIO pour créer un objet qui ressemble à un 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'images.
    2. Seul l'objet à l'index 1 qui est renvoyée est nécessaire.
  5. Crée un SixelWriter et utilise ensuite l'instance .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

Afficher l'image dans le terminal

Danger

L'utilisation de cet exemple avec des vidéos ou des images GIF animées n' a pas été testée. Essaie à tes risques et périls.

Exemple de code complet

import io

import cv2
from sixel import SixelWriter

from ultralytics import YOLO

# Load a model
model = YOLO("yolov8n.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'images.
  2. Seul l'objet à l'index 1 qui est renvoyée est nécessaire.
  3. Voir les paramètres de la méthode de traçage pour connaître les arguments possibles à utiliser.

Astuce

Il se peut que tu aies besoin d'utiliser clear pour "effacer" la vue de l'image dans le terminal.

FAQ

Comment puis-je voir les résultats de l'inférence YOLO dans un terminal VSCode sous macOS ou Linux ?

Pour afficher les résultats de l'inférence YOLO dans un terminal VSCode sur macOS ou Linux, suis les étapes suivantes :

  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("yolov8n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
    
  4. Convertit l'image du résultat de l'inférence en octets et l'affiche 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 de prédiction.

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

Le protocole sixel n'est actuellement pris en charge que sous Linux et macOS, car ces plateformes disposent de capacités de terminal natives compatibles avec les graphiques sixel. La prise en charge par Windows des graphiques de terminal utilisant sixel est encore en cours de développement. Pour obtenir des mises à jour sur la compatibilité avec Windows, consulte l'état d'avancement du VSCode et la documentation.

Que faire si je rencontre des problèmes d'affichage des 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 le 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 qu'il n'y a pas d'erreurs dans la conversion des données d'image et dans le code de traçage. 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 référentiel VSCode, et visite la section des paramètres de la méthode de traçage pour obtenir des conseils supplémentaires.

YOLO peut-il afficher les résultats de l'inférence vidéo sur le terminal à l'aide de sixel ?

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

Comment puis-je résoudre les problèmes avec le python-sixel bibliothèque ?

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

  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 nécessaires à Python et au système.

  3. Reporte-toi au dépôt GitHubpython -sixel pour obtenir de la documentation supplémentaire et l'aide de la communauté.

  4. Vérifie deux fois que ton code ne contient pas d'erreurs potentielles, en particulier l'utilisation de SixelWriter et les étapes de conversion des données d'image.

Pour plus d'aide sur le travail avec les modèles YOLO et l'intégration de sixel, voir les pages de documentation sur l'exportation et le mode prédictif.



Créé le 2024-03-09, Mis à jour le 2024-07-05
Auteurs : glenn-jocher (6), IvorZhu331 (1), Burhan-Q (1)

Commentaires