Ultralytics YOLO27:

Cómo ver los resultados de inferencia de YOLO en un terminal de VSCode#

Imagen del sitio web de libsixel.

Motivación#

Al conectarte a una máquina remota mediante SSH, normalmente no es posible visualizar imágenes o es necesario trasladar los datos a un dispositivo local con una interfaz gráfica. El terminal integrado de VSCode puede renderizar imágenes directamente, por lo que puedes inspeccionar los resultados de predicción justo donde ejecutas la inferencia, sin copiar los archivos de vuelta a tu portátil. Esta guía explica cómo habilitar la configuración, integrar el código y responde a preguntas frecuentes.

Solo Linux y macOS

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

Los protocolos compatibles con VSCode para ver imágenes mediante el terminal integrado son sixel y iTerm. En esta guía se 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. Es un fork de la biblioteca PySixel, que ya no recibe mantenimiento.

    pip install sixel
  3. Carga un modelo y ejecuta la inferencia; después, representa gráficamente los resultados y guárdalos en una variable. Consulta la página de modo de predicción para obtener más información sobre los argumentos de inferencia y el trabajo con resultados.

    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 posibles argumentos que puedes utilizar.
  4. Ahora, usa OpenCV para convertir np.ndarray en datos bytes. Después, 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. También puedes usar otras extensiones de imagen.
    2. Solo necesitas el objeto devuelto en el índice 1.
  5. Crea una instancia de SixelWriter y, después, usa 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

Vídeos y GIF no probados

El uso de este ejemplo con vídeos o fotogramas de GIF animados no se ha 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. También puedes usar otras extensiones de imagen.
  2. Solo necesitas el objeto devuelto en el índice 1.
  3. Consulta los parámetros del método plot para ver los posibles argumentos que puedes utilizar.
Borrar la imagen

Puede que tengas que usar clear para «borrar» la vista de la imagen en el terminal.

Preguntas frecuentes#

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

    1. Habilita los ajustes necesarios de 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="ultralytics/assets/bus.jpg")
      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 obtener más información, visita la página de modo de predicción.

  • Actualmente, el protocolo sixel solo es compatible con Linux y macOS porque estas plataformas cuentan con funciones nativas del terminal compatibles con los gráficos sixel. La compatibilidad de Windows con los gráficos del terminal mediante sixel todavía está en desarrollo. Para consultar las novedades sobre la compatibilidad con Windows, revisa el estado de la incidencia de VSCode y la documentación.

  • Si no se renderiza nada, realiza estas comprobaciones en orden:

    1. Confirma que terminal.integrated.enableImages y terminal.integrated.gpuAcceleration están habilitados, tal como se muestra en la sección Proceso, y después reinicia el terminal integrado para que los ajustes surtan efecto.
    2. Verifica que sixel está instalado en el mismo entorno virtual en el que se ejecuta tu script (pip install sixel).
    3. Asegúrate de que plot es un np.ndarray válido antes de codificarlo, ya que cv2.imencode genera un error si la imagen está vacía o no es una matriz válida. Consulta los parámetros del método plot para ver los valores que acepta results[0].plot().

    Si los problemas persisten, consulta el repositorio de VSCode para conocer el estado de la compatibilidad con imágenes en el terminal.

  • Actualmente, no se ha probado la visualización de resultados de inferencia de vídeo o de fotogramas de GIF animados mediante sixel en el terminal, por lo que puede que no sea compatible. Te recomendamos empezar con imágenes estáticas y verificar la compatibilidad. Prueba los resultados de vídeo bajo tu propia responsabilidad y ten en cuenta las limitaciones de rendimiento. Para obtener más información sobre la representación gráfica de resultados de inferencia, visita la página de modo de predicción.

  • El paquete sixel es un fork de la biblioteca PySixel, que ya no recibe mantenimiento, y es un envoltorio fino de Python sobre Pillow (PIL). Si import sixel falla o SixelWriter().draw() genera un error, confirma que el paquete está instalado en tu entorno virtual activo, asegúrate de que Pillow está disponible y consulta el repositorio de GitHub de python-sixel para obtener notas específicas de cada plataforma. Para obtener más información sobre cómo generar la imagen que pasas a draw(), consulta la documentación del modo de predicción.

Comentarios