Visualizando resultados de inferência num terminal
Imagem do site libsixel.
Motivação
Ao conectar-te a uma máquina remota, visualizar resultados de imagem normalmente não é possível ou requer mover dados para um dispositivo local com uma GUI. O terminal integrado do VSCode permite renderizar imagens diretamente. Esta é uma breve demonstração sobre como usar isto em conjunto com o ultralytics e os resultados de predição.
Compatível apenas com Linux e MacOS. Verifica o repositório do VSCode, o estado da Issue ou a documentação para atualizações sobre o suporte para Windows para visualizar imagens no terminal com sixel.
Os protocolos compatíveis com o VSCode para visualizar imagens usando o terminal integrado são sixel e iTerm. Este guia demonstrará o uso 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. Este é um 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 numa variável. Vê mais sobre argumentos de inferência e como trabalhar com resultados na página do predict mode.
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 ver os possíveis argumentos a utilizar.
-
Agora, usa o OpenCV para converter o
np.ndarraypara dadosbytes. Depois usaio.BytesIOpara criar um objeto "tipo 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 usar outras extensões de imagem.
- Apenas o objeto no índice
1que é retornado é necessário.
-
Cria uma instância de
SixelWritere, em seguida, usa 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
Usar este exemplo com vídeos ou frames de GIF animados não foi testado. Tenta por tua 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)- Também é possível usar outras extensões de imagem.
- Apenas o objeto no índice
1que é retornado é necessário. - Consulta os parâmetros do método plot para ver os possíveis argumentos a utilizar.
Podes precisar de usar clear para "apagar" a visualização da imagem no terminal.
FAQ
Como posso ver os resultados de inferência YOLO num terminal VSCode no macOS ou Linux?
Para ver resultados de inferência YOLO num terminal 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="path_to_image") plot = results[0].plot() -
Converte a imagem do resultado da inferência para bytes e exibe-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 predict mode.
Por que é que o protocolo sixel só funciona no Linux e macOS?
O protocolo sixel é atualmente suportado apenas no Linux e macOS porque estas plataformas têm capacidades de terminal nativas compatíveis com gráficos sixel. O suporte para Windows para gráficos de terminal usando sixel ainda está em desenvolvimento. Para atualizações sobre a compatibilidade com Windows, verifica o estado da Issue do VSCode e a documentação.
E se eu encontrar problemas ao exibir imagens no terminal do VSCode?
Se encontrares problemas ao exibir imagens no terminal do VSCode usando sixel:
-
Certifica-te de que as definições necessárias no VSCode estão ativadas:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Verifica a instalação da biblioteca sixel:
pip install sixel -
Verifica se há erros na tua conversão de dados de imagem e no código de plotagem. Por exemplo:
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)
Se os problemas persistirem, consulta o repositório do VSCode e visita a secção de parâmetros do método plot para orientação adicional.
O YOLO consegue exibir resultados de inferência de vídeo no terminal usando sixel?
Exibir resultados de inferência de vídeo ou frames de GIF animados usando sixel no terminal não foi testado e pode não ser suportado. Recomendamos começar com imagens estáticas e verificar a compatibilidade. Tenta resultados de vídeo por tua conta e risco, tendo em mente as limitações de desempenho. Para mais informações sobre como plotar resultados de inferência, visita a página do predict mode.
Como posso resolver problemas com a biblioteca python-sixel?
Para resolver problemas com a biblioteca python-sixel:
-
Certifica-te de que a biblioteca está instalada corretamente no teu ambiente virtual:
pip install sixel -
Verifica se tens as dependências necessárias do Python e do sistema.
-
Consulta o repositório GitHub do python-sixel para documentação adicional e suporte da comunidade.
-
Verifica novamente o teu código para potenciais erros, especificamente o uso de
SixelWritere os passos de conversão de dados de imagem.
Para assistência adicional sobre como trabalhar com modelos YOLO e integração sixel, vê as páginas de documentação de export e predict mode.