Optical Flow
コンピュータビジョンにおけるオプティカルフロー(光学流)の基礎を探求します。モーションベクトルがどのようにビデオ理解を促進し、Ultralytics YOLO26におけるトラッキングを強化するかを学びましょう。
オプティカルフローは、観察者とシーンの相対運動によって引き起こされる、視覚シーン内の物体、表面、エッジの見かけ上の動きのパターンです。コンピュータビジョンの分野において、この概念はビデオシーケンス内の時間的ダイナミクスを理解するために不可欠です。2つの連続するフレーム間のピクセルの変位を分析することにより、オプティカルフローアルゴリズムは、各ベクトルが特定ポイントの動きの方向と大きさを表すベクトル場を生成します。この低レベルの視覚的手がかりにより、人工知能システムは画像内にあるものだけでなく、それがどのように動いているかを認識できるようになり、静止画の分析と動的なビデオ理解の間のギャップを埋めることができます。
オプティカルフローの核心メカニズム#
オプティカルフローの計算は一般的に、輝度恒常性の仮定に基づいています。これは、物体上のピクセルの強度が、移動中であってもフレーム間で一定に保たれるという考え方です。アルゴリズムはこの原則を利用して、主に2つのアプローチでモーションベクトルを算出します。
- スパースオプティカルフロー: この手法は、特徴抽出によって検出された、コーナーやエッジなどの個別の特徴の特定の部分集合に対するモーションベクトルを計算します。Lucas-Kanade法などのアルゴリズムは計算効率が高く、特定の関心点の追跡だけで十分なリアルタイム推論タスクに最適です。
- デンセオプティカルフロー: このアプローチは、フレーム内のすべてのピクセルのモーションベクトルを計算します。計算負荷は大幅に高くなりますが、画像セグメンテーションや構造解析などの微細なタスクに不可欠な、包括的なモーションマップを提供します。近代的なディープラーニングアーキテクチャは、大規模データセットから複雑な動きのパターンを学習することにより、密なフロー推定において従来の数学的手法を上回ることがよくあります。
オプティカルフローと物体追跡の比較#
これらは組み合わせて使用されることが多いですが、オプティカルフローとオブジェクトトラッキングを区別することが重要です。オプティカルフローは、瞬時のピクセルの動きを記述する低レベルの操作であり、本質的に物体の同一性や永続性を理解するわけではありません。
対照的に、オブジェクトトラッキングは、特定のエンティティを特定し、時間の経過とともに一貫したIDを割り当てる高レベルのタスクです。Ultralytics YOLO26に統合されているものなどの高度なトラッカーは、通常、物体検出を実行して物体を見つけ、動きの手がかり(オプティカルフローから得られることもある)を使用してフレーム間で検出結果を関連付けます。オプティカルフローが「これらのピクセルは今どれくらい速く動いているか」に答えるのに対し、トラッキングは「車5号車はどこに行ったのか」に答えます。
実社会での応用#
ピクセルレベルで動きを推定する能力は、幅広い高度なテクノロジーの原動力となっています。
- 自動運転車とロボット工学: オプティカルフローは視覚オドメトリに使用され、ロボットや車が環境に対する自身の動きを推定できるようにします。また、視覚野内の物体がどれほど急速に拡大または移動しているかを分析することにより、深度推定や障害物回避を支援します。
- 動画手ブレ補正: カメラや編集ソフトウェアは、フローベクトルを使用して意図しないカメラの揺れを検出しします。このグローバルな動きを補正することにより、システムはフッテージをデジタルで安定させることができます。これは、スマートフォンやアクションカメラなどの現代の家電製品における標準機能です。
- アクション認識: スポーツ分析やセキュリティにおいて、ピクセルの時間的フローを分析することは、システムが複雑な人間の動きを識別するのに役立ちます。たとえば、四肢の動きのスピードに基づいて、歩いている人と走っている人を区別するために、姿勢推定モデルにフローデータを追加することができます。
- 動画圧縮: MPEG video codingなどの規格は、動き推定に大きく依存しています。すべての完全なフレームを保存する代わりに、コーデックはオプティカルフロー(モーションベクトル)とフレーム間の差分(残差)を保存し、ストリーミングやストレージのファイルサイズを大幅に削減します。
実装例#
次の例は、コンピュータビジョンエコシステムの標準ツールであるOpenCV libraryを使用して、デンセオプティカルフローを計算する方法を示しています。このスニペットでは、ファルネバックアルゴリズムを使用して、2つの連続するフレーム間のフローマップを生成します。
import cv2
import numpy as np
# Simulate two consecutive frames (replace with actual image paths)
frame1 = np.zeros((100, 100, 3), dtype=np.uint8)
frame2 = np.zeros((100, 100, 3), dtype=np.uint8)
cv2.rectangle(frame1, (20, 20), (40, 40), (255, 255, 255), -1) # Object at pos 1
cv2.rectangle(frame2, (25, 25), (45, 45), (255, 255, 255), -1) # Object moved
# Convert to grayscale for flow calculation
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Calculate dense optical flow
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Compute magnitude and angle of 2D vectors
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
print(f"Max motion detected: {np.max(mag):.2f} pixels")生データのピクセルモーションではなくオブジェクトの永続性を必要とする高レベルのアプリケーションでは、ユーザーはUltralytics YOLO11とYOLO26で利用可能なトラッキングモードを検討する必要があります。これらのモデルは、動き分析の複雑さを抽象化し、交通監視からリテール分析に至るまでのタスクに対して、すぐに使用できる堅牢なオブジェクトIDと軌道を提供します。






