Ultralytics YOLO27:

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

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

Назначение#

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

Только Linux и macOS

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

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

    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 не тестировались

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

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

  • Чтобы просматривать результаты инференса 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="ultralytics/assets/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 в статусе Issue 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.

Комментарии