Como ver os resultados da inferência do YOLO num terminal do VSCode#
Imagem do site libsixel.
Motivação#
Quando te ligas a uma máquina remota por SSH, normalmente não é possível visualizar os resultados das imagens ou é necessário transferir os dados para um dispositivo local com interface gráfica. O terminal integrado do VSCode pode renderizar imagens diretamente, para que possas inspecionar os resultados da predição exatamente onde executas a inferência, sem copiar ficheiros de volta para o teu portátil. Este guia explica como ativar a configuração, integrar o código e responde a perguntas frequentes.
Compatível apenas com Linux e macOS. Consulta o repositório do VSCode, verifica o estado da issue ou consulta a documentação para obter atualizações sobre o suporte ao Windows para ver imagens no terminal com sixel.
Os protocolos compatíveis com o VSCode para ver imagens no terminal integrado são sixel e iTerm. Este guia demonstra como usar o 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. É um fork da bibliotecaPySixel, que já não é mantida.pip install sixel -
Carrega um modelo e executa a inferência; depois, representa graficamente os resultados e guarda-os numa variável. Sabe mais sobre os argumentos de inferência e como trabalhar com os resultados na página do modo predict.
from ultralytics import YOLO # Carregar um modelo model = YOLO("yolo26n.pt") # Executa a inferência numa imagem results = model.predict(source="https://ultralytics.com/images/bus.jpg") # Representar graficamente os resultados da inferência plot = results[0].plot() # (1)!- Consulta os parâmetros do método plot para ver os argumentos disponíveis.
-
Agora, usa OpenCV para converter os dados
np.ndarrayembytes. Em seguida, usaio.BytesIOpara criar um objeto semelhante a um ficheiro.import io import cv2 # Imagem dos resultados em bytes im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # Bytes da imagem como objeto semelhante a um ficheiro mem_file = io.BytesIO(im_bytes)- Também é possível usar outras extensões de imagem.
- Só é necessário o objeto devolvido no índice
1.
-
Cria uma instância de
SixelWritere, em seguida, usa o método.draw()para desenhar a imagem no terminal.from sixel import SixelWriter # Criar objeto de escrita sixel w = SixelWriter() # Desenhar a imagem sixel no terminal w.draw(mem_file)
Exemplos dos resultados da inferência#
Este exemplo não foi testado com vídeos nem com fotogramas de GIFs animados. Experimenta por tua conta e risco.
Exemplo completo de código#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# Carregar um modelo
model = YOLO("yolo26n.pt")
# Executa a inferência numa imagem
results = model.predict(source="https://ultralytics.com/images/bus.jpg")
# Representar graficamente os resultados da inferência
plot = results[0].plot() # (3)!
# Imagem dos resultados em 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 usar outras extensões de imagem.
- Só é necessário o objeto devolvido no índice
1. - Consulta os parâmetros do método plot para ver os argumentos disponíveis.
Poderás ter de usar clear para «apagar» a imagem apresentada no terminal.
Perguntas frequentes#
Para veres os resultados da 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="https://ultralytics.com/images/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 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 funcionalidades nativas de terminal compatíveis com gráficos sixel. O suporte para gráficos sixel no terminal do Windows ainda está em desenvolvimento. Para obter atualizações sobre a compatibilidade com o Windows, consulta o estado da issue do VSCode e a documentação.
Se nada for apresentado, executa estas verificações pela ordem indicada:
- Confirma que
terminal.integrated.enableImageseterminal.integrated.gpuAccelerationestão ativados, conforme indicado na secção Processo; em seguida, reinicia o terminal integrado para aplicar as definições. - Confirma que
sixelestá instalado no mesmo ambiente virtual em que o teu script é executado (pip install sixel). - Antes de codificares
plot, confirma que é umnp.ndarrayválido, poiscv2.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 veres os valores aceites porresults[0].plot().
Se os problemas persistirem, consulta o repositório do VSCode para verificar o estado do suporte a imagens no terminal.
- Confirma que
Atualmente, a apresentação dos resultados da inferência de vídeo ou de fotogramas de GIFs animados com sixel no terminal não foi testada e poderá não ser compatível. Recomendamos começar com imagens estáticas e verificar a compatibilidade. Experimenta apresentar resultados de vídeo por tua conta e risco, tendo em conta as limitações de desempenho. Para mais informações sobre como representar graficamente os resultados da inferência, visita a página do modo predict.
O pacote
sixelé um fork da bibliotecaPySixel, que já não é mantida, e consiste num wrapper Python simples para Pillow (PIL). Seimport sixelfalhar ouSixelWriter().draw()gerar um erro, confirma que o pacote está instalado no teu ambiente virtual ativo, verifica se o Pillow está disponível e consulta o repositório python-sixel no GitHub para obter informações específicas da plataforma. Para saberes mais sobre como gerar a imagem que passas adraw(), consulta a documentação do modo predict.