Visualizando resultados de inferência num terminal

Sixel example of image in 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.

Aviso

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

  1. Primeiro, deves ativar as definições terminal.integrated.enableImages e terminal.integrated.gpuAcceleration no VSCode.

    "terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on"
    "terminal.integrated.enableImages": true

    VSCode enable terminal images setting

  2. Instala a biblioteca python-sixel no teu ambiente virtual. Este é um fork da biblioteca PySixel, que já não é mantida.

    pip install sixel
  3. 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)!
    1. Consulta os parâmetros do método plot para ver os possíveis argumentos a utilizar.
  4. Agora, usa o OpenCV para converter o np.ndarray para dados bytes. Depois usa io.BytesIO para 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)
    1. Também é possível usar outras extensões de imagem.
    2. Apenas o objeto no índice 1 que é retornado é necessário.
  5. Cria uma instância de SixelWriter e, 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

YOLO inference results displayed in terminal

Perigo

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)
  1. Também é possível usar outras extensões de imagem.
  2. Apenas o objeto no índice 1 que é retornado é necessário.
  3. Consulta os parâmetros do método plot para ver os possíveis argumentos a utilizar.

Dica

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:

  1. Ativa as definições necessárias do VSCode:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Instala a biblioteca sixel:

    pip install sixel
  3. 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()
  4. 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:

  1. Certifica-te de que as definições necessárias no VSCode estão ativadas:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Verifica a instalação da biblioteca sixel:

    pip install sixel
  3. 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:

  1. Certifica-te de que a biblioteca está instalada corretamente no teu ambiente virtual:

    pip install sixel
  2. Verifica se tens as dependências necessárias do Python e do sistema.

  3. Consulta o repositório GitHub do python-sixel para documentação adicional e suporte da comunidade.

  4. Verifica novamente o teu código para potenciais erros, especificamente o uso de SixelWriter e 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.

Comentários