Ultralytics YOLO27:

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.

Apenas Linux e macOS

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#

  1. Primeiro, tens de 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. Esta é uma derivação da biblioteca PySixel, que já não é mantida.

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

YOLO inference results displayed in terminal

Vídeos e GIFs não testados

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

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:

    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="ultralytics/assets/bus.jpg")
      plot = results[0].plot()
    4. 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:

    1. Confirma que terminal.integrated.enableImages e terminal.integrated.gpuAcceleration estão ativados, conforme mostrado na secção Processo, e reinicia o terminal integrado para que as definições tenham efeito.
    2. Verifica se sixel está instalado no mesmo ambiente virtual em que o teu script é executado (pip install sixel).
    3. Certifica-te de que plot é um np.ndarray válido antes de o codificares, uma vez que cv2.imencode gera 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 por results[0].plot().

    Se os problemas persistirem, consulta o repositório do VSCode para verificar o estado do suporte de imagens no terminal.

  • 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 biblioteca PySixel, que não é mantida, e é um wrapper Python simples sobre o Pillow (PIL). Se import sixel falhar ou SixelWriter().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 a draw(), consulta a documentação do modo predict.

Comentários