Real-time Inference
リアルタイム推論では、30 FPSの場合に1フレームあたり33 ms以内で処理するなど、次の入力が届く前に各予測を返します。レイテンシの予算と高速化の方法を解説します。
リアルタイム推論では、ライブ入力に対して学習済みモデルを実行し、次の入力が到着する前に各予測を返すため、情報が最新であるうちにシステムが動作できます。毎秒30フレーム(FPS)のカメラでは、画像の読み込みから最終結果の出力まで、1フレームあたり33.3ミリ秒が割り当てられます。60 FPSでは、許容時間は16.7 msに短縮されます。アプリケーションごとに期限は異なります。自動車の認識スタック、コンベヤーベルトの検査カメラ、ビデオ通話の背景フィルターは、いずれも異なる時間制約でリアルタイムに動作します。
レイテンシの予算#
計測対象となるのは、フレームの取得、リサイズと正規化による前処理、モデルの順伝播、ボックスのデコードや非最大抑制(NMS)などの後処理を含む、エンドツーエンドの推論レイテンシです。合計時間がフレーム間隔を超えると、未処理のフレームが蓄積し、出力がライブ映像からさらに遅れていきます。そのため、ライブパイプラインでは通常、古いフレームを破棄し、常に最新のフレームを処理します。リアルタイムコンピューティングでは、エアバッグ制御装置のように期限を逃すと障害になるハードリアルタイムシステムと、時折の遅延を許容するソフトリアルタイムシステムを区別します。ほとんどのコンピュータービジョンアプリケーションはソフトリアルタイムです。フレームが破棄されると一時的に出力品質が下がりますが、次のフレームで回復します。
このコードは、録画済み動画をストリーミングして小型検出器に入力し、1フレームあたりの平均処理時間を30 FPSの予算と比較します。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov"
# stream=True yields each frame's result as soon as it is ready
frame_times = []
for result in model(video, stream=True):
# Preprocess, inference, and postprocess time for this frame, in milliseconds
frame_times.append(sum(result.speed.values()))
mean_ms = sum(frame_times) / len(frame_times)
print(f"{mean_ms:.1f} ms per frame ({1000 / mean_ms:.0f} FPS); a 30 FPS camera allows 33.3 ms")平均時間が33.3 ms未満であれば、そのモデルは実行したハードウェア上で30 FPSのカメラ処理に追いついています。
リアルタイム推論とバッチ推論#
- リアルタイム(オンライン)推論: 入力が到着するたびに、通常は画像を1枚ずつ処理し、個々の予測すべてについてレイテンシを評価します。運転支援、ロボット制御、ライブ動画分析で必要とされます。
- バッチ(オフライン)推論: 多数の入力を集めてまとめて処理し、1秒あたりの入力数で表すスループットとコストで評価します。写真アーカイブの夜間の再インデックス作成や、先月の映像の分析はバッチ処理です。バッチサイズを大きくするとGPUをより有効に使えますが、各入力の結果を得るまでの待ち時間は長くなります。
多数のカメラストリームを扱うサーバーは、リアルタイム処理とバッチ処理の中間的な方法を取ることがよくあります。複数のカメラからのフレームを小さなバッチにまとめてスループットを高めつつ、各ストリームのフレーム予算内に処理を収めます。
実際のアプリケーション#
- 自動運転車: 時速100 kmでは、車は100 msごとに2.8メートル進むため、認識のレイテンシが停止距離に直接影響します。
- 製造検査: コンベヤー上のカメラは各部品の欠陥を検出し、不良品が通過する前に排除機構を作動させる必要があります。
- ロボティクス: 障害物検出と姿勢推定はロボットの制御ループ内で実行されるため、認識処理が遅くなると動作も遅くなります。
- 動画エフェクトと拡張現実: ビデオ通話の背景ぼかしやARオーバーレイでは、各フレームでセグメンテーションやトラッキングを実行します。遅延があると、オーバーレイが動く人物に遅れて表示されます。
モデルを十分に高速化する方法#
- 小型モデルまたは入力サイズの縮小: 小型のモデルバリエーションでは、画像あたりの演算回数が少なくなります。畳み込みの計算量はおおむねピクセル数に比例するため、入力の幅と高さを半分にすると計算量は約4分の1になりますが、小さな物体の精度はある程度低下します。
- モデル量子化: 重みと活性化をFP32ではなくFP16またはINT8で保存すると、メモリアクセスが減り、高速な演算ユニットを利用できます。INT8では通常、精度の低下を抑えるためにキャリブレーション画像が必要です。
- 推論エンジン: 特定のハードウェア群向けに構築されたランタイムは、レイヤーを融合し、デバイスに最適化されたカーネルを選択します。たとえば、NVIDIA GPU向けのTensorRTやAppleデバイス向けのCore MLがあります。
- エッジAI: カメラや組み込みモジュール上でモデルを実行すると、クラウド呼び出しに伴うネットワーク往復をなくせます。低速な接続では、その往復時間がフレーム予算全体を超えることがあります。
ランタイムとハードウェアにより、レイテンシは桁違いに変化します。nano YOLO26モデルは、CPU上でONNXを使用すると640ピクセル画像1枚あたり38.9 msかかりますが、NVIDIA T4 GPU上でTensorRTを使用すると1.7 msです。Ultralyticsのエクスポートモードは、学習済みYOLO26モデルをTensorRT、OpenVINO、LiteRTなどの形式に変換します。また、quantize=16またはquantize=8引数を指定すると、対象デバイス向けのFP16またはINT8重みを生成します。










