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 ultralytics import YOLO
    from sixel import SixelWriter
    
  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".

    # 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 ultralytics import YOLO
from sixel import SixelWriter

# 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. 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-04-27
Autores: glenn-jocher (1), Burhan-Q (1)

Comentários