オプティカルフローの基礎と動画解析 - 動き推定の原理から実装まで
オプティカルフローとは - 画像間の動きベクトル場
オプティカルフロー (Optical Flow) は、動画の連続する 2 フレーム間で各ピクセルがどの方向にどれだけ移動したかを表すベクトル場です。各ピクセルに (dx, dy) の 2 次元変位ベクトルが割り当てられ、シーン内の物体の動きやカメラの動きを捉えます。動画理解、動作認識、自動運転、映像編集など幅広い分野の基盤技術です。
疎なフローと密なフロー:
オプティカルフローには 2 種類あります。疎なフロー (Sparse Flow) は特徴点 (コーナーなど) のみの動きを追跡し、計算が高速です。密なフロー (Dense Flow) は全ピクセルの動きを推定し、より詳細な動き情報が得られますが計算コストが高くなります。用途に応じて使い分けます。
輝度恒常性の仮定:
オプティカルフロー推定の基本仮定は「輝度恒常性」です。あるピクセルが移動しても、その輝度値は変化しないと仮定します。数式では I(x, y, t) = I(x+dx, y+dy, t+dt) と表されます。テイラー展開により I_x × u + I_y × v + I_t = 0 という光流拘束方程式が導かれます (u, v はフロー成分、I_x, I_y, I_t は画像の偏微分)。
開口問題 (Aperture Problem):
光流拘束方程式は 1 本の式に 2 つの未知数 (u, v) を含むため、1 ピクセルだけでは解が一意に定まりません。これが開口問題です。エッジに沿った方向の動きは検出できず、エッジに垂直な方向の成分のみが推定可能です。この問題を解決するため、近傍ピクセルの情報を活用する追加の制約が必要になります。
古典的手法 - Lucas-Kanade 法と Horn-Schunck 法
オプティカルフロー推定の古典的手法として、Lucas-Kanade (LK) 法と Horn-Schunck (HS) 法が広く知られています。両者は開口問題を異なるアプローチで解決し、それぞれ疎なフローと密なフローの代表的手法となっています。
Lucas-Kanade 法 (1981):
LK 法は「局所的な一様フロー」を仮定します。小さなウィンドウ (例: 15x15 ピクセル) 内のすべてのピクセルが同じフローベクトルを持つと仮定し、最小二乗法で解きます。ウィンドウ内の n 個のピクセルから n 本の光流拘束方程式が得られ、2 つの未知数に対する過剰決定系を解きます。A^T A d = A^T b の形式で、A は空間勾配行列、b は時間勾配ベクトルです。
LK 法の特性:
LK 法はテクスチャが豊富な領域 (コーナー付近) で精度が高く、一様な領域では不安定になります。A^T A 行列の最小固有値が閾値以上の点のみを追跡対象とする Shi-Tomasi の良い特徴点選択と組み合わせるのが一般的です。ピラミッド構造 (画像を段階的に縮小) を導入することで、大きな動きにも対応できます。OpenCV の cv2.calcOpticalFlowPyrLK() がこの実装を提供しています。
Horn-Schunck 法 (1981):
HS 法は「フローの滑らかさ」をグローバルな制約として導入します。光流拘束方程式に加え、フローの空間的な変化を最小化する正則化項を追加します。エネルギー関数 E = ΣΣ[(I_x u + I_y v + I_t)² + α²(|∇u|² + |∇v|²)] を最小化する変分法で解きます。α は滑らかさの重みで、大きいほど滑らかなフローが得られます。
反復解法:
HS 法はラプラシアン演算子を用いた反復解法で計算されます。各反復で近傍の平均フローを参照しながらフローを更新し、収束するまで繰り返します。通常 100-200 回の反復で収束します。全ピクセルの密なフローが得られますが、計算コストが高く、大きな動きへの対応が困難です。
深層学習によるオプティカルフロー - FlowNet から RAFT まで
2015 年以降、深層学習ベースのオプティカルフロー推定が急速に発展し、古典的手法を大幅に上回る精度を達成しています。FlowNet、PWC-Net、RAFT と進化を続け、現在は RAFT が事実上の標準となっています。
FlowNet (2015):
CNN でオプティカルフローを直接推定する最初の手法です。FlowNetS (Simple) は 2 枚の画像を連結して入力し、エンコーダ・デコーダ構造でフローを予測します。FlowNetC (Correlation) は 2 枚の画像を別々にエンコードし、相関層 (Correlation Layer) で対応関係を計算します。Flying Chairs データセットで学習し、Sintel ベンチマークで古典的手法に匹敵する精度を達成しました。
PWC-Net (2018):
Pyramid, Warping, Cost Volume の頭文字を取った手法で、粗から細へのピラミッド構造でフローを段階的に精緻化します。前段で推定したフローで第 2 画像をワープし、ワープ後の画像と第 1 画像のコストボリュームを計算して残差フローを推定します。FlowNet の 17 分の 1 のパラメータ数で、より高い精度を達成しています。
RAFT (2020):
Recurrent All-Pairs Field Transforms の略で、現在最も高精度なオプティカルフロー推定手法です。全ピクセルペアの相関ボリュームを構築し、GRU (Gated Recurrent Unit) ベースの反復的な更新でフローを精緻化します。Sintel (clean) で EPE 1.43、KITTI 2015 で F1-all 5.10% を達成し、従来手法を大幅に上回りました。
RAFT の革新点:
- 4D 相関ボリューム: 全ピクセルペアの類似度を事前計算し、ルックアップで効率的に参照
- 反復的更新: GRU で 12-32 回反復し、段階的にフローを改善
- マルチスケール相関ルックアップ: 異なる解像度の相関情報を統合
- 学習可能な初期化: ゼロフローから開始し、反復で収束
オプティカルフローの応用 - 動作認識から映像編集まで
オプティカルフローは動画理解の基盤技術として、多様な応用分野で活用されています。動きの情報を明示的に抽出することで、動画の意味理解や編集が可能になります。
動作認識 (Action Recognition):
Two-Stream Network (Simonyan & Zisserman, 2014) は、RGB フレームとオプティカルフローを別々の CNN で処理し、動作を認識します。RGB ストリームが外観情報を、フローストリームが動き情報を捉え、両者を統合することで高い認識精度を実現します。UCF-101 データセットで 88% の精度を達成し、動き情報の重要性を実証しました。
動画フレーム補間:
オプティカルフローを使用して、2 つのフレーム間の中間フレームを生成できます。フレーム 1 からフレーム 2 へのフローを計算し、中間時刻のフローを線形補間してワープすることで、滑らかなスローモーション映像を生成します。DAIN (Depth-Aware Video Frame Interpolation) は深度情報も活用し、オクルージョン領域での補間品質を向上させています。
映像安定化 (Video Stabilization):
手持ちカメラの揺れを除去する映像安定化にもオプティカルフローが使用されます。フレーム間のグローバルな動き (カメラの動き) をフローから推定し、その逆変換を適用することで揺れを補正します。局所的な動き (物体の動き) とグローバルな動き (カメラの動き) を分離するため、RANSAC によるホモグラフィ推定が併用されます。
動画セグメンテーション:
オプティカルフローは動画オブジェクトセグメンテーション (VOS) にも活用されます。動きの一貫性を利用して、同じ物体に属するピクセルをグループ化します。フローの不連続点が物体境界に対応するため、動きベースのセグメンテーションが可能です。最近の手法では、フロー情報を Transformer ベースのセグメンテーションモデルに統合しています。
フローの可視化と評価指標
オプティカルフローの可視化と定量的評価は、手法の比較や結果の解釈に不可欠です。標準的な可視化手法と評価指標を理解することで、フロー推定の品質を正確に判断できます。
カラーホイール可視化:
オプティカルフローの標準的な可視化は、Middlebury のカラーホイールを使用します。フローの方向を色相 (Hue) で、大きさを彩度 (Saturation) で表現します。右方向は赤、上方向は緑、左方向はシアン、下方向はマゼンタで表示されます。OpenCV の cv2.cartToPolar() でフローを極座標に変換し、HSV カラースペースにマッピングします。
評価指標 - EPE (End-Point Error):
EPE は推定フローと正解フローのユークリッド距離の平均です。EPE = (1/N) Σ √((u - u*)² + (v - v*)²) で計算されます。Sintel ベンチマークでは clean と final の 2 つのパスで評価され、final パスにはモーションブラーや大気効果が含まれるためより困難です。RAFT は Sintel clean で EPE 1.43 ピクセルを達成しています。
評価指標 - Fl (Flow Error Rate):
KITTI ベンチマークで使用される指標で、EPE が 3 ピクセル以上かつ相対誤差が 5% 以上のピクセルの割合です。実用的な観点から、大きな誤差を持つピクセルの割合を評価します。RAFT は KITTI 2015 で Fl-all 5.10% を達成しています。
ベンチマークデータセット:
- Sintel: アニメーション映画から生成。大きな動き、オクルージョン、モーションブラーを含む
- KITTI: 実際の自動運転シーン。LiDAR による疎な正解フロー
- Flying Chairs: 合成データ。学習用に広く使用される
- Middlebury: 小さな動きの高精度評価。古典的手法の比較に使用
合成データ (Flying Chairs, Flying Things 3D) で事前学習し、実データ (Sintel, KITTI) でファインチューニングする 2 段階学習が標準的なプラクティスです。
実装ガイド - OpenCV と RAFT による動き推定
オプティカルフロー推定の実装を、古典的手法 (OpenCV) と深層学習手法 (RAFT) の両方で解説します。用途に応じた手法選択の指針と、実践的なコード構成を紹介します。
OpenCV による疎なフロー (Lucas-Kanade):
cv2.goodFeaturesToTrack() で追跡対象の特徴点を検出し、cv2.calcOpticalFlowPyrLK() でフレーム間の対応を計算します。ピラミッド LK 法により、最大 30 ピクセル程度の動きまで追跡可能です。追跡失敗の検出には、逆方向フロー (forward-backward check) を計算し、往復誤差が閾値以上の点を除外します。
OpenCV による密なフロー (Farneback):
cv2.calcOpticalFlowFarneback() は多項式展開に基づく密なフロー推定を提供します。パラメータとして pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5 が標準的です。リアルタイム処理が可能ですが、大きな動きや遮蔽への対応は限定的です。
RAFT の推論:
RAFT の公式実装は PyTorch で提供されています。torchvision.models.optical_flow.raft_large() で事前学習済みモデルをロードし、2 枚の画像テンソル (形状: 1x3xHxW) を入力します。出力は反復ごとのフロー予測リストで、最後の要素が最終推定です。GPU で 1080p 画像を約 100ms で処理できます。
手法選択の指針:
- リアルタイム + 疎なフロー: Lucas-Kanade (OpenCV)。特徴点追跡、AR マーカー追跡に最適
- リアルタイム + 密なフロー: Farneback (OpenCV) または RAFT-Small。動画エフェクト、簡易的な動き検出に
- 高精度 + オフライン: RAFT-Large。映像編集、研究用途、フレーム補間に最適
- 組み込み・モバイル: LiteFlowNet または PWC-Net の軽量版。エッジデバイスでの推論に