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

Apenas compat√≠vel com Linux e MacOS. Verifica o c√≥digo VSC reposit√≥rio, 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

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

    pip install sixel
    
  2. Importar as bibliotecas relevantes

    import io
    
    import cv2 as cv
    from sixel import SixelWriter
    from ultralytics import YOLO
    
  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. V√™ 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".

    # Results image as bytes
    im_bytes = cv.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.

    # 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 as cv
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 = cv.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. V√™ 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.



Criado em 2024-03-09, Atualizado em 2024-05-19
Autores: glenn-jocher (3), Burhan-Q (1)

Coment√°rios