Como ver resultados de inferência do YOLO num terminal do VSCode#
Imagem do site do libsixel.
Motivação#
Ao ligares-te a uma máquina remota através de SSH, normalmente não é possível visualizar imagens, ou é necessário transferir os dados para um dispositivo local com uma interface gráfica. O terminal integrado do VSCode pode renderizar imagens diretamente, permitindo-te inspecionar os resultados das predições no mesmo local onde executas a inferência, sem copiares ficheiros de volta para o teu computador portátil. Este guia explica como ativar a configuração, integrar o código e responde a perguntas comuns.
Compatível apenas com Linux e macOS. Consulta o repositório do VSCode, verifica o estado do problema ou consulta a documentação para obter atualizações sobre o suporte do Windows para visualização de imagens no terminal com sixel.
Os protocolos compatíveis com o VSCode para visualizar imagens através do terminal integrado são sixel e iTerm. Este guia demonstra a utilização do protocolo sixel.
Processo#
-
Primeiro, tens de ativar as definições
terminal.integrated.enableImageseterminal.integrated.gpuAccelerationno VSCode."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Instala a biblioteca
python-sixelno teu ambiente virtual. Esta é uma derivação da bibliotecaPySixel, que já não é mantida.pip install sixel -
Carrega um modelo e executa a inferência; em seguida, representa graficamente os resultados e guarda-os numa variável. Consulta a página do modo predict para saberes mais sobre os argumentos de inferência e como trabalhar com 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)!- Consulta os parâmetros do método plot para veres os possíveis argumentos a utilizar.
-
Agora, utiliza o OpenCV para converter
np.ndarrayem dadosbytes. Em seguida, utilizaio.BytesIOpara criar um objeto "semelhante a um ficheiro".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)- Também é possível utilizar outras extensões de imagem.
- Só é necessário o objeto devolvido no índice
1.
-
Cria uma instância de
SixelWritere, em seguida, utiliza o método.draw()para desenhar a imagem no terminal.from sixel import SixelWriter # Create sixel writer object w = SixelWriter() # Draw the sixel image in the terminal w.draw(mem_file)
Exemplo de resultados de inferência#
A utilização deste exemplo com vídeos ou fotogramas de GIFs animados não foi testada. Tenta por tua conta e risco.
Exemplo completo de código#
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)- Também é possível utilizar outras extensões de imagem.
- Só é necessário o objeto devolvido no índice
1. - Consulta os parâmetros do método plot para veres os possíveis argumentos a utilizar.
Poderá ser necessário utilizar clear para "apagar" a visualização da imagem no terminal.
Perguntas frequentes#
Para veres os resultados de inferência do YOLO num terminal do VSCode no macOS ou Linux, segue estes passos:
-
Ativa as definições necessárias do VSCode:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Instala a biblioteca sixel:
pip install sixel -
Carrega o teu modelo YOLO e executa a inferência:
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.predict(source="ultralytics/assets/bus.jpg") plot = results[0].plot() -
Converte a imagem do resultado da inferência em bytes e apresenta-a no 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 obteres mais detalhes, visita a página do modo predict.
-
Atualmente, o protocolo sixel só é compatível com Linux e macOS porque estas plataformas têm capacidades nativas de terminal compatíveis com gráficos sixel. O suporte do Windows para gráficos de terminal utilizando sixel ainda está em desenvolvimento. Para obteres atualizações sobre a compatibilidade com o Windows, consulta o estado do problema do VSCode e a documentação.
Se nada for renderizado, executa estas verificações pela ordem indicada:
- Confirma que
terminal.integrated.enableImageseterminal.integrated.gpuAccelerationestão ativados, conforme mostrado na secção Processo, e reinicia o terminal integrado para que as definições tenham efeito. - Verifica se
sixelestá instalado no mesmo ambiente virtual em que o teu script é executado (pip install sixel). - Certifica-te de que
ploté umnp.ndarrayválido antes de o codificares, uma vez quecv2.imencodegera um erro se a imagem estiver vazia ou não for um array válido. Consulta os parâmetros do método plot para veres os valores aceites porresults[0].plot().
Se os problemas persistirem, consulta o repositório do VSCode para verificar o estado do suporte de imagens no terminal.
- Confirma que
A apresentação de resultados de inferência de vídeo ou de fotogramas de GIFs animados utilizando sixel no terminal ainda não foi testada e poderá não ser suportada. Recomendamos começar com imagens estáticas e verificar a compatibilidade. Experimenta resultados de vídeo por tua conta e risco, tendo em conta as limitações de desempenho. Para obteres mais informações sobre a representação gráfica de resultados de inferência, visita a página do modo predict.
O pacote
sixelé uma derivação da bibliotecaPySixel, que não é mantida, e é um wrapper Python simples sobre o Pillow (PIL). Seimport sixelfalhar ouSixelWriter().draw()gerar um erro, confirma que o pacote está instalado no teu ambiente virtual ativo, certifica-te de que o Pillow está disponível e consulta o repositório do python-sixel no GitHub para obteres notas específicas da plataforma. Para saberes mais sobre como gerar a imagem que passas adraw(), consulta a documentação do modo predict.