Просмотр результатов инференса в терминале

Sixel example of image in Terminal

Изображение с веб-сайта libsixel.

Мотивация

При подключении к удаленной машине визуализация результатов вывода изображений обычно невозможна или требует передачи данных на локальное устройство с графическим интерфейсом. Интегрированный терминал VSCode позволяет отображать изображения напрямую. Это краткая демонстрация того, как использовать это вместе с ultralytics и результатами предсказаний.

Предупреждение

Совместимо только с Linux и MacOS. Следи за репозиторием VSCode, проверяй статус тикета или документацию для получения обновлений о поддержке Windows для просмотра изображений в терминале с помощью sixel.

Протоколы, совместимые с VSCode для просмотра изображений в интегрированном терминале — это sixel и iTerm. В этом руководстве будет продемонстрировано использование протокола sixel.

Процесс

  1. Сначала необходимо включить настройки terminal.integrated.enableImages и terminal.integrated.gpuAcceleration в VSCode.

    "terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on"
    "terminal.integrated.enableImages": true

    VSCode enable terminal images setting

  2. Установи библиотеку python-sixel в своем виртуальном окружении. Это форк библиотеки PySixel, которая больше не поддерживается.

    pip install sixel
  3. Загрузи модель и выполни инференс, затем отрисуй результаты и сохрани их в переменную. Подробнее об аргументах инференса и работе с результатами читай на странице режима предсказания.

    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. Смотри параметры метода plot, чтобы узнать о возможных аргументах.
  4. Теперь используй OpenCV для преобразования np.ndarray в bytes данные. Затем используй io.BytesIO, чтобы создать «файлоподобный» объект.

    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. Можно использовать и другие расширения изображений.
    2. Нужен только объект с индексом 1, который возвращается в результате.
  5. Создай экземпляр SixelWriter, а затем используй метод .draw() для отрисовки изображения в терминале.

    from sixel import SixelWriter
    
    # Create sixel writer object
    w = SixelWriter()
    
    # Draw the sixel image in the terminal
    w.draw(mem_file)

Пример результатов инференса

YOLO inference results displayed in terminal

Осторожно

Использование этого примера с видео или анимированными кадрами GIF не тестировалось. Попробуй на свой страх и риск.

Полный пример кода

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. Можно использовать и другие расширения изображений.
  2. Нужен только объект с индексом 1, который возвращается в результате.
  3. Смотри параметры метода plot, чтобы узнать о возможных аргументах.

Совет

Возможно, тебе потребуется использовать clear, чтобы «стереть» изображение в терминале.

Часто задаваемые вопросы (FAQ)

Как я могу просматривать результаты инференса YOLO в терминале VSCode на macOS или Linux?

Чтобы просматривать результаты инференса YOLO в терминале VSCode на macOS или Linux, выполни следующие шаги:

  1. Включи необходимые настройки VSCode:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Установи библиотеку sixel:

    pip install sixel
  3. Загрузи свою модель YOLO и запусти инференс:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    results = model.predict(source="path_to_image")
    plot = results[0].plot()
  4. Преобразуй изображение с результатами инференса в байты и отобрази его в терминале:

    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)

Для получения более подробной информации посети страницу режима предсказания.

Почему протокол sixel работает только на Linux и macOS?

Протокол sixel в настоящее время поддерживается только на Linux и macOS, так как эти платформы имеют встроенные возможности терминала, совместимые с графикой sixel. Поддержка графики в терминале Windows с использованием sixel все еще находится в разработке. Для получения обновлений о совместимости с Windows проверяй статус тикета VSCode и документацию.

Что делать, если у меня возникают проблемы с отображением изображений в терминале VSCode?

Если ты столкнулся с проблемами при отображении изображений в терминале VSCode с помощью sixel:

  1. Убедись, что необходимые настройки в VSCode включены:

    "terminal.integrated.enableImages": true
    "terminal.integrated.gpuAcceleration": "auto"
  2. Проверь установку библиотеки sixel:

    pip install sixel
  3. Проверь свой код преобразования данных изображения и отрисовки на наличие ошибок. Например:

    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)

Если проблемы сохраняются, обратись к репозиторию VSCode и посети раздел параметры метода plot для получения дополнительных рекомендаций.

Может ли YOLO отображать результаты инференса видео в терминале с помощью sixel?

Отображение результатов инференса видео или анимированных кадров GIF с помощью sixel в терминале в настоящее время не протестировано и может не поддерживаться. Мы рекомендуем начать со статических изображений и проверить совместимость. Пробуй использовать видеорезультаты на свой страх и риск, учитывая ограничения производительности. Для получения дополнительной информации об отрисовке результатов инференса посети страницу режима предсказания.

Как я могу устранить неполадки с библиотекой python-sixel?

Для устранения неполадок с библиотекой python-sixel:

  1. Убедись, что библиотека правильно установлена в твоем виртуальном окружении:

    pip install sixel
  2. Проверь наличие необходимых зависимостей Python и системы.

  3. Обратись к GitHub-репозиторию python-sixel за дополнительной документацией и поддержкой сообщества.

  4. Дважды проверь свой код на наличие потенциальных ошибок, особенно использование SixelWriter и этапы преобразования данных изображения.

За дополнительной помощью по работе с моделями YOLO и интеграцией sixel обратись к страницам документации экспорт и режим предсказания.

Комментарии