Ir al contenido

Visualización de los resultados de la inferencia en una terminal

Ejemplo de Sixel de imagen en Terminal

Imagen del sitio web de libsixel.

Motivación

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

Advertencia

Solo compatible con Linux y MacOS. Consulte el repositorio de VSCode, consulte el estado del problema, o documentación para obtener actualizaciones sobre la compatibilidad con Windows para ver imágenes en la terminal con sixel.

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

Proceso

  1. Primero, debe habilitar la configuración terminal.integrated.enableImages y terminal.integrated.gpuAcceleration en VSCode.

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

    Ajuste de VSCode para habilitar imágenes en la terminal

  2. Instale el python-sixel biblioteca en su entorno virtual. Esta es una bifurcación de la PySixel biblioteca, que ya no se mantiene.

    pip install sixel
    
  3. Cargue un modelo y ejecute la inferencia, luego trace los resultados y guárdelos en una variable. Consulte más información sobre los argumentos de inferencia y cómo trabajar con los resultados en la página del modo 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. Consulte los parámetros del método plot para ver los posibles argumentos que puede utilizar.
  4. Ahora, use OpenCV para convertir los np.ndarray a datos bytes datos. Luego, use io.BytesIO para crear un objeto "tipo 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. Solo se necesita el objeto en el índice 1 que se devuelve.
  5. Crea un SixelWriter y luego use el método .draw() para dibujar la imagen en la 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 la terminal

Peligro

El uso de este ejemplo con vídeos o fotogramas GIF animados no se ha probado. Inténtelo bajo su propio riesgo.

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. Solo se necesita el objeto en el índice 1 que se devuelve.
  3. Consulte los parámetros del método plot para ver los posibles argumentos que puede utilizar.

Consejo

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

Preguntas frecuentes

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

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

  1. Habilite la configuración necesaria de VSCode:

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

    pip install sixel
    
  3. Cargue su modelo YOLO y ejecute la inferencia:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
    
  4. Convierta la imagen del resultado de la inferencia a bytes y muéstrela en la 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 obtener más detalles, visite la página del modo predict.

¿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 con gráficos de terminal mediante sixel aún está en desarrollo. Para obtener actualizaciones sobre la compatibilidad con Windows, consulte el estado del problema en VSCode y la documentación.

¿Qué ocurre si tengo problemas para mostrar imágenes en la terminal de VSCode?

Si tiene problemas para mostrar imágenes en la terminal de VSCode usando sixel:

  1. Asegúrese de que la configuración necesaria en VSCode esté habilitada:

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

    pip install sixel
    
  3. Compruebe 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, consulte el repositorio de VSCode y visite la sección de parámetros del método plot para obtener orientación adicional.

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

La visualización de resultados de inferencia de video o fotogramas GIF animados mediante sixel en la terminal no se ha probado actualmente y puede no ser compatible. Recomendamos comenzar con imágenes estáticas y verificar la compatibilidad. Intente obtener resultados de video bajo su propio riesgo, teniendo en cuenta las limitaciones de rendimiento. Para obtener más información sobre el trazado de resultados de inferencia, visite la página del modo predict.

¿Cómo puedo solucionar problemas con la python-sixel librería?

Para solucionar problemas con la python-sixel librería:

  1. Asegúrese de que la librería esté correctamente instalada en su entorno virtual:

    pip install sixel
    
  2. Verifique que tiene las dependencias necesarias de python y del sistema.

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

  4. Revise su 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 de sixel, consulte las páginas de documentación de export y modo predict.



📅 Creado hace 1 año ✏️ Actualizado hace 1 mes

Comentarios