Salta para o conteúdo

Visualizando resultados de inferência em um terminal

Exemplo de Sixel de imagem no Terminal

Imagem do sítio Web da libsixel.

Motivação

Quando te ligas a uma máquina remota, normalmente não é possível visualizar os resultados da imagem ou é necessário mover os dados para um dispositivo local com uma GUI. O terminal integrado VSCode permite a renderização direta de imagens. Esta é uma breve demonstração de como usá-lo em conjunto com o ultralytics com resultados das previsões.

Aviso

Só é compatível com Linux e MacOS. Verifica o Repositório VSCode, verifica Estado da questão, ou documentação para obter actualizações sobre o suporte do Windows para ver imagens no terminal com sixel.

Os protocolos compatíveis com VSCode para visualizar imagens utilizando o terminal integrado são sixel e iTerm. Este guia irá demonstrar a utilização do sixel protocolo.

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": false
    

    Definição das imagens do terminal de ativação do código VSC

  2. Instala o python-sixel no teu ambiente virtual. Este é um garfo do PySixel que já não é mantida.

    pip install sixel
    
  3. Carrega um modelo e executa a inferência, depois traça os resultados e armazena-os numa variável. Vê mais sobre argumentos de inferência e como trabalhar com resultados na página do modo de previsão.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolov8n.pt")
    
    # Run inference on an image
    results = model.predict(source="ultralytics/assets/bus.jpg")
    
    # Plot inference results
    plot = results[0].plot()  # (1)!
    
    1. os parâmetros do método plot para veres os argumentos possíveis a utilizar.
  4. Agora, utiliza o OpenCV para converter o numpy.ndarray para bytes dados. Depois utiliza 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 utilizar outras extensões de imagem.
    2. Apenas o objeto no índice 1 que te é devolvido é necessário.
  5. Cria um SixelWriter e depois usa a instância .draw() para desenhares 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

Vê a imagem no terminal

Perigo

A utilização deste exemplo com vídeos ou quadros GIF animados não foi testada. 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("yolov8n.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. Apenas o objeto no índice 1 que te é devolvido é necessário.
  3. os parâmetros do método plot para veres os argumentos possíveis a utilizar.

Dica

Podes ter de utilizar clear para "apagar" a visualização da imagem no terminal.

FAQ

Como posso ver os resultados da inferência YOLO num terminal VSCode em macOS ou Linux?

Para ver os resultados da inferência YOLO num terminal VSCode no macOS ou Linux, segue estes passos:

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

    "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("yolov8n.pt")
    results = model.predict(source="path_to_image")
    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 informações, visita a página do modo de previsão.

Porque é que o protocolo sixel só funciona em Linux e macOS?

Atualmente, o protocolo sixel só é suportado em Linux e macOS porque estas plataformas têm capacidades de terminal nativas compatíveis com gráficos sixel. O suporte do Windows para gráficos de terminal usando sixel ainda está em desenvolvimento. Para obter atualizações sobre a compatibilidade do Windows, verifica o status e a documentação do problema do VSCode.

E se eu tiver problemas com a apresentação de imagens no terminal VSCode?

Se tiveres problemas com a apresentação de imagens no terminal VSCode utilizando o sixel:

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

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

    pip install sixel
    
  3. Verifica se existem erros no código de conversão de dados de imagem e 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 VSCode e visita a secção de parâmetros do método de plotagem para obteres orientações adicionais.

O YOLO pode apresentar os resultados da inferência de vídeo no terminal utilizando o sixel?

A exibição de resultados de inferência de vídeo ou quadros GIF animados usando o sixel no terminal não foi testada no momento e pode não ser suportada. Recomendamos que comeces com imagens estáticas e verifiques a compatibilidade. Tenta resultados de vídeo por tua conta e risco, tendo em conta as restrições de desempenho. Para obter mais informações sobre a plotagem de resultados de inferência, visita a página do modo de previsão.

Como é que posso resolver problemas com o python-sixel biblioteca?

Para solucionar problemas com o python-sixel biblioteca:

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

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

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

  4. Verifica novamente o teu código quanto a possíveis erros, especificamente a utilização de SixelWriter e os passos de conversão de dados de imagem.

Para obter mais assistência sobre como trabalhar com os modelos YOLO e a integração do sixel, consulta as páginas de documentação do modo de exportação e previsão.



Criado em 2024-03-09, Atualizado em 2024-07-05
Autores: glenn-jocher (6), IvorZhu331 (1), Burhan-Q (1)

Comentários