JA EN

オプティカルフローの基礎と動画解析 - 動き推定の原理から実装まで

· 約 9 分で読めます

オプティカルフローとは - 画像間の動きベクトル場

オプティカルフロー (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 の革新点:

オプティカルフローの応用 - 動作認識から映像編集まで

オプティカルフローは動画理解の基盤技術として、多様な応用分野で活用されています。動きの情報を明示的に抽出することで、動画の意味理解や編集が可能になります。

動作認識 (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% を達成しています。

ベンチマークデータセット:

合成データ (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 で処理できます。

手法選択の指針:

関連記事

特徴点マッチングの基礎 - SIFT、ORB、AKAZE の原理と実装比較

画像間の対応点を見つける特徴点マッチングを解説。SIFT、ORB、AKAZE の検出・記述アルゴリズムの違い、マッチング手法、外れ値除去までを実装例で紹介します。

画像補間法の比較 - 最近傍、バイリニア、バイキュービック、Lanczos の特性と使い分け

画像のリサイズや回転で使われる補間アルゴリズムを徹底比較。最近傍法から Lanczos まで、各手法の原理・品質・速度を実測データとともに解説します。

アルファマッティングの技術解説 - 自然画像から精密な前景抽出を実現する手法

画像マッティングの原理から最新の深層学習手法まで網羅的に解説。トライマップ、クローズドフォーム、ディープマッティングの実装と比較を詳述します。

背景透過の技術解説 - セグメンテーションとマット処理の仕組み

画像の背景透過 (背景除去) に使われる技術を解説。セマンティックセグメンテーション、トリマップベースのマット処理、エッジ検出の仕組みと精度の違いを比較します。

ステレオビジョンと距離計測 - 視差から 3D 情報を復元する技術

ステレオビジョンの原理から実装まで完全解説。エピポーラ幾何、ステレオマッチング、視差マップから距離計算までの手順をコード例とともに紹介します。

単眼深度推定の技術と応用 - 1 枚の画像から奥行きを推定する手法

単眼深度推定の原理から MiDaS、DPT などの最新モデル、自動運転や AR への応用まで、深度マップ生成技術を体系的に解説します。

関連用語