Ultralytics YOLO27:

VSCodeターミナルでYOLOの推論結果を表示する方法#

libsixelのWebサイトに掲載されている画像です。

動機#

SSH経由でリモートマシンに接続する場合、通常は画像結果を可視化できないか、GUIを備えたローカルデバイスにデータを移動する必要があります。VSCodeの統合ターミナルでは画像を直接レンダリングできるため、ファイルをノートパソコンにコピーして戻すことなく、推論を実行する場所でprediction resultsを確認できます。このガイドでは、setupの有効化、codeの接続方法、common questionsについて説明します。

LinuxとmacOSのみ

LinuxおよびmacOSとのみ互換性があります。sixelを使用してターミナルに画像を表示するWindowsサポートの更新については、VSCode repositoryIssue status、またはdocumentationを確認してください。

統合ターミナルで画像を表示するための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ライブラリのforkです。

    pip install sixel
  3. モデルを読み込んで推論を実行し、結果をプロットして変数に保存します。推論引数と結果の操作方法については、predict modeページを参照してください。

    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 method parametersを参照してください。
  4. 次に、OpenCVを使用してnp.ndarraybytesデータに変換します。その後、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 method parametersを参照してください。
画像の消去

ターミナルに表示された画像を「消去」するには、clearを使用する必要がある場合があります。

FAQ#

  • 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 modeページを参照してください。

  • sixelプロトコルが現在LinuxとmacOSでのみサポートされているのは、これらのプラットフォームにsixelグラフィックスと互換性のあるネイティブターミナル機能があるためです。sixelを使用したターミナルグラフィックスのWindowsサポートは、現在も開発中です。Windows互換性の更新については、VSCode Issue statusdocumentationを確認してください。

  • 何もレンダリングされない場合は、次の確認を順番に行ってください。

    1. Processセクションに示されているように、terminal.integrated.enableImagesterminal.integrated.gpuAccelerationの両方が有効になっていることを確認し、設定を反映するために統合ターミナルを再起動します。
    2. sixelが、スクリプトを実行する同じ仮想環境(pip install sixel)にインストールされていることを確認します。
    3. エンコードする前に、plotが有効なnp.ndarrayであることを確認してください。画像が空または有効な配列でない場合、cv2.imencodeはエラーを発生させます。results[0].plot()が受け付ける値については、plot method parametersを参照してください。

    問題が解決しない場合は、ターミナル画像サポートの状況についてVSCode repositoryを確認してください。

  • sixelを使用して動画の推論結果やアニメーションGIFのフレームをターミナルに表示する機能は、現在テストされておらず、サポートされていない可能性があります。まず静止画像から始め、互換性を確認することを推奨します。パフォーマンス上の制約に注意し、動画結果は自己責任でお試しください。推論結果のプロットの詳細については、predict modeページを参照してください。

  • sixelパッケージは、メンテナンスされていないPySixelライブラリのforkであり、Pillow(PIL)を基盤とする薄いPythonラッパーです。import sixelが失敗する場合、またはSixelWriter().draw()がエラーを発生させる場合は、パッケージがアクティブな仮想環境にインストールされていること、Pillowが利用可能であることを確認し、プラットフォーム固有の注意事項についてpython-sixel GitHub repositoryを確認してください。draw()に渡す画像の生成方法については、predict modeのドキュメントを参照してください。

コメント