Passer au contenu

Affichage des résultats d'inférence dans un terminal

Exemple Sixel d'une image dans le Terminal

Image du site web libsixel.

Motivation

Lors de la connexion à une machine distante, la visualisation des résultats d'image n'est normalement pas possible ou nécessite le déplacement des données vers un appareil local avec une interface graphique. Le terminal intégré VSCode permet de rendre directement les images. Voici une courte démonstration de la façon d'utiliser ceci en conjonction avec ultralytics avec résultats de la prédiction.

Avertissement

Compatible uniquement avec Linux et MacOS. Vérifiez le Référentiel VSCode, vérifier État du problème, ou documentation pour les mises à jour concernant la prise en charge de Windows pour afficher les images dans le terminal avec sixel.

Les protocoles compatibles VSCode pour visualiser les images à l'aide du terminal intégré sont sixel et iTerm. Ce guide démontrera l'utilisation du sixel protocole.

Processus

  1. Tout d'abord, vous devez 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
    

    Paramètre VSCode pour activer les images du terminal

  2. Installez le python-sixel bibliothèque dans votre environnement virtuel. Il s'agit d'une fork du PySixel bibliothèque, qui n'est plus maintenue.

    pip install sixel
    
  3. Chargez un modèle et exécutez l'inférence, puis tracez les résultats et stockez-les dans une variable. Pour en savoir plus sur les arguments d'inférence et l'utilisation des résultats, consultez la page du mode predict.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo11n.pt")
    
    # Run inference on an image
    results = model.predict(source="ultralytics/assets/bus.jpg")
    
    # Plot inference results
    plot = results[0].plot()  # (1)!
    
    1. Consultez les paramètres de la méthode plot pour voir les arguments possibles à utiliser.
  4. Maintenant, utilisez module DNN d'OpenCV pour convertir le np.ndarray à bytes data. Puis utilisez 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. Il est également possible d'utiliser d'autres extensions d'image.
    2. Seul l'objet à l'index 1 qui est renvoyé est nécessaire.
  5. Créer un fichier SixelWriter instance, puis utilisez le .draw() méthode 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. Tentez-le à vos propres risques.

Exemple de code complet

import io

import cv2
from sixel import SixelWriter

from ultralytics import YOLO

# Load a model
model = YOLO("yolo11n.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 qui est renvoyé est nécessaire.
  3. Consultez les paramètres de la méthode plot pour voir les arguments possibles à utiliser.

Astuce

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

FAQ

Comment puis-je afficher 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 sous macOS ou Linux, suivez ces étapes :

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

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

    pip install sixel
    
  3. Chargez votre modèle YOLO et exécutez l'inférence :

    from ultralytics import YOLO
    
    model = YOLO("yolo11n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
    
  4. Convertir l'image du résultat de l'inférence en octets et l'afficher 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, consultez la page du mode predict.

Pourquoi le protocole sixel ne fonctionne-t-il que sous 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 cours de développement. Pour les mises à jour sur la compatibilité Windows, consultez l'état du problème VSCode et la documentation.

Que faire si je rencontre des problèmes d’affichage des images dans le terminal VSCode ?

Si vous rencontrez des problèmes d'affichage d'images dans le terminal VSCode à l'aide de sixel :

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

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

    pip install sixel
    
  3. Vérifiez votre code de conversion et de traçage des données d'image pour détecter les erreurs. 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, consultez le référentiel VSCode, et consultez la section paramètres de la méthode plot pour obtenir des conseils supplémentaires.

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

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

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

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

  1. Assurez-vous que la bibliothèque est correctement installée dans votre environnement virtuel :

    pip install sixel
    
  2. Vérifiez que vous disposez des dépendances Python et système nécessaires.

  3. Consultez le dépôt GitHub python-sixel pour obtenir de la documentation supplémentaire et un support communautaire.

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

Pour obtenir une aide supplémentaire sur l'utilisation des modèles YOLO et l'intégration de sixel, consultez les pages de documentation export et mode predict.



📅 Créé il y a 1 an ✏️ Mis à jour il y a 1 mois

Commentaires