Ultralytics YOLO27:
Get Started

Как просматривать результаты инференса YOLO в терминале VSCode#

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

Зачем это нужно#

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

Только Linux и macOS

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

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

Процесс#

  1. Сначала включи в VSCode настройки terminal.integrated.enableImages и terminal.integrated.gpuAcceleration.

    "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. Загрузи модель и выполни инференс, затем построй изображение результатов и сохрани его в переменной. Подробнее об аргументах инференса и работе с результатами см. на странице режима Predict.

    from ultralytics import YOLO
    
    # Загрузить модель
    model = YOLO("yolo26n.pt")
    
    # Запустить инференс на изображении
    results = model.predict(source="https://ultralytics.com/images/bus.jpg")
    
    # Визуализация результатов инференса
    plot = results[0].plot()  # (1)!
    1. Возможные аргументы см. в разделе Параметры метода plot.
  4. Теперь используй OpenCV, чтобы преобразовать np.ndarray в данные bytes. Затем используй io.BytesIO, чтобы создать объект, подобный файлу.

    import io
    
    import cv2
    
    # Изображение результатов в виде байтов
    im_bytes = cv2.imencode(
        ".png",  # (1)!
        plot,
    )[1].tobytes()  # (2)!
    
    # Байты изображения в виде объекта, подобного файлу
    mem_file = io.BytesIO(im_bytes)
    1. Можно использовать и другие расширения изображений.
    2. Нужен только возвращаемый объект с индексом 1.
  5. Создай экземпляр SixelWriter, а затем используй метод .draw(), чтобы нарисовать изображение в терминале.

    from sixel import SixelWriter
    
    # Создание объекта записи sixel
    w = SixelWriter()
    
    # Отображение изображения sixel в терминале
    w.draw(mem_file)

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

YOLO inference results displayed in terminal

Видео и GIF не тестировались

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

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

import io

import cv2
from sixel import SixelWriter

from ultralytics import YOLO

# Загрузить модель
model = YOLO("yolo26n.pt")

# Запустить инференс на изображении
results = model.predict(source="https://ultralytics.com/images/bus.jpg")

# Визуализация результатов инференса
plot = results[0].plot()  # (3)!

# Изображение результатов в виде байтов
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, чтобы «стереть» изображение с экрана терминала.

Часто задаваемые вопросы#

  • Чтобы просматривать результаты инференса 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="https://ultralytics.com/images/bus.jpg")
      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)

    Подробнее см. на странице режима Predict.

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

  • Если ничего не отображается, последовательно выполни следующие проверки:

    1. Убедись, что включены обе настройки — terminal.integrated.enableImages и terminal.integrated.gpuAcceleration, как описано в разделе Процесс, а затем перезапусти встроенный терминал, чтобы настройки вступили в силу.
    2. Убедись, что sixel установлена в том же виртуальном окружении, в котором выполняется скрипт (pip install sixel).
    3. Перед кодированием убедись, что plot — корректный np.ndarray, поскольку cv2.imencode выдаёт ошибку, если изображение пустое или не является корректным массивом. Допустимые значения для results[0].plot() см. в разделе Параметры метода plot.

    Если проблема не исчезла, проверь репозиторий VSCode, чтобы узнать о статусе поддержки изображений в терминале.

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

  • Пакет sixel — это форк библиотеки PySixel, поддержка которой прекращена, и лёгкая обёртка Python для Pillow (PIL). Если import sixel не работает или SixelWriter().draw() выдаёт ошибку, проверь, что пакет установлен в активном виртуальном окружении, убедись, что доступна Pillow, и посмотри примечания для конкретных платформ в репозитории python-sixel на GitHub. Подробнее о создании изображения, которое передаётся в draw(), см. в документации режима Predict.

Комментарии