VSCodeターミナルでYOLOの推論結果を表示する方法#
libsixelのWebサイトからの画像です。
背景#
SSHでリモートマシンに接続している場合、通常は画像結果を視覚化できないか、GUIを備えたローカルデバイスにデータを移す必要があります。VSCodeの統合ターミナルでは画像を直接表示できるため、ファイルをノートPCにコピーしなくても、推論を実行した場所で予測結果を確認できます。このガイドでは、設定の有効化、コードの接続方法を説明し、よくある質問に回答します。
LinuxおよびmacOSのみで動作します。ターミナルで画像を表示するためのWindowsサポートに関する最新情報は、VSCodeリポジトリ、Issueのステータス、またはドキュメントをご確認ください。sixelを使用します。
統合ターミナルで画像を表示するために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 -
モデルを読み込んで推論を実行し、結果をプロットして変数に格納します。推論引数と結果の扱いについて詳しくは、予測モードのページをご覧ください。
from ultralytics import YOLO # モデルを読み込む model = YOLO("yolo26n.pt") # 画像に対して推論を実行する results = model.predict(source="https://ultralytics.com/images/bus.jpg") # 推論結果をプロット plot = results[0].plot() # (1)!- 使用可能な引数については、plotメソッドのパラメーターをご覧ください。
-
次に、OpenCVを使って
np.ndarrayをbytesデータに変換します。その後、io.BytesIOを使って「ファイル風」オブジェクトを作成します。import io import cv2 # 推論結果の画像をバイト列に変換 im_bytes = cv2.imencode( ".png", # (1)! plot, )[1].tobytes() # (2)! # 画像のバイト列をファイル風オブジェクトに変換 mem_file = io.BytesIO(im_bytes)- ほかの画像拡張子も使用できます。
- 返されるオブジェクトのうち、インデックス
1のものだけが必要です。
-
SixelWriterインスタンスを作成し、.draw()メソッドを使ってターミナルに画像を描画します。from sixel import SixelWriter # sixelライターオブジェクトを作成 w = SixelWriter() # ターミナルにsixel画像を描画 w.draw(mem_file)
推論結果の例#
動画やアニメーションGIFのフレームでこの例を使用したことはありません。ご自身の判断でお試しください。
コード全体の例#
import io
import cv2
from sixel import SixelWriter
from ultralytics import YOLO
# モデルを読み込む
model = YOLO("yolo26n.pt")
# 画像に対して推論を実行する
results = model.predict(source="https://ultralytics.com/images/bus.jpg")
# 推論結果をプロット
plot = results[0].plot() # (3)!
# 推論結果の画像をバイト列に変換
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を使用する必要がある場合があります。
よくある質問#
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="https://ultralytics.com/images/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のIssueステータスとドキュメントをご確認ください。
何も表示されない場合は、次の項目を順番に確認してください。
- 手順のセクションで示されているように、
terminal.integrated.enableImagesとterminal.integrated.gpuAccelerationの両方が有効になっていることを確認し、統合ターミナルを再起動して設定を反映させます。 - スクリプトの実行に使用する仮想環境(
pip install sixel)にsixelがインストールされていることを確認します。 - エンコードする前に、
plotが有効なnp.ndarrayであることを確認してください。画像が空、または有効な配列でない場合、cv2.imencodeはエラーを発生させます。results[0].plot()が受け付ける値については、plotメソッドのパラメーターをご覧ください。
問題が解決しない場合は、ターミナルでの画像サポート状況についてVSCodeリポジトリをご確認ください。
- 手順のセクションで示されているように、
sixelを使った動画推論結果やアニメーションGIFフレームのターミナル表示は、現在未検証のため、サポートされていない場合があります。まず静止画像で試し、互換性を確認することをおすすめします。パフォーマンス上の制約を考慮し、動画の結果はご自身の判断でお試しください。推論結果のプロットについて詳しくは、予測モードのページをご覧ください。
sixelパッケージは、メンテナンスが終了したPySixelライブラリのforkであり、Pillow(PIL)を薄くラップするPythonラッパーです。import sixelが失敗した場合や、SixelWriter().draw()がエラーを発生させる場合は、パッケージが現在有効な仮想環境にインストールされていることを確認し、Pillowが利用可能であることを確かめたうえで、プラットフォーム固有の注意事項をpython-sixel GitHubリポジトリで確認してください。draw()に渡す画像の生成方法については、予測モードのドキュメントをご覧ください。