Ultralytics YOLO27:

如何在 VSCode 终端中查看 YOLO 推理结果#

图片来自 libsixel 网站。

动机#

通过 SSH 连接远程计算机时,通常无法正常可视化图像结果,或者需要将数据传输到带有 GUI 的本地设备。VSCode 集成终端可以直接渲染图像,因此你无需将文件复制回笔记本电脑,就能在运行推理的位置直接检查预测结果。本指南将介绍如何启用设置、配置代码,并解答常见问题

仅支持 Linux 和 macOS

仅兼容 Linux 和 macOS。请查看 VSCode 仓库Issue 状态文档,了解 Windows 支持更新,以便通过 sixel 在终端中查看图像。

VSCode 兼容、可通过集成终端查看图像的协议是 sixeliTerm。本指南将演示如何使用 sixel 协议。

流程#

  1. 首先,你必须在 VSCode 中启用 terminal.integrated.enableImagesterminal.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
    
    # 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. 请参阅绘图方法参数,了解可使用的参数。
  4. 现在,使用 OpenCVnp.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. 请参阅绘图方法参数,了解可使用的参数。
清除图像

你可能需要使用 clear 来“擦除”终端中的图像显示。

常见问题#

  • 要在 macOS 或 Linux 的 VSCode 终端中查看 YOLO 推理结果,请按以下步骤操作:

    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 图形兼容的原生终端功能。Windows 对使用 sixel 的终端图形支持仍在开发中。有关 Windows 兼容性的更新,请查看 VSCode Issue 状态文档

  • 如果没有任何内容渲染,请按以下顺序逐项检查:

    1. 确认 terminal.integrated.enableImagesterminal.integrated.gpuAcceleration 均已启用,如流程部分所示,然后重启集成终端,使设置生效。
    2. 确认 sixel 已安装在脚本运行所使用的同一虚拟环境(pip install sixel)中。
    3. 在编码之前,确保 plot 是有效的 np.ndarray,因为如果图像为空或不是有效数组,cv2.imencode 会引发错误。请参阅绘图方法参数,了解 results[0].plot() 接受的值。

    如果问题仍然存在,请查看 VSCode 仓库,了解终端图像支持状态。

  • 目前尚未测试在终端中使用 sixel 显示视频推理结果或动画 GIF 帧,可能不受支持。建议先从静态图像开始并验证兼容性。尝试显示视频结果时请自行承担风险,同时注意性能限制。有关绘制推理结果的更多信息,请访问 predict 模式页面。

  • sixel 软件包是未维护的 PySixel 库的一个分支,也是一个基于 Pillow (PIL) 的轻量级 Python 封装。如果 import sixel 失败或 SixelWriter().draw() 引发错误,请确认该软件包已安装到当前使用的虚拟环境中,确保 Pillow 可用,并查看 python-sixel GitHub 仓库中的平台特定说明。有关生成传递给 draw() 的图像的更多信息,请参阅 predict 模式文档。

评论