Scene Flow
シーンフローがフレーム間の3Dモーションを推定する仕組み、オプティカルフローや深度推定との違い、自動運転、ロボティクス、YOLO26のビジョンワークフローでの活用方法を解説します。
シーンフローとは、動的なシーンにおける時間経過に伴う3次元の動きの場です。フレーム間で、目に見える点が実世界の3D空間をどのように移動するかを表し、横方向や垂直方向の移動、カメラに近づく、または遠ざかる動きも含みます。コンピュータビジョンでは、シーンフローによって、画像内で何が動いているように見えるかだけでなく、周囲のジオメトリが実際にどのように変化しているかもシステムが理解できるようになります。
シーンフローが3Dの動きをどのように表現するか#
シーンフローの推定では、観測された各シーン点に3D変位ベクトルまたは速度ベクトルを割り当てます。たとえば、歩行者が道路を横切りながらカメラに近づく場合、対応するベクトルは横方向の動きとカメラまでの距離が縮まることの両方を表します。
これは、2次元の画像平面上で見かけ上のピクセルの動きを表すオプティカルフローとは異なります。カーネギーメロン大学のシーンフロープロジェクトが説明するように、オプティカルフローは3Dシーンフローをカメラ画像に投影したものと捉えることができます。そのため、画像上では似た動きをする2点が、奥行き方向には異なる動きをしている場合があります。
高密度シーンフローは目に見える点の大部分の動きを推定し、疎なシーンフローは選択された特徴点、追跡対象の点、またはLiDARのリターンを対象とします。高密度の出力はより豊富な幾何学的詳細を提供しますが、より多くの計算量と、フレーム間の信頼性の高い対応付けが必要です。
シーンフローと関連するビジョンの概念との比較#
シーンフローは空間構造と時間的な動きを組み合わせ、いくつかの関連タスクの中間に位置します。
- OpenCVによるオプティカルフロー推定: 水平方向と垂直方向のピクセル変位を推定します。物体が奥行き方向に移動したのか、カメラによって見かけ上の動きが生じたのかを、単独で判断することはできません。
- 深度推定: 通常は1フレームを対象に、カメラから各表面までの距離を推定します。シーンフローはさらに、時間経過に伴うこれらの3D位置の変化も表します。
- ステレオビジョン: 同期したカメラ間の対応するピクセルを使って深度を復元します。OpenCVのステレオ深度推定ワークフローでは、視点間の視差を3D再構成にどのように活用するかを説明しています。
- 物体追跡: 通常はバウンディングボックスまたはマスクを使い、フレーム間で物体のIDを維持します。一方、シーンフローは点またはピクセル単位で動きを推定し、変形する1つの物体内にある異なる動きを表現できます。
- 点群の動き: LiDARやRGB-Dシステムは、3D点群間のシーンフローを直接推定できる場合があります。Open3Dの点群ガイドでは、このようなパイプラインの多くで使われる幾何学的表現を紹介しています。
シーンフローはカメラのジオメトリにも依存します。正確なOpenCVによるカメラキャリブレーションは、実際のシーンの動きと、カメラの回転や並進、レンズの歪みによる変化を切り分けるのに役立ちます。
実際の活用例#
-
自動運転: 認識システムは、近くの車両が車線変更中か、急速に接近しているか、交通の流れに沿って移動しているかを推定できます。2Dの動きだけの場合とは異なり、シーンフローには奥行き軸に沿った移動が含まれるため、衝突までの時間を推定できます。自動車向けコンピュータビジョンソリューションでは、検出、追跡、深度推定の各コンポーネントを補完できます。KITTIシーンフローベンチマークは、カメラの動きと独立して動く物体を含む道路シーンでの評価例を示し、NHTSAの自動運転車安全ガイダンスは、安全性を重視した認識システムのより広い背景を提供しています。
-
ロボティクス: 移動ロボットはシーンフローを使って、静止した棚と移動する作業者を見分け、障害物の3D軌道を推定し、衝突が起きる前に経路を更新できます。ロボティクス向けビジョンソリューションでは、この情報をカメラ、深度センサー、LiDARと組み合わせる場合があります。ROSセンサーメッセージのドキュメントでは、ロボットの各コンポーネント間で画像、カメラ情報、点群をやり取りするための共通インターフェースを定義しています。
推定における課題とデータ#
シーンフローは、ステレオ動画、RGB-Dカメラ、LiDARの連続データ、または学習済みの深度と動きの手掛かりを用いた単眼動画から導出できます。ステレオセンサーやアクティブ深度センサーはより強い幾何学的な計測情報を提供しますが、単眼システムでは視覚的な文脈からスケールを推定し、曖昧さを解消する必要があります。
よくある失敗要因には、オクルージョン、モーションブラー、反射面、テクスチャのない領域、細い構造物、照明の変化、フレーム間の高速な動きなどがあります。システムが自己運動と独立して動く物体を切り分ける必要があるため、カメラの動きもさらなる課題となります。誤差によって3D軌道が不正確になり、後段のナビゲーションシステムや衝突予測システムが速度や距離を誤って判断する可能性があります。
学習データには、RGBフレーム、深度または視差、オプティカルフロー、セグメンテーション、カメラパラメーターなどを含めることができます。Freiburgシーンフローデータセットは、これらの補完的なラベルによってジオメトリと動きをまとめて表現できることを示しています。
実践的なワークフロー#
Ultralytics YOLO26は、ドキュメントに記載されている単眼深度推定タスクを通じて、シーンフローパイプラインの深度コンポーネントを提供できます。次の例では、1フレーム分の高密度深度マップを生成します。
from ultralytics import YOLO
# シーンのピクセル単位の3D構造を推定します。
model = YOLO("yolo26n-depth.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
result.save(filename="depth_result.jpg")
print(result.depth.data.shape)このYOLO26のワークフローだけでは、シーンフローを計算できません。ピクセル単位の深度を出力し、完全なパイプラインでは連続するフレーム、時間的な対応関係、キャリブレーション済みのカメラ姿勢と組み合わせて3D変位を推定できます。実際には、特にオクルージョンや深度境界付近で、完全な動きの場を評価する前に各コンポーネントを個別に検証する必要があります。









