Visualización de resultados de inferencia en un terminal

Sixel example of image in Terminal

Imagen del sitio web de libsixel.

Motivación

Al conectar a una máquina remota, normalmente la visualización de los resultados de imágenes no es posible o requiere mover los datos a un dispositivo local con interfaz gráfica (GUI). El terminal integrado de VSCode permite renderizar imágenes directamente. Esta es una breve demostración de cómo utilizar esto junto con ultralytics con resultados de predicción.

Advertencia

Solo es compatible con Linux y MacOS. Consulta el repositorio de VSCode, comprueba el estado de la incidencia o la documentación para obtener actualizaciones sobre la compatibilidad con Windows para ver imágenes en el terminal con sixel.

Los protocolos compatibles con VSCode para visualizar imágenes usando el terminal integrado son sixel e iTerm. Esta guía demostrará el uso del protocolo sixel.

Proceso

  1. Primero, debes habilitar los ajustes terminal.integrated.enableImages y terminal.integrated.gpuAcceleration en VSCode.

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

    VSCode enable terminal images setting

  2. Instala la biblioteca python-sixel en tu entorno virtual. Este es un fork de la biblioteca PySixel, que ya no recibe mantenimiento.

    pip install sixel
  3. Carga un modelo y ejecuta la inferencia, luego grafica los resultados y almacénalos en una variable. Consulta más información sobre los argumentos de inferencia y cómo trabajar con resultados en la página de modo de predicción.

    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. Consulta los parámetros del método plot para ver los argumentos que puedes usar.
  4. Ahora, usa OpenCV para convertir el np.ndarray a datos de tipo bytes. Luego, usa io.BytesIO para crear un objeto "similar a un archivo".

    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. Es posible usar también otras extensiones de imagen.
    2. Solo es necesario el objeto en el índice 1 que se devuelve.
  5. Crea una instancia de SixelWriter y, a continuación, utiliza el método .draw() para dibujar la imagen en el terminal.

    from sixel import SixelWriter
    
    # Create sixel writer object
    w = SixelWriter()
    
    # Draw the sixel image in the terminal
    w.draw(mem_file)

Ejemplo de resultados de inferencia

YOLO inference results displayed in terminal

Peligro

El uso de este ejemplo con vídeos o fotogramas de GIF animados no ha sido probado. Hazlo bajo tu propia responsabilidad.

Ejemplo de código completo

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. Es posible usar también otras extensiones de imagen.
  2. Solo es necesario el objeto en el índice 1 que se devuelve.
  3. Consulta los parámetros del método plot para ver los argumentos que puedes usar.

Consejo

Es posible que necesites usar clear para "borrar" la vista de la imagen en el terminal.

Preguntas frecuentes

¿Cómo puedo ver los resultados de la inferencia de YOLO en un terminal de VSCode en macOS o Linux?

Para ver los resultados de la inferencia de YOLO en un terminal de VSCode en macOS o Linux, sigue estos pasos:

  1. Habilita los ajustes necesarios en VSCode:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Instala la biblioteca sixel:

    pip install sixel
  3. Carga tu modelo YOLO y ejecuta la inferencia:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
  4. Convierte la imagen del resultado de la inferencia a bytes y muéstrala en el 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)

Para más detalles, visita la página de modo de predicción.

¿Por qué el protocolo sixel solo funciona en Linux y macOS?

El protocolo sixel actualmente solo es compatible con Linux y macOS porque estas plataformas tienen capacidades de terminal nativas compatibles con gráficos sixel. La compatibilidad de Windows para gráficos en terminal mediante sixel sigue en desarrollo. Para obtener actualizaciones sobre la compatibilidad con Windows, consulta el estado de la incidencia en VSCode y la documentación.

¿Qué ocurre si encuentro problemas al mostrar imágenes en el terminal de VSCode?

Si encuentras problemas al mostrar imágenes en el terminal de VSCode usando sixel:

  1. Asegúrate de que los ajustes necesarios en VSCode estén habilitados:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Verifica la instalación de la biblioteca sixel:

    pip install sixel
  3. Revisa si hay errores en tu código de conversión de datos de imagen y trazado. Por ejemplo:

    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 los problemas persisten, consulta el repositorio de VSCode y visita la sección de parámetros del método plot para obtener orientación adicional.

¿Puede YOLO mostrar resultados de inferencia de vídeo en el terminal usando sixel?

Mostrar resultados de inferencia de vídeo o fotogramas GIF animados usando sixel en el terminal no ha sido probado actualmente y puede no ser compatible. Recomendamos comenzar con imágenes estáticas y verificar la compatibilidad. Intenta obtener resultados de vídeo bajo tu propia responsabilidad, teniendo en cuenta las limitaciones de rendimiento. Para más información sobre cómo trazar los resultados de la inferencia, visita la página de modo de predicción.

¿Cómo puedo solucionar problemas con la biblioteca python-sixel?

Para solucionar problemas con la biblioteca python-sixel:

  1. Asegúrate de que la biblioteca esté correctamente instalada en tu entorno virtual:

    pip install sixel
  2. Verifica que tienes las dependencias necesarias de Python y del sistema.

  3. Consulta el repositorio de GitHub de python-sixel para obtener documentación adicional y soporte de la comunidad.

  4. Vuelve a comprobar tu código en busca de posibles errores, específicamente el uso de SixelWriter y los pasos de conversión de datos de imagen.

Para obtener más ayuda sobre cómo trabajar con modelos YOLO y la integración sixel, consulta las páginas de documentación de exportación y modo de predicción.

Comentarios