Как просматривать результаты инференса YOLO в терминале VSCode#
Изображение с сайта libsixel.
Зачем это нужно#
При подключении к удалённой машине по SSH обычно нельзя визуализировать результаты обработки изображений, либо для этого приходится переносить данные на локальное устройство с графическим интерфейсом. Встроенный терминал VSCode может отображать изображения напрямую, поэтому ты можешь просматривать результаты предсказаний прямо там, где запускаешь инференс, не копируя файлы на ноутбук. В этом руководстве показано, как включить настройки, подключить код и найти ответы на частые вопросы.
Поддерживаются только Linux и macOS. Следи за обновлениями поддержки Windows для отображения изображений в терминале в репозитории VSCode, смотри статус задачи или документацию, чтобы использовать sixel.
Совместимые с VSCode протоколы для просмотра изображений во встроенном терминале — sixel и iTerm. В этом руководстве показано, как использовать протокол sixel.
Процесс#
-
Сначала включи в VSCode настройки
terminal.integrated.enableImagesиterminal.integrated.gpuAcceleration."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Установи библиотеку
python-sixelв виртуальное окружение. Это форк библиотекиPySixel, поддержка которой прекращена.pip install sixel -
Загрузи модель и выполни инференс, затем построй изображение результатов и сохрани его в переменной. Подробнее об аргументах инференса и работе с результатами см. на странице режима Predict.
from ultralytics import YOLO # Загрузить модель model = YOLO("yolo26n.pt") # Запустить инференс на изображении results = model.predict(source="https://ultralytics.com/images/bus.jpg") # Визуализация результатов инференса plot = results[0].plot() # (1)!- Возможные аргументы см. в разделе Параметры метода plot.
-
Теперь используй 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.
-
Создай экземпляр
SixelWriter, а затем используй метод.draw(), чтобы нарисовать изображение в терминале.from sixel import SixelWriter # Создание объекта записи sixel w = SixelWriter() # Отображение изображения sixel в терминале w.draw(mem_file)
Пример результатов инференса#
Этот пример не тестировался с видео или кадрами анимированных 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. - Возможные аргументы см. в разделе Параметры метода plot.
Возможно, тебе понадобится использовать clear, чтобы «стереть» изображение с экрана терминала.
Часто задаваемые вопросы#
Чтобы просматривать результаты инференса YOLO в терминале VSCode на macOS или Linux, выполни следующие действия:
-
Включи необходимые настройки VSCode:
"terminal.integrated.enableImages": true "terminal.integrated.gpuAcceleration": "auto" -
Установи библиотеку sixel:
pip install sixel -
Загрузи модель YOLO и запусти инференс:
from ultralytics import YOLO model = YOLO("yolo26n.pt") results = model.predict(source="https://ultralytics.com/images/bus.jpg") plot = results[0].plot() -
Преобразуй изображение с результатом инференса в байты и отобрази его в терминале:
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 и документации.
Если ничего не отображается, последовательно выполни следующие проверки:
- Убедись, что включены обе настройки —
terminal.integrated.enableImagesиterminal.integrated.gpuAcceleration, как описано в разделе Процесс, а затем перезапусти встроенный терминал, чтобы настройки вступили в силу. - Убедись, что
sixelустановлена в том же виртуальном окружении, в котором выполняется скрипт (pip install sixel). - Перед кодированием убедись, что
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.