Ultralytics YOLO27:
Get Started

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.

Apenas Linux e macOS

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#

  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. É um fork da biblioteca PySixel, que já não é mantida.

    pip install sixel
  3. 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)!
    1. Consulta os parâmetros do método plot para ver os argumentos disponíveis.
  4. Agora, usa OpenCV para converter os dados np.ndarray em bytes. Em seguida, usa io.BytesIO para 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)
    1. Também é possível usar 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, 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#

YOLO inference results displayed in terminal

Vídeos e GIFs não testados

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)
  1. Também é possível usar 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 ver os argumentos disponíveis.
Limpar a imagem

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:

    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="https://ultralytics.com/images/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 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:

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

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

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

Comentários