Scene Flow
シーンフローは、シーン内の可視点ごとにフレーム間の変位ベクトルを推定する、シーンの3Dモーションフィールドです。ステレオ、RGB-D、LiDARのデータから推定します。
シーンフローとは、シーンの3次元運動場です。すなわち、見えているすべての表面点について、あるフレーム内の位置から次のフレーム内の位置までを示す3Dベクトルです。カーネギーメロン大学のSundar Vedula氏、Simon Baker氏らは、1999年の論文Three-Dimensional Scene Flowでこの用語を導入し、オプティカルフローの3D版として定義しました。シーンフローは形状と動きを組み合わせるため、コンピュータービジョンシステムは各点の位置だけでなく、カメラに近づく動きや遠ざかる動きも含め、メートル単位で移動速度を把握できます。そのため、車が発進したり、人が進路に踏み込んだりする動きを認識する必要がある自動運転車やロボティクスにとって、重要な信号となります。
シーンフローとオプティカルフローの比較#
オプティカルフローは、シーンフローを画像平面に投影したものです。各ピクセルが左右または上下にどれだけ移動したかを記録しますが、カメラの視線方向に沿った動きは示しません。そのため、オプティカルフローが同じ2つの物体でも、実際には大きく異なる動きをしている可能性があります。シーンフローは、両時点の深度推定によって不足する成分を復元し、各ピクセルを視線に沿って測定された深度まで逆投影します。
import numpy as np
K_inv = np.linalg.inv(np.array([[500.0, 0, 320], [0, 500.0, 240], [0, 0, 1]])) # inverse camera intrinsics
# Two objects with identical optical flow: each moves from pixel (400, 240) to (410, 240) in 0.1 s
for name, depth_before, depth_after in [("cyclist crossing", 8.0, 8.0), ("car approaching", 8.0, 6.0)]:
# Back-project each pixel along its viewing ray to the measured depth
before = depth_before * K_inv @ np.array([400, 240, 1.0])
after = depth_after * K_inv @ np.array([410, 240, 1.0])
# Scene flow is the 3D displacement of the same surface point
flow = after - before
print(f"{name}: scene flow {flow.round(2)} m, speed {np.linalg.norm(flow) / 0.1:.1f} m/s")どちらの物体も右へ10ピクセル移動しますが、自転車に乗った人は横方向に0.16 m、速度1.6 m/sで移動する一方、車は10分の1秒間に2 m近づき、速度は20.1 m/sです。車が6 m先から20 m/sで近づく場合、0.3秒でカメラに到達します。
シーンフローは、物体の識別情報をバウンディングボックスとして追跡する物体トラッキングや、選択した2D点を複数のフレームにわたって追跡するポイントトラッキングとも異なります。Ultralytics YOLOの速度推定は、2Dのトラッキングレベルで動作します。追跡中の各ボックスを追い、視野全体で共通の1つのメートル/ピクセル尺度を使って、ピクセル変位をkm/hに変換します。この方法は、カメラが道路を見下ろし、交通が画像と平行に移動する場合に有効です。
シーンフローの推定方法#
手法は入力によって決まります。ステレオカメラでは、両時点の視差とフレーム間のオプティカルフローが得られます。これは、Moritz Menze氏とAndreas Geiger氏が2015年に公開したKITTIシーンフローベンチマークの構成で、道路シーンの学習用データ200件とテスト用データ200件が含まれます。RGB-DカメラやLiDARでは2つの点群が得られ、多くの場合、センサーフュージョンによってカメラ画像と統合されます。FlowNet3Dなどのネットワークは、点群同士の点の対応付けを直接学習します。単眼カメラでは、フレームのペアごとに学習済みの単眼深度推定とオプティカルフローを利用します。
カメラが動くと、静止点もすべて動いて見えるため、システム全体では通常、ビジュアルSLAMまたはオドメトリーを使って自己運動も推定し、それと一致しないフローを持つ点は独立して動いているものとして扱います。運転シーンの大部分は剛体で構成されるため、Menze氏とGeiger氏のObject Scene FlowやRAFT-3Dなどの手法では、ピクセルを少数の剛体運動物体にまとめます。これにより、模様の少ない車体でも推定が安定します。遮蔽は最も難しいケースです。フレーム間で現れたり消えたりする点は、測定対象となる対応点がないためです。
ディープラーニングモデルには、実際のセンサーでは取得できない密な正解データが必要なため、トレーニングでは合成データに大きく依存します。FlyingThings3Dを含むFreiburgシーンフローデータセットでは、数万件のステレオフレームをレンダリングし、正確な視差、オプティカルフロー、視差の変化を付与しています。FlyingThings3DのみでトレーニングされたFlowNet3Dは、実際のKITTI LiDARスキャンにも転移しました。
実際のアプリケーション#
- モバイルロボット: 倉庫や歩道で人と共に動くロボットは、近くの障害物の3D動作から1秒後の位置を予測し、迂回するよう経路を再計画します。
- 動的シーン再構築:4D Gaussian Splattingと動的なニューラルラディアンスフィールドは、各点またはガウスが時間とともにどのように動くかを学習することで、移動するシーンをモデル化します。学習されたシーンフローにより、録画映像を新しい視点から再生できます。
- 自動運転: LiDARシーンフローは、連続するスキャン間で動く車両や歩行者と静止した環境を分離します。Waymo Open Datasetは2021年にシーンフローラベルを追加しました。注釈付きフレーム数は、それ以前の実世界シーンフローデータセットの約1,000倍です。










