Saltar al contenido

Ver los resultados de la inferencia en un terminal

Sixel ejemplo de imagen en Terminal

Imagen de la web libsixel.

Motivación

Cuando te conectas a una máquina remota, normalmente no es posible visualizar los resultados de las imágenes o es necesario trasladar los datos a un dispositivo local con una interfaz gráfica de usuario. El terminal integrado VSCode permite visualizar directamente las imágenes. Ésta es una breve demostración de cómo utilizarlo junto con ultralytics con resultados de la predicción.

Advertencia

Sólo compatible con Linux y MacOS. Comprueba Repositorio VSCodeComprueba Estado de la cuestióno documentación para actualizaciones sobre la compatibilidad con Windows para ver imágenes en el terminal con sixel.

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

Proceso

  1. Primero, debes activar 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": false
    

    VSCode habilita el ajuste de las imágenes del terminal

  2. Instala el python-sixel en tu entorno virtual. Se trata de un horquilla de la PySixel que ya no se mantiene.

    pip install sixel
    
  3. Carga un modelo y ejecuta la inferencia, luego traza los resultados y almacénalos en una variable. Consulta más información sobre los argumentos de inferencia y el trabajo con los resultados en la página del modo Predecir.

    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. Consulta los parámetros del método de trazado para ver los posibles argumentos a utilizar.
  4. Now, use OpenCV to convert the numpy.ndarray a bytes datos. A continuación, utiliza io.BytesIO para hacer 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. También es posible utilizar otras extensiones de imagen.
    2. Sólo el objeto del índice 1 que se devuelve es necesario.
  5. Crea una SixelWriter y luego utiliza la función .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

Ver imagen en el terminal

Peligro

No se ha probado la utilización de este ejemplo con vídeos o fotogramas GIF animados. Inténtalo 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("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. También es posible utilizar otras extensiones de imagen.
  2. Sólo el objeto del índice 1 que se devuelve es necesario.
  3. Consulta los parámetros del método de trazado para ver los posibles argumentos a utilizar.

Consejo

Puede que necesites utilizar clear para "borrar" la vista de la imagen en el terminal.

PREGUNTAS FRECUENTES

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

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

  1. Activa los ajustes VSCode necesarios:

    "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("yolo11n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
    
  4. Convierte la imagen del resultado de la inferencia en 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 del modo predecir.

¿Por qué el protocolo sixel sólo funciona en Linux y macOS?

Actualmente, el protocolo sixel sólo es compatible con Linux y macOS porque estas plataformas tienen capacidades de terminal nativas compatibles con los gráficos sixel. La compatibilidad de Windows con gráficos de terminal utilizando sixel está aún en desarrollo. Para obtener información actualizada sobre la compatibilidad con Windows, consulta el estado y la documentación de VSCode Issue.

¿Qué pasa si tengo problemas con la visualización de imágenes en el terminal VSCode?

Si tienes problemas para mostrar imágenes en el terminal VSCode utilizando sixel:

  1. Asegúrate de que están activados los ajustes necesarios en VSCode:

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

    pip install sixel
    
  3. Comprueba si hay errores en la conversión de datos de imagen y en el código de 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 VSCode, y visita la sección de parámetros del método de trazado para obtener orientación adicional.

¿Puede YOLO mostrar los resultados de la inferencia de vídeo en el terminal utilizando sixel?

La visualización de resultados de inferencia de vídeo o de fotogramas GIF animados utilizando sixel en el terminal no se ha probado actualmente y puede que no sea compatible. Recomendamos empezar 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 el trazado de resultados de inferencia, visita la página del modo predecir.

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

Para solucionar problemas con el python-sixel biblioteca:

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

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

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

  4. Comprueba dos veces tu código en busca de posibles errores, concretamente el uso de SixelWriter y pasos de conversión de datos de imagen.

Para obtener más ayuda sobre el trabajo con los modelos YOLO y la integración de sixel, consulta las páginas de documentación de los modos exportar y predecir.

📅 C reado hace 8 meses ✏️ Actualizado hace 1 mes

Comentarios