Как просматривать результаты инференса YOLO в терминале VSCode#
Изображение с сайта libsixel.
Мотивация#
При подключении к удаленной машине по SSH визуализация результатов в виде изображений обычно невозможна или требует пересылки данных на локальное устройство с графическим интерфейсом. Встроенный терминал VSCode может отображать изображения напрямую, поэтому ты можешь изучать результаты предсказаний прямо там, где запускаешь инференс, без необходимости копировать файлы обратно на ноутбук. В этом руководстве описано включение настройки, подключение кода, а также даны ответы на часто задаваемые вопросы.
Совместимо только с Linux и macOS. Проверь репозиторий VSCode, статус проблемы или документацию на предмет обновлений поддержки Windows для просмотра изображений в терминале с помощью sixel.
Протоколы, совместимые с VSCode для просмотра изображений во встроенном терминале — sixel и iTerm. В этом руководстве будет показано использование протокола sixel.
Процесс#
-
Сначала ты должен включить параметры
terminal.integrated.enableImagesиterminal.integrated.gpuAccelerationв VSCode."terminal.integrated.gpuAcceleration": "auto" # "auto" is default, can also use "on" "terminal.integrated.enableImages": true
-
Установи библиотеку
python-sixelв свое виртуальное окружение. Это форк библиотекиPySixel, которая больше не поддерживается.pip install sixel -
Загрузи модель и выполни инференс, затем отрисуй результаты и сохрани их в переменную. Узнай больше об аргументах инференса и работе с результатами на странице режима предсказания.
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)!- Смотри параметры метода plot, чтобы узнать доступные аргументы.
-
Теперь используй 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.
-
Создай экземпляр
SixelWriter, а затем используй метод.draw(), чтобы вывести изображение в терминал.from sixel import SixelWriter # Create sixel writer object w = SixelWriter() # Draw the sixel image in the terminal w.draw(mem_file)
Пример результатов инференса#
Использование этого примера с видео или анимированными кадрами 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. - Смотри параметры метода plot, чтобы узнать доступные аргументы.
Тебе может потребоваться использовать clear, чтобы «стереть» изображение в терминале.
FAQ#
Чтобы просматривать результаты инференса 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="ultralytics/assets/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)
Для получения подробной информации посети страницу режима предсказания.
-
Протокол sixel в настоящее время поддерживается только на Linux и macOS, так как эти платформы имеют встроенные возможности терминала, совместимые с графикой sixel. Поддержка графики в терминале с использованием sixel для Windows все еще находится в разработке. Обновления о совместимости с Windows проверяй в трекере проблем VSCode и документации.
Если ничего не отображается, выполни следующие проверки по порядку:
- Убедись, что включены как
terminal.integrated.enableImages, так иterminal.integrated.gpuAcceleration, как показано в разделе Процесс, а затем перезапусти встроенный терминал, чтобы настройки вступили в силу. - Убедись, что
sixelустановлена в том же виртуальном окружении, в котором запускается твой скрипт (pip install sixel). - Убедись перед кодированием, что
plotявляется допустимым массивомnp.ndarray, так какcv2.imencodeвызывает ошибку, если изображение пустое или не является допустимым массивом. См. параметры метода plot для значений, принимаемыхresults[0].plot().
Если проблемы не исчезнут, обратись к репозиторию VSCode для проверки статуса поддержки изображений в терминале.
- Убедись, что включены как
Отображение результатов инференса видео или анимированных кадров GIF с помощью sixel в терминале в настоящее время не тестировалось и может не поддерживаться. Мы рекомендуем начать со статических изображений и проверить совместимость. Попытка получить результаты для видео осуществляется на твой страх и риск с учетом ограничений производительности. Для получения дополнительной информации об отрисовке результатов инференса посети страницу режима предсказания.
Пакет
sixelявляется форком неподдерживаемой библиотекиPySixelи представляет собой тонкую обертку на Python над Pillow (PIL). Еслиimport sixelзавершается сбоем илиSixelWriter().draw()вызывает ошибку, убедись, что пакет установлен в твое активное виртуальное окружение, убедись в доступности Pillow и проверь репозиторий python-sixel на GitHub на наличие заметок для конкретной платформы. Подробнее о создании изображения, передаваемого вdraw(), читай в документации по режиму предсказания.