Как просматривать результаты инференса YOLO в терминале VSCode#
Изображение с сайта libsixel.
Назначение#
При подключении к удалённой машине по SSH обычная визуализация изображений невозможна или требует переноса данных на локальное устройство с графическим интерфейсом. Встроенный терминал VSCode может напрямую отображать изображения, поэтому ты можешь просматривать результаты предсказаний прямо там, где запускаешь инференс, не копируя файлы обратно на свой ноутбук. В этом руководстве рассматриваются настройка окружения, подключение кода и часто задаваемые вопросы.
Совместимо только с Linux и macOS. Следи за обновлениями поддержки Windows для просмотра изображений в терминале с помощью sixel в репозитории VSCode, статусе Issue или документации.
Совместимые с 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 -
Загрузи модель и выполни инференс, затем отобрази результаты и сохрани их в переменной. Подробнее об аргументах инференса и работе с результатами см. на странице режима 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)!- Возможные аргументы см. в разделе параметров метода 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, чтобы «стереть» изображение из терминала.
Часто задаваемые вопросы#
Чтобы просматривать результаты инференса 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)
Подробнее см. на странице режима predict.
-
Протокол sixel в настоящее время поддерживается только в Linux и macOS, поскольку эти платформы обладают встроенными возможностями терминала, совместимыми с графикой sixel. Поддержка терминальной графики через sixel в Windows всё ещё находится в разработке. Следи за обновлениями совместимости с Windows в статусе Issue 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.