VSCodeターミナルでYOLOの推論結果を表示する方法#
libsixelのWebサイトに掲載されている画像です。
動機#
SSH経由でリモートマシンに接続する場合、通常は画像結果を可視化できないか、GUIを備えたローカルデバイスにデータを移動する必要があります。VSCodeの統合ターミナルでは画像を直接レンダリングできるため、ファイルをノートパソコンにコピーして戻すことなく、推論を実行する場所でprediction resultsを確認できます。このガイドでは、setupの有効化、codeの接続方法、common questionsについて説明します。
LinuxおよびmacOSとのみ互換性があります。sixelを使用してターミナルに画像を表示するWindowsサポートの更新については、VSCode repository、Issue status、またはdocumentationを確認してください。
統合ターミナルで画像を表示するための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ライブラリのforkです。pip install sixel -
モデルを読み込んで推論を実行し、結果をプロットして変数に保存します。推論引数と結果の操作方法については、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)!- 使用可能な引数については、plot method parametersを参照してください。
-
次に、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 method parametersを参照してください。
ターミナルに表示された画像を「消去」するには、clearを使用する必要がある場合があります。
FAQ#
macOSまたはLinuxのVSCodeターミナルでYOLOの推論結果を表示するには、次の手順に従います。
-
必要な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 modeページを参照してください。
-
sixelプロトコルが現在LinuxとmacOSでのみサポートされているのは、これらのプラットフォームにsixelグラフィックスと互換性のあるネイティブターミナル機能があるためです。sixelを使用したターミナルグラフィックスのWindowsサポートは、現在も開発中です。Windows互換性の更新については、VSCode Issue statusとdocumentationを確認してください。
何もレンダリングされない場合は、次の確認を順番に行ってください。
- Processセクションに示されているように、
terminal.integrated.enableImagesとterminal.integrated.gpuAccelerationの両方が有効になっていることを確認し、設定を反映するために統合ターミナルを再起動します。 sixelが、スクリプトを実行する同じ仮想環境(pip install sixel)にインストールされていることを確認します。- エンコードする前に、
plotが有効なnp.ndarrayであることを確認してください。画像が空または有効な配列でない場合、cv2.imencodeはエラーを発生させます。results[0].plot()が受け付ける値については、plot method parametersを参照してください。
問題が解決しない場合は、ターミナル画像サポートの状況についてVSCode repositoryを確認してください。
- Processセクションに示されているように、
sixelを使用して動画の推論結果やアニメーションGIFのフレームをターミナルに表示する機能は、現在テストされておらず、サポートされていない可能性があります。まず静止画像から始め、互換性を確認することを推奨します。パフォーマンス上の制約に注意し、動画結果は自己責任でお試しください。推論結果のプロットの詳細については、predict modeページを参照してください。
sixelパッケージは、メンテナンスされていないPySixelライブラリのforkであり、Pillow(PIL)を基盤とする薄いPythonラッパーです。import sixelが失敗する場合、またはSixelWriter().draw()がエラーを発生させる場合は、パッケージがアクティブな仮想環境にインストールされていること、Pillowが利用可能であることを確認し、プラットフォーム固有の注意事項についてpython-sixel GitHub repositoryを確認してください。draw()に渡す画像の生成方法については、predict modeのドキュメントを参照してください。