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 transferir los datos a un dispositivo local con interfaz gráfica. El terminal integrado de VSCode puede mostrar imágenes directamente, así que puedes inspeccionar los resultados de predicción justo donde ejecutas la inferencia, sin copiar archivos a tu portátil. Esta guía explica cómo activar la configuración, integrar el código y responde a las preguntas frecuentes.
Solo es compatible con Linux y macOS. Consulta el repositorio de VSCode, el estado de la incidencia o la documentación para conocer las novedades sobre la compatibilidad con Windows para ver imágenes en el terminal con sixel.
Los protocolos compatibles con VSCode para ver imágenes en el terminal integrado son sixel y iTerm. En esta guía se muestra cómo usar el protocolo sixel.
Procedimiento#
-
Primero, debes activar los ajustes
terminal.integrated.enableImagesyterminal.integrated.gpuAccelerationen VSCode."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Instala la biblioteca
python-sixelen tu entorno virtual. Es una bifurcación de la bibliotecaPySixel, cuyo mantenimiento se ha abandonado.pip install sixel -
Carga un modelo y ejecuta la inferencia; después, representa los resultados gráficamente y guárdalos en una variable. Encontrarás más información sobre los argumentos de inferencia y el trabajo con resultados en la página del modo de predicción.
from ultralytics import YOLO # Cargar un modelo model = YOLO("yolo26n.pt") # Ejecuta la inferencia en una imagen results = model.predict(source="https://ultralytics.com/images/bus.jpg") # Representar gráficamente los resultados de inferencia plot = results[0].plot() # (1)!- Consulta los parámetros del método plot para ver los argumentos que puedes usar.
-
Ahora, usa OpenCV para convertir los datos
np.ndarrayenbytes. Después, usaio.BytesIOpara crear un objeto «similar a un archivo».import io import cv2 # Imagen de los resultados en bytes im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # Bytes de imagen como objeto similar a un archivo mem_file = io.BytesIO(im_bytes)- También puedes usar otras extensiones de imagen.
- Solo se necesita el objeto devuelto en el índice
1.
-
Crea una instancia de
SixelWritery, después, usa el método.draw()para dibujar la imagen en el terminal.from sixel import SixelWriter # Crear un objeto escritor de sixel w = SixelWriter() # Dibujar la imagen sixel en el terminal w.draw(mem_file)
Ejemplos de resultados de inferencia#
No se ha probado el uso de este ejemplo con vídeos o fotogramas de GIF animados. Úsalo bajo tu responsabilidad.
Ejemplo de código completo#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# Cargar un modelo
model = YOLO("yolo26n.pt")
# Ejecuta la inferencia en una imagen
results = model.predict(source="https://ultralytics.com/images/bus.jpg")
# Representar gráficamente los resultados de inferencia
plot = results[0].plot() # (3)!
# Imagen de los resultados en bytes
im_bytes = cv2.imencode(
".png", # (1)!
plot,
)[1].tobytes() # (2)!
mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)- También puedes usar otras extensiones de imagen.
- Solo se necesita el objeto devuelto en el índice
1. - Consulta los parámetros del método plot para ver los argumentos que puedes usar.
Puede que tengas que usar clear para «borrar» la imagen que se muestra 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:
-
Activa los ajustes necesarios de VSCode:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Instala la biblioteca sixel:
pip install sixel -
Carga tu modelo YOLO y ejecuta la inferencia:
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.predict(source="https://ultralytics.com/images/bus.jpg") plot = results[0].plot() -
Convierte la imagen del resultado de 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 detalles, visita la página del modo de predicción.
-
Actualmente, el protocolo sixel solo es compatible con Linux y macOS porque estas plataformas cuentan con capacidades nativas de terminal compatibles con los gráficos sixel. La compatibilidad de Windows con los gráficos de terminal mediante sixel aún está en desarrollo. Para conocer las novedades sobre la compatibilidad con Windows, consulta el estado de la incidencia de VSCode y la documentación.
Si no se muestra nada, realiza estas comprobaciones en orden:
- Comprueba que estén activados tanto
terminal.integrated.enableImagescomoterminal.integrated.gpuAcceleration, tal como se indica en la sección Procedimiento, y reinicia el terminal integrado para que se apliquen los ajustes. - Comprueba que
sixelesté instalado en el mismo entorno virtual en el que se ejecuta el script (pip install sixel). - Asegúrate de que
plotsea unnp.ndarrayválido antes de codificarlo, ya quecv2.imencodegenera 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 qué valores aceptaresults[0].plot().
Si el problema persiste, consulta el repositorio de VSCode para conocer el estado de la compatibilidad con imágenes en el terminal.
- Comprueba que estén activados tanto
Actualmente, no se ha probado la visualización de resultados de inferencia de vídeo ni de fotogramas de GIF animados mediante sixel en el terminal, y es posible que no sea compatible. Te recomendamos empezar con imágenes estáticas y comprobar la compatibilidad. Prueba los resultados de vídeo bajo tu responsabilidad y ten en cuenta las limitaciones de rendimiento. Para obtener más información sobre la representación gráfica de los resultados de inferencia, visita la página del modo de predicción.
El paquete
sixeles una bifurcación de la bibliotecaPySixel, cuyo mantenimiento se ha abandonado, y es un envoltorio ligero de Python para Pillow (PIL). Siimport sixelfalla oSixelWriter().draw()genera un error, comprueba que el paquete esté instalado en el entorno virtual activo, asegúrate de que Pillow esté disponible y consulta el repositorio de python-sixel en GitHub para ver las notas específicas de cada plataforma. Para obtener más información sobre cómo generar la imagen que pasas adraw(), consulta la documentación del modo de predicción.