Visualizando resultados de inferência em um terminal
Imagem do sítio Web da libsixel.
Motivação
Quando te ligas a uma máquina remota, normalmente não é possível visualizar os resultados da imagem ou é necessário mover os dados para um dispositivo local com uma GUI. O terminal integrado VSCode permite a renderização direta de imagens. Esta é uma breve demonstração de como usá-lo em conjunto com o ultralytics
com resultados das previsões.
Aviso
Apenas compatível com Linux e MacOS. Verifica o código VSC repositório, verifica Estado da questão, ou documentação para obter actualizações sobre o suporte do Windows para ver imagens no terminal com sixel
.
Os protocolos compatíveis com VSCode para visualizar imagens utilizando o terminal integrado são sixel
e iTerm
. Este guia irá demonstrar a utilização do sixel
protocolo.
Processo
-
Primeiro, tens de ativar as definições
terminal.integrated.enableImages
eterminal.integrated.gpuAcceleration
no VSCode.
-
Instala o
python-sixel
no teu ambiente virtual. Este é um garfo doPySixel
que já não é mantida. -
Importar as bibliotecas relevantes
-
Carrega um modelo e executa a inferência, depois traça os resultados e armazena-os numa variável. Vê mais sobre argumentos de inferência e como trabalhar com resultados na página do modo de previsão.
from ultralytics import YOLO # Load a model model = YOLO("yolov8n.pt") # Run inference on an image results = model.predict(source="ultralytics/assets/bus.jpg") # Plot inference results plot = results[0].plot() #(1)!
- Vê os parâmetros do método plot para veres os argumentos possíveis a utilizar.
-
Agora, utiliza o OpenCV para converter o
numpy.ndarray
parabytes
dados. Depois utilizaio.BytesIO
para criar um objeto "tipo ficheiro".# Results image as bytes im_bytes = cv.imencode( ".png", #(1)! plot, )[1].tobytes() #(2)! # Image bytes as a file-like object mem_file = io.BytesIO(im_bytes)
- Também é possível utilizar outras extensões de imagem.
- Apenas o objeto no índice
1
que te é devolvido é necessário.
-
Cria um
SixelWriter
e depois usa a instância.draw()
para desenhares a imagem no terminal.
Exemplo de resultados de inferência
Perigo
A utilização deste exemplo com vídeos ou quadros GIF animados não foi testada. Tenta por tua conta e risco.
Exemplo de código completo
import io
import cv2 as cv
from ultralytics import YOLO
from sixel import SixelWriter
# Load a model
model = YOLO("yolov8n.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 = cv.imencode(
".png", #(1)!
plot,
)[1].tobytes() #(2)!
mem_file = io.BytesIO(im_bytes)
w = SixelWriter()
w.draw(mem_file)
- Também é possível utilizar outras extensões de imagem.
- Apenas o objeto no índice
1
que te é devolvido é necessário. - Vê os parâmetros do método plot para veres os argumentos possíveis a utilizar.
Dica
Podes ter de utilizar clear
para "apagar" a visualização da imagem no terminal.