Como visualizar resultados de inferência do YOLO no terminal do VSCode#
Imagem do site do libsixel.
Motivação#
Ao conectar a uma máquina remota via SSH, visualizar resultados de imagem normalmente não é possível ou exige mover dados para um dispositivo local com interface gráfica. O terminal integrado do VSCode pode renderizar imagens diretamente, para que possas inspecionar os resultados de previsão exatamente onde executas a inferência, sem copiar ficheiros de volta para o teu portátil. Este guia percorre a ativação da configuração, a ligação do código e responde a perguntas comuns.
Apenas compatível com Linux e macOS. Consulta o repositório do VSCode, verifica o estado do problema ou a documentação para atualizações sobre o suporte ao Windows para ver imagens no terminal com sixel.
Os protocolos compatíveis com o VSCode para visualizar imagens utilizando o terminal integrado são sixel e iTerm. Este guia demonstrará a utilização do protocolo sixel.
Processo#
-
Primeiro, deves 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 (fork) da bibliotecaPySixel, que já não é mantida.pip install sixel -
Carrega um modelo e executa a inferência, depois plota os resultados e armazena-os numa variável. Vê mais sobre os argumentos de inferência e como trabalhar com resultados na página do modo predict.
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 parâmetros do método plot para ver os argumentos possíveis a utilizar.
-
Agora, utiliza o OpenCV para converter os dados de
np.ndarrayparabytes. Em seguida, utilizaio.BytesIOpara criar um objeto "semelhante a um ficheiro" (file-like).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)- É possível usar outras extensões de imagem também.
- Apenas o objeto no índice
1que é devolvido é necessário.
-
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#
O uso deste exemplo com vídeos ou frames de GIF animados não foi testado. Tente por sua própria conta e risco.
Exemplo 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)- É possível usar outras extensões de imagem também.
- Apenas o objeto no índice
1que é devolvido é necessário. - Consulta parâmetros do método plot para ver os argumentos possíveis a utilizar.
Poderás precisar de usar clear para "apagar" a visualização da imagem no terminal.
FAQ#
Para visualizar resultados de inferência do YOLO em um terminal do VSCode no macOS ou Linux, siga estes passos:
-
Habilite as configurações necessárias do VSCode:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Instale a biblioteca sixel:
pip install sixel -
Carregue seu modelo YOLO e execute a inferência:
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.predict(source="ultralytics/assets/bus.jpg") plot = results[0].plot() -
Converta a imagem do resultado da inferência para bytes e exiba-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 mais detalhes, visita a página do modo predict.
-
O protocolo sixel é atualmente suportado apenas em Linux e macOS porque estas plataformas possuem 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 atualizações sobre a compatibilidade com o Windows, verifica o estado dos problemas do VSCode e a documentação.
Se nada for renderizado, siga estas verificações em ordem:
- Confirma que tanto
terminal.integrated.enableImagescomoterminal.integrated.gpuAccelerationestão ativados, conforme mostrado na secção Processo, e reinicia o terminal integrado para que as definições façam 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 codificar, uma vez quecv2.imencodegera um erro se a imagem estiver vazia ou não for uma matriz válida. Consulta os parâmetros do método plot para saber quais os valores queresults[0].plot()aceita.
Se os problemas persistirem, consulta o repositório do VSCode para ver o estado do suporte de imagens no terminal.
- Confirma que tanto
A exibição de resultados de inferência de vídeo ou fotogramas de GIF animados utilizando sixel no terminal não foi testada atualmente e pode não ser suportada. Recomendamos começar com imagens estáticas e verificar a compatibilidade. Tenta obter resultados em vídeo por tua conta e risco, tendo em mente as restrições de desempenho. Para mais informações sobre a plotagem de resultados de inferência, visita a página do modo predict.
O pacote
sixelé uma derivação (fork) da biblioteca não mantidaPySixele é um pequeno wrapper em Python sobre Pillow (PIL). Seimport sixelfalhar ouSixelWriter().draw()gerar um erro, confirma que o pacote foi 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 notas específicas da plataforma. Para saberes mais sobre a geração da imagem que passas paradraw(), consulta a documentação do modo predict.